OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5241|回复: 3

用hal库实现ADC+DMA中断关闭ADC分享

[复制链接]

3

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2018-1-30
在线时间
44 小时
发表于 2019-7-9 17:22:00 | 显示全部楼层 |阅读模式
最近用hal库做ADC+DMA,想在DMA传输完成后停止ADC,考虑用DMA的传输完成中断做
2019-07-09_165829.jpg
开DMA传输完成中断:__HAL_DMA_ENABLE_IT(&hdma_adc1, DMA_IT_TC);
开全局中断:
  /* DMA2_Stream0_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);            

想法没问题,但找不到中断判断函数

注意到 DMA结构体中有下面标红的函数句柄,应该配置它可以
typedef struct __DMA_HandleTypeDef
{
  DMA_Stream_TypeDef         *Instance;                                                    /*!< Register base address                  */
  DMA_InitTypeDef            Init;                                                         /*!< DMA communication parameters           */
  HAL_LockTypeDef            Lock;                                                         /*!< DMA locking object                     */  
  __IO HAL_DMA_StateTypeDef  State;                                                        /*!< DMA transfer state                     */
  void                       *Parent;                                                      /*!< Parent object state                    */  
  void                       (* XferCpltCallback)( struct __DMA_HandleTypeDef * hdma);     /*!< DMA transfer complete callback         */
  void                       (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma); /*!< DMA Half transfer complete callback    */
  void                       (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma);   /*!< DMA transfer complete Memory1 callback */
  void                       (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma);    /*!< DMA transfer error callback            */
__IO uint32_t               ErrorCode;                                                    /*!< DMA Error code                         */
uint32_t                    StreamBaseAddress;                                            /*!< DMA Stream Base Address                */
uint32_t                    StreamIndex;                                                  /*!< DMA Stream Index                       */
}DMA_HandleTypeDef;

基本结构为
hdma_adc1.XferCpltCallback = END_Conv;

END_Conv为传输完成的函数名
传输完成,关闭ADC函数:
void END_Conv(DMA_HandleTypeDef *hdma)
{
        ADC_DMA_DeInit();                                        //传输完成,关闭函数       
}


一切都没错,然后居然不行!!!!
得重新查问题啊
全工程搜索了一下XferCpltCallback,发现它已经有一个回调函数
/**
  * @brief  DMA transfer complete callback.
  * @param  hdma: pointer to a DMA_HandleTypeDef structure that contains
  *                the configuration information for the specified DMA module.
  * @retval None
  */
static void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma)   
{
  ADC_HandleTypeDef* hadc = ( ADC_HandleTypeDef* )((DMA_HandleTypeDef* )hdma)->arent;

  /* Check if an injected conversion is ready */
  if(hadc->State == HAL_ADC_STATE_EOC_INJ)
  {
    /* Change ADC state */
    hadc->State = HAL_ADC_STATE_EOC_INJ_REG;  
  }
  else
  {
    /* Change ADC state */
    hadc->State = HAL_ADC_STATE_EOC_REG;
  }  
  HAL_ADC_ConvCpltCallback(hadc);
}

HAL_ADC_ConvCpltCallback(hadc); 是以_weak函数声明的,可以直接复制后重新定义
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
  /* Prevent unused argument(s) compilation warning */
                ADC_DMA_DeInit();                                        //传输完成,关闭函数
  /* NOTE : This function Should not be modified, when the callback is needed,
            the HAL_ADC_ConvCpltCallback could be implemented in the user file
   */
}

也就是我指定的END_Conv函数被ADC_DMAConvCplt给覆盖了,问题得到解决!
参考链接:http://www.stm32cube.com/article/37

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-7-9 20:20:40 | 显示全部楼层
回复 支持 反对

使用道具 举报

10

主题

212

帖子

0

精华

高级会员

Rank: 4

积分
745
金钱
745
注册时间
2019-4-8
在线时间
226 小时
发表于 2019-7-12 15:38:21 | 显示全部楼层
感谢 分享
回复 支持 反对

使用道具 举报

4

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2020-11-14
在线时间
15 小时
发表于 2020-11-19 23:22:04 | 显示全部楼层
您好,我看了您的DMA中断后的贴子发现还是实现不了开启中断的功能,可以看下您的源码吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 03:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表