打印
[STM32F1]

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

[复制链接]
1550|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 yangbo18416 于 2015-12-22 16:38 编辑

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

点击下一步后,相关标志位自动消失了。导致无法判断FE帧错误标志位

请问各位,是不是我配置上有问题啊,或者说有没有更好的方法来实现我的要求(能够判断FE位)。
沙发
yangbo18416|  楼主 | 2015-12-22 21:37 | 只看该作者
自己顶自己顶

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

215

主题

241

帖子

2

粉丝