Tôi đang cố gắng học cách sử dụng thư viện HAL "mới" từ stm32.
Khi tôi cố gắng thực hiện chuyển đổi ADC đơn giản, nó chỉ hoạt động một lần, nhưng sau đó nó dừng chuyển đổi. Tôi cho rằng cờ kết thúc chuyển đổi không được đặt. Tôi đang sử dụng bảng STM32f429I Discovery, có STM32f429ZI trên tàu.
Lưu ý rằng tôi biết về việc chạy nước rút là thực hành tồi và làm cho adc bị gián đoạn là tốt hơn, tôi biết rằng, xin vui lòng không chỉ ra, điều này không liên quan đến câu hỏi, tôi chỉ đang thử nghiệm HAL ở đây.
Vì vậy, câu hỏi là tại sao cờ EOC không được đặt hoặc tôi có thể làm gì để làm cho nó hoạt động? Googling không giúp được gì nhiều vì rất ít tài liệu hay về HAL ngoài kia.
Đây là mã:
__IO uint16_t ADCValue=0;
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);
int main(void)
{
char str[15];
/* Various initializations */
HAL_ADC_Start(&hadc1);
while (1)
{
if (HAL_ADC_PollForConversion(&hadc1, 1000000) == HAL_OK)
{
ADCValue = HAL_ADC_GetValue(&hadc1);
sprintf(str, "%d", ADCValue);
BSP_LCD_DisplayStringAt(130,30, (uint8_t*)str, LEFT_MODE);
}
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
ADCValue = HAL_ADC_GetValue(&hadc1);
}
Tôi cũng đã tạo dự án với CubeMX, cấu hình adc như sau:
EDIT 1
Tôi đã cố gắng gỡ lỗi mọi thứ và có vẻ như chương trình bị kẹt khi kiểm tra cờ EOC - nó thấy rằng nó không được hiển thị và do đó vấn đề hẹn giờ chờ EOC xuất hiện (nhưng nó không bao giờ được đặt) Đây là mã nơi nó bị mắc kẹt trong trình gỡ lỗi:
/* Check End of conversion flag */
while(!(__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC)))
{
/* Check for the Timeout */
if(Timeout != HAL_MAX_DELAY)
{
if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
{
hadc->State= HAL_ADC_STATE_TIMEOUT;
/* Process unlocked */
__HAL_UNLOCK(hadc);
return HAL_TIMEOUT;
}
}