[STM32F1] 串口启用DMA接收数据时,如何判断中断由哪个中断源触发

[复制链接]
1902|1
 楼主| yangbo18416 发表于 2015-12-22 16:08 | 显示全部楼层 |阅读模式
本帖最后由 yangbo18416 于 2015-12-22 16:38 编辑

小弟在这里想请教大家个问题。现在我想利用usart1的错误帧作为某个信号的起始标志。因此我做出如下设置,在usart1->CR3中设置了DMAR标志位以及EIE位(参考手册上说,FE错误帧不会触发中断,但配置了DMAR以及EIE位后,若出现FE错误,也会引起中断),其他设置按照正常串口通讯设置。具体如下
  1. void UART0_init(u32 Frq)
  2. {
  3.       u16 x1=0;                                                                        //频率计算的整数部分12位
  4.       u16 x2=0;                                                                        //频率计算的小数部分04位
  5.       RCC->APB2ENR |= 0X00004005;                                     //打开AFIOEN复用端口时钟+GPIOA端口时钟+USART1开关
  6.       GPIOA->CRH &= ~(0x00000FF0);                                //复位GPIOA09-GPIOA10号引脚寄存器
  7.       GPIOA->CRH |= 0x0000000B0;                                        //设置GPIOA09为第二功能上拉输出50MHz
  8.       GPIOA->CRH |= 0x000000800;                                        //设置GPIOA10为浮空输入
  9.       GPIOA->ODR |= 0x0000003<<9;                                  //设置为上拉输出或者上拉输入时,需要往对应的输出寄存器内写入1
  10.       //波特率为9600bps;8位长度;1个停止位,无校验;禁用硬件流控制;禁止USART时钟;
  11.         //时钟极性低;在第2个边沿捕获数据;最后一位数据的时钟脉冲不从SCLK输出
  12.        switch (Frq)
  13.             {
  14.                     case 2400  :{x1=1875;x2=0;  break;}
  15.                     case 9600  :{x1=468 ;x2=12; break;}
  16.                     case 19200 :{x1=234 ;x2=6;  break;}
  17.                     case 57600 :{x1=78  ;x2=2;  break;}
  18.                     case 115200:{x1=39  ;x2=1;  break;}
  19.                     case 250000:{x1=18 ;x2=0;  break;}
  20.                     default          :{x1=468 ;x2=12;        break;}
  21.              }
  22.           USART1->BRR  = x1<<4;                                                   //设置BRR波特率寄存器,低4位存放小数部分
  23.           USART1->BRR |= x2;
  24.           USART1->CR1 |= 0X00002020;                                          //使能USART,8位数据长度,使能接收发送,开启接收中断
  25.           USART1->CR2 |= 0X00002000;                                          //00-2个停止位,时钟极性低
  26.           USART1->CR3 |= 0X00000041;                                                //开启DMA接收模式+错误中断使能。这样就能在错误帧出现时触发中断
  27.          USART1->CR1 |= 0X0000000C;                                          //使能接收、发送
  28.                
  29. }
DMA1的配置如下
  1. //DMA初始化操作
  2. void DMA_Initial(void)
  3.         {
  4. //配置要求:1、内存和外设数据宽度,均设置为8位宽;2,、内存地址选择自增,外设地址不递增;3、DMA优先级为高;4、通道模式为外设到内存
  5. //  5、不开启DMA传输完成中断,6、使用DMA1的通道5---该通道对应着USART1 的 RX接收
  6.           DMA1_Channel5->CCR |=0x0000<<14;                       //非存储器到存储器
  7.           DMA1_Channel5->CCR |=0x0002<<12;                       //通道优先级为高
  8.           DMA1_Channel5->CCR |=0x00000<<10;                     //存储器数据宽度为8位
  9.           DMA1_Channel5->CCR |=0x0000<<8;                         //外设数据宽度为8位
  10.           DMA1_Channel5->CCR |=0x0001<<7;                        //存储器地址执行增量操作
  11.           DMA1_Channel5->CCR |=0x0000<<6;                         //外设地址不执行增量操作
  12.           DMA1_Channel5->CCR |=0x0000<<5;                         //不执行循环操作
  13.           DMA1_Channel5->CCR |=0x0000<<4;                        //数据传输方向为从外设读
  14.           DMA1_Channel5->CCR |=0x0001<<1;                       //允许传输完成中断
  15.           DMA1_Channel5->CNDTR|=513;                                  //待传输数据的长度
  16.           DMA1_Channel5->CMAR =(u32)DMX512_data;            //设置存储器地址
  17.           DMA1_Channel5->CPAR =(u32)0x40013800+0x004;   //写入外设地址-USART->DR的地址,或者自己查表(0X40013800+0X04);
  18.           DMA1_Channel5->CCR |=0x01;                                     //启动DMA                        
  19.         }
通过以上配置后,打开串口,人为设置RX低电平,系统会进入中断函数,且相关关键字如下
1.jpg
点击下一步后,相关标志位自动消失了。导致无法判断FE帧错误标志位
2.jpg
请问各位,是不是我配置上有问题啊,或者说有没有更好的方法来实现我的要求(能够判断FE位)。
 楼主| yangbo18416 发表于 2015-12-22 21:37 | 显示全部楼层
自己顶自己顶
您需要登录后才可以回帖 登录 | 注册

本版积分规则

215

主题

241

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部