在上个文章基础上改用事件组进行处理,以便实时任务。

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 0x02
void 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);
}
}