你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 1863|回复: 0

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

[复制链接]

52

主题

3313

回帖

61

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2018-11-14 22:27:17 | 显示全部楼层 |阅读模式
本帖最后由 数码小叶 于 2018-11-14 22:27 编辑

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

Snipaste_2018-11-12_10-13-48.jpg


然后选择触发源
Snipaste_2018-11-12_10-15-51.jpg


Snipaste_2018-11-12_10-23-41.jpg

然后打开定时器时钟,内部时钟
Snipaste_2018-11-12_10-21-07.jpg

接下来配置定时器
Snipaste_2018-11-12_10-48-59.jpg

这里的参数完全根据自己的时间需要来更改。首先参考F446的时钟树,但是F446的时钟树描述的并不是很详细,参考下面的小字描述 Snipaste_2018-11-12_13-13-45.jpg
其实这个就是和cubeMax配置界面相对应的
Snipaste_2018-11-12_13-16-46.jpg
但是到这还是看不出TIM2挂在哪个总线上了,还得继续往下
Snipaste_2018-11-12_13-07-51.jpg
到这就可以了,挂载在APB1上(同时可以发现TIM1和TIM8挂载在更高速的APB2上)
Snipaste_2018-11-12_13-20-35.jpg
再看TIM2的分频寄存器描述
Snipaste_2018-11-12_10-38-15.jpg
所以这里分频89+1,90,即90MHz/(89+1)最后是1MHz,然后由计数周期确定最后频率,这里为20Hz。保存,生成工程,打开,添加两句启动代码:
  1. HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 2);
  2.         HAL_TIM_Base_Start_IT(&htim2 );
复制代码

如果用定时器,根据自己的中断类型选择相应的处理函数,比如我用的
  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)  
  2. {  
  3.                 HAL_ADC_Start(&hadc1);
  4.           HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_Value, 2);
  5. //                printf("Time is out");
  6. }
复制代码
具体用哪个,已经在void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)里写的很详细了
Snipaste_2018-11-12_15-36-54.jpg


最后,利用串口输出结果
Snipaste_2018-11-12_10-57-35.jpg





回复

使用道具 举报

关于 意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版