Ben stm32 "yeni" HAL kütüphanesi kullanmayı öğrenmek için çalışıyorum.
Basit ADC dönüşümü yapmaya çalıştığımda sadece bir kez çalışıyor, ama sonra dönüşmeyi durduruyor. Sanırım dönüşüm sonu bayrağı ayarlanmadı. Gemide STM32f429ZI olan STM32f429I Keşif panosunu kullanıyorum.
Sprintf'in kötü uygulama olduğunu biliyorum ve kesinti ile adc yapmak daha iyi, biliyorum, lütfen işaret etmeyin, bu soru ile ilgili değil, sadece HAL'ı burada test ediyorum.
Soru şu: EOC bayrağı neden ayarlanmadı ya da çalışması için ne yapabilirim? Google'da HAL hakkında çok az iyi malzeme olduğu için googling çok yardımcı olmuyor.
İşte kod:
__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);
}
Ayrıca CubeMX ile proje oluşturdum, adc yapılandırma aşağıdaki gibidir:
EDIT 1
Her şeyi hata ayıklamaya çalıştım ve program EOC bayrağı için kontrol sıkışmış gibi görünüyor - gösterilmiyor ve bu nedenle EOC görünmesini bekleyen zamanlayıcı sorunları (ama asla ayarlanmıyor) İşte burada kodu hata ayıklayıcıda takılı kalıyor:
/* 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;
}
}