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

查看: 1940|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版