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;
}
}
sumber
#define ADC_EOC_SEQ_CONV ((uint32_t)0x00000000)
yang sama dengan dinonaktifkan, jadi dinonaktifkan sebenarnya adalah ADC_EOC_SEQ_CONV.Hm ... Saya menemukan beberapa tutorial yang menggunakan HAL_ADC_Stop (& hadc1) untuk mengakhiri konversi ... Saya melihat tutorial ini sebelumnya dan berpikir bahwa ini adalah cara yang agak biadab, sepertinya ini menonaktifkan ADC sepenuhnya, jadi saya pikir seharusnya ada metode yang berbeda. Tapi sepertinya, ini benar-benar berfungsi dengan baik.
Selamat datang untuk mengirim jawaban jika ada cara yang lebih elegan untuk melakukan ini, karena saya pikir menggunakan HAL_ADC_Stop () cukup buruk, tetapi dapat digunakan untuk tujuan pembelajaran.
sumber
Saya ingin menambahkan bahwa untuk pengaturan saya (nucleo-h743) itu tidak cukup untuk mengatur:
Saya juga harus mengaktifkan pengaturan overrun juga:
Tanpa ini, HAL_ADC_PollForConversion masih memblokir. Saya tidak sepenuhnya mengerti mengapa ini perlu tapi itu memungkinkan saya untuk polling dalam mode berkelanjutan.
sumber
Ini bekerja untuk saya, semoga akan membantu:
sumber