我想仅在其中一个通道上的电压超过特定限制后才在 ADC1 块的 2 个常规通道上启动 ADC 转换,因此我使用了看门狗功能。
触发看门狗后,我需要存储每个通道的 5 个结果值。这是我到目前为止的相关代码和平:
- void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef *hadc)
- {
- HAL_ADC_Stop_IT(&hadc1); // stop watchdog interrupts
- uint32_t adc_values[10] = {0};
- HAL_ADC_Start_DMA(&hadc1, adc_values, 10); // read values from each channel after a watchdog has been triggered
- HAL_ADC_Stop_DMA(&hadc1); // prevents continuous overwriting
- uint32_t A4_val = 0;
- uint32_t A5_val = 0;
- A4_val = adc_values[1]; // values from channel A4
- A5_val = adc_values[0]; // values from channel A5
- printf("A4 channel value is %lun", A4_val);
- printf("A5 channel value is %lun", A5_val);
- A4_val = adc_values[3];
- A5_val = adc_values[2];
- printf("A4 channel value is %lun", A4_val);
- printf("A5 channel value is %lun", A5_val);
- A4_val = adc_values[5];
- A5_val = adc_values[4];
- printf("A4 channel value is %lun", A4_val);
- printf("A5 channel value is %lun", A5_val);
- A4_val = adc_values[7];
- A5_val = adc_values[6];
- printf("A4 channel value is %lun", A4_val);
- printf("A5 channel value is %lun", A5_val);
- A4_val = adc_values[9];
- A5_val = adc_values[8];
- printf("A4 channel value is %lun", A4_val);
- printf("A5 channel value is %lun", A5_val);
- printf("--------------n");
- }
问题是此代码仅在达到某个采样时间值时有效,如果我将其增加到最大值,则 DMA 开始混淆通道之间的值甚至输出 0。
看起来我遗漏了什么,谁能告诉我如何正确地将看门狗与 DMA 结合起来?