Saya mencoba mempelajari cara menggunakan perpustakaan HAL "baru" dari stm32.
Ketika saya mencoba melakukan konversi ADC sederhana, ia berfungsi hanya satu kali, tetapi kemudian berhenti konversi. Saya kira Bendera akhir konversi tidak disetel. Saya menggunakan papan Discovery STM32f429I, yang memiliki board STM32f429ZI.
Perhatikan bahwa saya tahu tentang sprintf menjadi praktik buruk dan membuat adc dengan interupsi lebih baik, saya tahu bahwa, tolong jangan tunjukkan, ini tidak relevan dengan pertanyaan, saya hanya menguji HAL di sini.
Jadi pertanyaannya adalah mengapa bendera EOC tidak disetel atau apa yang bisa saya lakukan untuk membuatnya berfungsi? Googling tidak banyak membantu karena sangat sedikit materi bagus tentang HAL di luar sana.
Ini kodenya:
__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);
}
Saya juga membuat proyek dengan CubeMX, konfigurasi adc adalah sebagai berikut:
EDIT 1
Saya mencoba men-debug semuanya dan tampaknya program macet untuk memeriksa bendera EOC - ia melihat bahwa itu tidak ditampilkan dan karena itu mengeluarkan timer menunggu EOC muncul (tetapi tidak pernah disetel) Berikut adalah kode di mana ia macet di debugger:
/* 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;
}
}