STM32F407 ADC_DMA 3通道低功耗采集配置指南
CubeMX 配置步骤
-
时钟配置
- 系统时钟:使用HSI或HSE,通过PLL配置为168MHz(最大频率)
- ADC时钟:确保不超过36MHz(建议21MHz)
- 低功耗时钟:启用LSI(32kHz)用于RTC唤醒
-
ADC 配置
- 选择ADC1(或ADC2/ADC3)
- 工作模式:
Scan Conversion Mode: EnabledContinuous Conversion Mode: Disabled(单次转换)Discontinuous Conversion Mode: Disabled
- 参数设置:
Number Of Conversion: 3External Trigger Conversion Source: Timer Trigger(如TIM2_TRGO)- 采样时间:建议15 cycles(平衡速度和精度)
- 通道分配:
- Rank 1: 通道0(PA0)
- Rank 2: 通道1(PA1)
- Rank 3: 通道2(PA2)
-
DMA 配置
- 添加DMA请求(DMA2 Stream0/4 for ADC1)
- 方向:
Peripheral To Memory - 模式:
Circular(循环模式) - 数据宽度:
Peripheral: Half WordMemory: Half Word
- 地址递增:
Memory Increment: Enabled
-
定时器触发配置(TIM2)
- 时钟源:内部时钟
- 触发输出:
Trigger Event Selection: Update Event - 预分频器:
PSC = 16800-1(10kHz @168MHz) - 计数器:
ARR = 10000-1(1Hz采样率)
-
低功耗模式配置
- 电源控制:启用
PWR外设 - 唤醒源:启用RTC唤醒中断
- NVIC设置:
- 开启TIM2中断
- 开启DMA2_Stream0中断
- 开启RTC唤醒中断
- 电源控制:启用
关键代码实现
/* 全局变量 */
volatile uint8_t adc_done = 0;
uint16_t adc_buffer[3]; // DMA存储区
/* 回调函数 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) {
adc_done = 1; // 标记转换完成
}
/* 主函数 */
int main(void) {
HAL_Init();
SystemClock_Config();
MX_ADC1_Init();
MX_DMA_Init();
MX_TIM2_Init();
HAL_TIM_Base_Start(&htim2); // 启动定时器
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, 3); // 启动ADC-DMA
while (1) {
if (adc_done) {
// 处理数据(示例:求和)
uint32_t sum = adc_buffer[0] + adc_buffer[1] + adc_buffer[2];
adc_done = 0;
// 进入停止模式(等待RTC唤醒)
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
SystemClock_Config(); // 唤醒后重新配置时钟
}
}
}
低功耗优化策略
-
电源模式选择
- 运行模式:采集时全速运行(<1ms)
- 停止模式:采集间隙进入
STOP模式(功耗~20μA) - 唤醒源:RTC定时唤醒(如1秒间隔)
-
外设管理
// 进入停止模式前 HAL_ADC_Stop_DMA(&hadc1); HAL_TIM_Base_Stop(&htim2); // 唤醒后恢复 HAL_TIM_Base_Start(&htim2); HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, 3); -
时钟优化
- 停止模式下关闭高速时钟
- 使用MSI(内部低速时钟)维持RTC
- 唤醒后自动切回PLL时钟
注意事项
-
DMA冲突避免
- 确保DMA缓冲区大小匹配通道数
- 使用
__HAL_DMA_DISABLE(&hdma_adc1)安全停止DMA
-
ADC校准
HAL_ADCEx_Calibration_Start(&hadc1); // 上电后校准 -
功耗测试
- 运行模式:~20mA @168MHz
- 停止模式:~20μA(关闭所有外设)
- 转换期间:增加~1mA(12位分辨率)
完整工程需在CubeMX中生成后添加低功耗逻辑,实测功耗可能因PCB设计略有差异。建议使用STOP模式+RTC唤醒组合实现最优功耗平衡。
2703

被折叠的 条评论
为什么被折叠?



