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

请大家帮我判断下对ADC DMA回调函数的理解是否正确

[复制链接]
sun0727 提问时间:2017-9-14 23:09 /
本帖最后由 sun0727 于 2017-9-15 01:14 编辑

前提是 ADC1 的扫描数据由 DMA1 的 CH1 传送,ADC2 的扫描数据由 DMA1 的 CH2 传送;

  1. // ADC1 和 DMA CH1 先开始
  2. HAL_ADC_Start_DMA(&ADC1_Handle,(uint32_t *)ADC1_ConvertedData, ADC1_CONVERTED_DATA_BUFFER_SIZE);
  3. HAL_ADC_Start_DMA(&ADC2_Handle,(uint32_t *)ADC2_ConvertedData, ADC2_CONVERTED_DATA_BUFFER_SIZE);
  4.   
  5. void DMA1_Channel1_IRQHandler(void)
  6. {
  7.   HAL_DMA_IRQHandler(&ADC1_DMA_Handle);
  8. }
  9.   
  10. void DMA1_Channel2_IRQHandler(void)
  11. {
  12.   HAL_DMA_IRQHandler(&ADC2_DMA_Handle);
  13. }
  14.   
  15.   
  16. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
  17. {
  18.   
  19.         if(hadc->Instance==ADC1)
  20.         {
  21.   
  22.         }
  23.         else if(hadc->Instance==ADC2)
  24.         {        
  25.   
  26.   
  27.         }
  28. }
复制代码

在以上代码中是不是 首先启动了 ADC1 的扫描 --> DMA1 Channel1 传送数据一轮完后 ---> 触发 DMA1 Channel1 的中断 --> 进入中断回调函数的 if 部分
但是结束完回调函数后,不管 DMA1 的 CH1 的优先级 是否比 DMA1 的 CH2 优先级高,都会重新 ADC1 的扫描,ADC2 的扫描永远不会进行,自然也不会 DMA1 CH2 的中断


现在改变代码一下,首先 start DMA1_CH2 并且去掉 DMA1 CH2 的中断服务程序
  1. // ADC2 和 DMA CH2 先开始
  2. HAL_ADC_Start_DMA(&ADC2_Handle,(uint32_t *)ADC2_ConvertedData, ADC2_CONVERTED_DATA_BUFFER_SIZE);
  3. HAL_ADC_Start_DMA(&ADC1_Handle,(uint32_t *)ADC1_ConvertedData, ADC1_CONVERTED_DATA_BUFFER_SIZE);
  4.   
  5. void DMA1_Channel1_IRQHandler(void)
  6. {
  7.   HAL_DMA_IRQHandler(&ADC1_DMA_Handle);
  8. }
  9.   
  10. /*注释ch2的中断服务程序*/
  11. //void DMA1_Channel2_IRQHandler(void)
  12. //{
  13. //  HAL_DMA_IRQHandler(&ADC2_DMA_Handle);
  14. //}
  15.   
  16.   
  17. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
  18. {
  19.   
  20.         if(hadc->Instance==ADC1)
  21.         {
  22.   
  23.         }
  24.         else if(hadc->Instance==ADC2)
  25.         {        
  26.   
  27.   
  28.         }
  29. }
复制代码


现在的程序顺序是不是
先执行 ADC2 扫描 --> 扫描第一轮结束,由于没有中断 执行 ADC1 的扫描 -->ADC1 的数据经过 DMA1 CH1 运送一轮后进入 CH1 的中断并执行中断回调函数
--> 回调函数结束后,不管 CH1 的优先级如何,都会先执行 ADC2 的扫描和 CH2 的传输(是因为 start ADC_DMA_Start CH2 在 CH1 之前?)--> 重复之前的步骤这种情况下 ADC1 和 ADC2 都能持续工作

因为我之前一直以为中断程序是哪里中断,中断服务程序完后回到哪里,但是这里好像是回到 谁先 用了 HAL_ADC_Start_DMA。。
大家帮忙判断下

收藏 评论1 发布时间:2017-9-14 23:09

举报

1个回答
sun0727 回答时间:2017-9-16 18:50:54
自己顶一下

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版