在上個文章基礎上改用事件組進行處理,以便實時任務。
stm32cubeMX自動生成代碼
osEventFlagsId_t adctestEventHandle;
const osEventFlagsAttr_t adctestEvent_attributes = {.name = "adctestEvent"
};adctestEventHandle = osEventFlagsNew(&adctestEvent_attributes);
編寫代碼DMA回調函數觸發事件
#define ADC2_CONVERSION_COMPLETE_BIT 0x01
#define ADC3_CONVERSION_COMPLETE_BIT 0x02void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc) {if (hadc->Instance == ADC2) // 確認是ADC2的轉換完成{osEventFlagsSet(adctestEventHandle, ADC2_CONVERSION_COMPLETE_BIT);HAL_ADC_Stop_DMA(&hadc2);} else if (hadc->Instance == ADC3) // 確認是ADC3的轉換完成{osEventFlagsSet(adctestEventHandle, ADC3_CONVERSION_COMPLETE_BIT);HAL_ADC_Stop_DMA(&hadc3);}
}
事件觸發邏輯處理
void AdcTask(void *argument)
{Start_ADC2_DMA();Start_ADC3_DMA();int i = 0;uint32_t ret = 0;float voltage;for (;;) {ret = osEventFlagsWait(adctestEventHandle, ADC2_CONVERSION_COMPLETE_BIT | ADC3_CONVERSION_COMPLETE_BIT, osFlagsWaitAny, osWaitForever);if ((ret & ADC2_CONVERSION_COMPLETE_BIT) != 0){/* 打印ADC2數據 */for (i = 0; i < hadc2.Init.NbrOfConversion; i++) {voltage = adc2_values[i] * VEF / VEFVALUE;printf("ADC2[%d] = %d.%dV\r\n", i, (uint32_t) voltage,(uint32_t) (voltage * 100) % 100);}printf("\n");}if ((ret & ADC3_CONVERSION_COMPLETE_BIT) != 0){/* 打印ADC3數據 */for (i = 0; i < hadc3.Init.NbrOfConversion; i++) {voltage = adc3_values[i] * VEF / VEFVALUE;printf("ADC3[%d] = %d.%dV\r\n", i, (uint32_t) voltage,(uint32_t) (voltage * 100) % 100);}printf("\n\n");}osDelay(1);}
}