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

关于定时器触发ADC+DMA连续采样的问题

[复制链接]
网络孤客 提问时间:2022-7-17 16:17 / 已解决
硬件:
STM32F103C8T6
目标:
1、定时采样,根据当前采样结果决定下一步的操作
2、为降低MCU工作负担,决定采取定时器定时触发ADC+DMA,在ADC回调函数中进行判断
问题:
目前只能做到,通过定时器中断,激活ADC_DMA。是否能不需要定时器中断,自动一直定时ADC_DMA?

设置如下:
1.jpg

2.jpg
4.jpg
3.jpg

volatile uint16_t ADC_ConvertedValue;                        //ADC采样的数据

main()
{
  ...
  HAL_TIM_Base_Start_IT(&htim2);
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
  HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_ConvertedValue, 1);
  ...
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim==&htim2)
  {

    HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC_ConvertedValue, 1);    //目前需要定时激活ADC,目标想不需要这语句
  }
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{

  //这里对每一个ADC_ConvertedValue值进行判断和处理
}

1.jpg
收藏 评论5 发布时间:2022-7-17 16:17

举报

5个回答
网络孤客 最优答案 回答时间:2022-7-18 10:34:38
解决了,把DMA初始化移到ADC前
批注 2022-07-18 103005.jpg

比较怪,再CUBEMX中无法调整顺序
批注 2022-07-18 102926.jpg
xmshao 回答时间:2022-7-17 20:27:19
按你目前的代码写法,ADC是否由定时器触发已经无所谓了,因为你总是在定时器中断里来启动一次ADC转换。如果你希望使用定时器触发的话,将ADC的启动配置为定时器触发,ADC的转换事件触发DMA传输,这样的话,那句DMA启动函数在主程序里即可,无须在定时器中断里反复启动。ADC的每次启动交给定时器事件触发,比方更新事件。
网络孤客 回答时间:2022-7-18 09:37:45
xmshao 发表于 2022-7-17 20:27
按你目前的代码写法,ADC是否由定时器触发已经无所谓了,因为你总是在定时器中断里来启动一次ADC转换。如果 ...

我是希望总是在定时器中断里来启动一次ADC转换,但第一次启动后,后续没再启动。
xmshao 回答时间:2022-7-19 12:04:49
网络孤客 发表于 2022-7-18 09:37
我是希望总是在定时器中断里来启动一次ADC转换,但第一次启动后,后续没再启动。
...

嗯,你希望那样就无可厚非。

的确,DMA配置这个地方有时挺隐蔽的,基于Cubemx配置时要注意下这个地方,DMA初始化放在前面,
否则后面配置涉及DMA时的初始化无法生效。
网络孤客 回答时间:2022-7-20 08:57:40
xmshao 发表于 2022-7-19 12:04
嗯,你希望那样就无可厚非。

的确,DMA配置这个地方有时挺隐蔽的,基于Cubemx配置时要注意下这个地方,D ...

我为这个已耗了不少时间,希望官方能彻底解决CUBEMX这个问题,几年前官方已发现了DMA+串口通信类似问题。


关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版