数码小叶 发表于 2018-11-14 22:27:17

cubeMAX配置双通道ADC+dma(二)定时器触发

本帖最后由 数码小叶 于 2018-11-14 22:27 编辑

虽然在上一篇中已经实现了ADC的采集,但是在实际应用中还是有很大的缺陷,那就是采样率,太高了,实际需求是几十Hz,所以还得采用定时器来。
试了很多配置,最后成功了两组,一组是定时器中断函数里触发ADC,一组是定时器直接触发ADC,不涉及中断函数。第一组方法有很多种,只要产生中断就可以了,可以是普通定时中断,比较中断,pwm中断。。。。
参考第一篇,知道这里ADC的配置要做更改



然后选择触发源





然后打开定时器时钟,内部时钟


接下来配置定时器


这里的参数完全根据自己的时间需要来更改。首先参考F446的时钟树,但是F446的时钟树描述的并不是很详细,参考下面的小字描述
其实这个就是和cubeMax配置界面相对应的

但是到这还是看不出TIM2挂在哪个总线上了,还得继续往下

到这就可以了,挂载在APB1上(同时可以发现TIM1和TIM8挂载在更高速的APB2上)

再看TIM2的分频寄存器描述

所以这里分频89+1,90,即90MHz/(89+1)最后是1MHz,然后由计数周期确定最后频率,这里为20Hz。保存,生成工程,打开,添加两句启动代码:
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 2);
      HAL_TIM_Base_Start_IT(&htim2 );
如果用定时器,根据自己的中断类型选择相应的处理函数,比如我用的
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
                HAL_ADC_Start(&hadc1);
          HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 2);
//                printf("Time is out");
}
具体用哪个,已经在void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)里写的很详细了



最后,利用串口输出结果






页: [1]
查看完整版本: cubeMAX配置双通道ADC+dma(二)定时器触发