CubeMX 实现 STM32F407 ADC_DMA3 通道:低功耗模式下的采集配置

STM32F407 ADC_DMA 3通道低功耗采集配置指南

CubeMX 配置步骤
  1. 时钟配置

    • 系统时钟:使用HSI或HSE,通过PLL配置为168MHz(最大频率)
    • ADC时钟:确保不超过36MHz(建议21MHz)
    • 低功耗时钟:启用LSI(32kHz)用于RTC唤醒
  2. ADC 配置

    • 选择ADC1(或ADC2/ADC3)
    • 工作模式:
      • Scan Conversion Mode: Enabled
      • Continuous Conversion Mode: Disabled(单次转换)
      • Discontinuous Conversion Mode: Disabled
    • 参数设置:
      • Number Of Conversion: 3
      • External Trigger Conversion Source: Timer Trigger(如TIM2_TRGO)
      • 采样时间:建议15 cycles(平衡速度和精度)
    • 通道分配:
      • Rank 1: 通道0(PA0)
      • Rank 2: 通道1(PA1)
      • Rank 3: 通道2(PA2)
  3. DMA 配置

    • 添加DMA请求(DMA2 Stream0/4 for ADC1)
    • 方向:Peripheral To Memory
    • 模式:Circular(循环模式)
    • 数据宽度:
      • Peripheral: Half Word
      • Memory: Half Word
    • 地址递增:Memory Increment: Enabled
  4. 定时器触发配置(TIM2)

    • 时钟源:内部时钟
    • 触发输出:Trigger Event Selection: Update Event
    • 预分频器:PSC = 16800-1(10kHz @168MHz)
    • 计数器:ARR = 10000-1(1Hz采样率)
  5. 低功耗模式配置

    • 电源控制:启用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();  // 唤醒后重新配置时钟
    }
  }
}

低功耗优化策略
  1. 电源模式选择

    • 运行模式:采集时全速运行(<1ms)
    • 停止模式:采集间隙进入STOP模式(功耗~20μA)
    • 唤醒源:RTC定时唤醒(如1秒间隔)
  2. 外设管理

    // 进入停止模式前
    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);
    

  3. 时钟优化

    • 停止模式下关闭高速时钟
    • 使用MSI(内部低速时钟)维持RTC
    • 唤醒后自动切回PLL时钟
注意事项
  1. DMA冲突避免

    • 确保DMA缓冲区大小匹配通道数
    • 使用__HAL_DMA_DISABLE(&hdma_adc1)安全停止DMA
  2. ADC校准

    HAL_ADCEx_Calibration_Start(&hadc1);  // 上电后校准
    

  3. 功耗测试

    • 运行模式:~20mA @168MHz
    • 停止模式:~20μA(关闭所有外设)
    • 转换期间:增加~1mA(12位分辨率)

完整工程需在CubeMX中生成后添加低功耗逻辑,实测功耗可能因PCB设计略有差异。建议使用STOP模式+RTC唤醒组合实现最优功耗平衡。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值