OpenEdv-开源电子网

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

使用DMA进行ADC双通道采样,串口接收到数据后进入串口中断,字符数组缓存串口接收到的数据,只能接收到第一个字符

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-1-7
在线时间
3 小时
发表于 2016-1-7 18:51:02 | 显示全部楼层 |阅读模式
1金钱
STM32F103 开启了串口中断,且字符串收发正常。现在使用DMA将ADC双通道采样的数据传到内存空间,供主函数调用。现在的现象是能进入串口中断,但是只能接收到第一个字符,采用查询方式从串口接受单个字符时可以成功进行ADC双通道采样,改用串口中断后出现了以上现象。求大神指点啊,在线等!谢谢PS:注释掉DMA配置中带红色背景的命令时串口中断收发正常,去掉注释后只能接收到第一个字符串口中断函数为:(字符串以$开头*结尾)
[mw_shl_code=c,true]void USART1_IRQHandler(void)
{
if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
                {
                        if(startf==1)
                        {
                                if(USART_ReceiveData(USART1)=='$')
                                {
                                        Recevedflag=0;
                                        RxCounter=0;
                                        flag=1;
                                }
                        }
                        if(flag)
                        {
                                UARTBuffer[RxCounter]=USART_ReceiveData(USART1);
                                RxCounter++;
                                startf=0;
                                if((USART_ReceiveData(USART1))=='*')       
                                {
                                        flag=0;
                                        UARTBuffer[RxCounter]='\r';
                                        RxCounter-=1;
                                        Recevedflag=1;
                                        startf=1;
                                        USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
                                }
                        }
                        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
                }          
}[/mw_shl_code]

主函数中的while循环:
[mw_shl_code=c,true]        while(1        )
        {       
         printf("\r\n 接收到的字符串为%s \r\n",UARTBuffer);
                        SensorData ();//传感器数据
                }
        }[/mw_shl_code]

DMA配置:
[mw_shl_code=c,true]void DMA_Configuration(void)
{                  
          DMA_InitTypeDef DMA_InitStructure;
           
           DMA_DeInit(DMA1_Channel1);
          DMA_InitStructure.DMA_PeripheralBaseAddr  =  ADC1_DR_Address;//外设地址
          DMA_InitStructure.DMA_MemoryBaseAddr  =   (u32)&AD_Value;//内存地址
          DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA 单向传输方式
          //BufferSize=2,因为 ADC 转换序列有 2 个通道
          DMA_InitStructure.DMA_BufferSize = 2;
          DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//设置DMA 外设递增模式
          DMA_InitStructure.DMA_MemoryInc  =  DMA_MemoryInc_Enable;  //设置DMA 内存递增模式
          DMA_InitStructure.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_HalfWord;//外设字长
          DMA_InitStructure.DMA_MemoryDataSize  = DMA_MemoryDataSize_HalfWord;//内存地址
          //循环模式开启,Buffer 写满后,自动回到初始地址开始传输
          DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;   //  设置传输模式连续不断的循环模式
          DMA_InitStructure.DMA_Priority = DMA_Priority_High;//设置 DMA 优先级
          DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//   设置 DMA 的 2 个memory 中的变量互相访问
           DMA_Init(DMA1_Channel1, &DMA_InitStructure);
         //配置完成后,启动 DMA 通道         
                  DMA_Cmd(DMA1_Channel1, ENABLE);
} [/mw_shl_code]

ADC配置:
[mw_shl_code=c,true]void ADC_Configuration(void)
{
        /* 定义 ADC 初始化结构体 ADC_InitStructure */
        ADC_InitTypeDef ADC_InitStructure;
       
        /* 配置ADC时钟分频 */
        RCC_ADCCLKConfig(RCC_PCLK2_Div4);

        /*       
        *        独立工作模式;
        *        多通道扫描模式;
        *        连续模数转换模式;
        *        转换触发方式:转换由软件触发启动;
        *        ADC 数据右对齐 ;
        *        进行规则转换的 ADC 通道的数目为2;
        */
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_NbrOfChannel = 2;
        ADC_Init(ADC1, &ADC_InitStructure);
       
        /* 设置 ADC1 使用8转换通道,转换顺序1,采样时间为 55.5 周期 */
        ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_55Cycles5);
        ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_55Cycles5);
         /* Enable ADC1 DMA */
        ADC_DMACmd(ADC1, ENABLE);

        /* 使能 ADC1 */
        ADC_Cmd(ADC1, ENABLE);
        /* 复位 ADC1 的校准寄存器 */   
        ADC_ResetCalibration(ADC1);
        /* 等待 ADC1 校准寄存器复位完成 */
        while(ADC_GetResetCalibrationStatus(ADC1));
        /* 开始 ADC1 校准 */
        ADC_StartCalibration(ADC1);
        /* 等待 ADC1 校准完成 */
        while(ADC_GetCalibrationStatus(ADC1));
        /* 启动 ADC1 转换 */
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);       
  }[/mw_shl_code]

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

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-1-7
在线时间
3 小时
 楼主| 发表于 2016-1-7 20:11:37 | 显示全部楼层
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//   设置 DMA 的 2 个memory 中的变量互相访问----注释掉DMA配置中该命令时串口中断收发正常,去掉注释后只能接收到第一个字符,不知道串口中断受到什么影响了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-1-7 22:24:34 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-1-7
在线时间
3 小时
 楼主| 发表于 2016-1-7 23:18:45 | 显示全部楼层

使用DMA进行ADC双通道采样时,串口中断需要注意什么吗?只进行串口中断数据收发时完全没有问题,好纳闷啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-1-7 23:50:55 | 显示全部楼层
251259786 发表于 2016-1-7 23:18
使用DMA进行ADC双通道采样时,串口中断需要注意什么吗?只进行串口中断数据收发时完全没有问题,好纳闷啊

可以参考下论坛其他网友的帖子.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 22:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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