OpenEdv-开源电子网

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

HAL库DMA中断和ADC连续转换问题

[复制链接]

3

主题

12

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2018-10-10
在线时间
8 小时
发表于 2018-12-5 21:02:22 | 显示全部楼层 |阅读模式
1金钱
想实现的功能是:ADC双通道连续采样,通过DMA把值存到一个长度为700的数组里面,然后把值通过串口发送到电脑
我设想实现的方案是:开启ADC扫描模式和连续转换模式,DMA中断,等到采样350次后会进入DMA中断,然后在中断里面失能DMA并给标志位置1,再在主程序中判断标志位后发送数值,再使能DMA,可是这个过程过后发现无法再次进入DMA中断而且ADC也不再采样,请问这是为什么呀?
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{

        HAL_DMA_DeInit(&UART1TxDMA_Handler);
        finish_flag=1;
}
//主函数里面的判断 if(finish_flag==1)
                        {  
                                HAL_DMA_Init(&UART1TxDMA_Handler);
                                get_adc();
                                finish_flag=0;
                        }
void get_adc()
{       
          ADC1_Handler.Instance->DR=ADC1_Handler.Instance->DR;
          HAL_ADC_Start_DMA(&ADC1_Handler,(uint32_t*)&buffer,700);
}


我尝试的解决方案:如果我不失能DMA的话,则能一直进入DMA中断,AD采样也不会停,或者如果我再中断函数中失能DMA再马上使能DMA,则中断依然能够正常工作
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
        HAL_DMA_DeInit(&UART1TxDMA_Handler);  
        HAL_DMA_Init(&UART1TxDMA_Handler);
        get_adc();
        finish_flag=1;
}
真的感觉很奇怪,不知道为什么在中断里面关掉DMA再打开就不会出问题但是如果在中断关掉在主函数里面打开就会出问题

PS:ADC配置代码
void ADC_RegularChannelConfig(ADC_HandleTypeDef *AdcHandle, uint32_t Channel, uint32_t Rank, uint32_t SamplingTime)
{
    ADC_ChannelConfTypeDef ADC1_ChanConf;      
         
    ADC1_ChanConf.Channel      = Channel;                               //通道
    ADC1_ChanConf.Rank         = Rank;                                  //第几个序列
    ADC1_ChanConf.SamplingTime = SamplingTime;                          //采样时间

    HAL_ADC_ConfigChannel(AdcHandle,&ADC1_ChanConf);                    //通道配置
}


//初始化ADC
//ch: ADC_channels
//通道值 0~16取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_16
void MY_ADC_Init(void)
{
    ADC1_Handler.Instance=ADC1;
    ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频,ADCCLK=PCLK2/4=90/4=22.5MHZ
    ADC1_Handler.Init.Resolution=ADC_RESOLUTION_12B;             //12位模式
    ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐
    ADC1_Handler.Init.ScanConvMode=ENABLE;                      //扫描模式
    ADC1_Handler.Init.EOCSelection=DISABLE;                      //关闭EOC中断
    ADC1_Handler.Init.ContinuousConvMode=ENABLE;                //开启连续转换
    ADC1_Handler.Init.NbrOfConversion=2;                         //1个转换在规则序列中 也就是只转换规则序列1
    ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;             //禁止不连续采样模式
    ADC1_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0
    ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;       //软件触发
    ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_RISINGFALLING;//使用软件触发
    ADC1_Handler.Init.DMAContinuousRequests=ENABLE;             //开启DMA请求
    HAL_ADC_Init(&ADC1_Handler);                                 //初始化
       
          ADC_RegularChannelConfig(&ADC1_Handler, ADC_CHANNEL_5, 1, ADC_SAMPLETIME_28CYCLES);
    ADC_RegularChannelConfig(&ADC1_Handler, ADC_CHANNEL_6, 2, ADC_SAMPLETIME_28CYCLES);
       
}


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

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2018-10-10
在线时间
8 小时
 楼主| 发表于 2018-12-5 21:15:34 | 显示全部楼层
我使用HAL_ADC_Stop_DMA和HAL_ADC_Start_DMA函数又可以了。。。好迷啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 21:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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