[STM32F1] stm32串口中断溢出问题

[复制链接]
2076|4
 楼主| 582981826 发表于 2016-7-21 21:35 | 显示全部楼层 |阅读模式
问题描述:
主机发送 0x55 0x04 0x02 0x06 这4个字节的数据,但是从机每次进串口中断都检查到会溢出错误标志位
并且主机发送一帧数据下面从机也只收到 0x55 0x02这两个数据。
通信方式是rs232,波特率是9600,用示波器看了波形很好,可以排除硬件故障


  1. /****************************
  2. *名称:                void USART_Config(USART_TypeDef* USARTx)
  3. *功能:                初始化串口
  4. *入口参数:                串口号
  5. *出口参数:        无
  6. *说明:                        填入需要配置的串口号即可配置该串口的参数
  7. *调用方法:        无
  8. *****************************/
  9. void USART_Config(USART_TypeDef* USARTx,u32 baud){
  10.         USART_InitTypeDef USART_InitStructure;
  11.         USART_InitStructure.USART_BaudRate = baud;                                                //速率9600bps
  12.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;                //数据位8位
  13.         USART_InitStructure.USART_StopBits = USART_StopBits_1;                        //停止位1位
  14.         USART_InitStructure.USART_Parity = USART_Parity_No;                         //偶校验
  15.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;        //无硬件流控
  16.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                                        //收发模式

  17.         USART_Init(USARTx, &USART_InitStructure);                                                 //配置串口参数函数

  18.         USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);                                        //使能接收中断
  19.         USART_DMACmd(USARTx,USART_DMAReq_Tx,ENABLE);
  20.         /* Enable the USARTx */
  21.         USART_Cmd(USARTx, ENABLE);       
  22. }
  23. void USART3_IRQHandler(void)
  24. {

  25.         if(USART_GetFlagStatus(USART3,USART_FLAG_ORE)==SET)
  26.         {
  27.                 USART_ClearFlag(USART3,USART_FLAG_ORE);
  28.                 if(count<50)
  29.                         rxb[count++]= USART_ReceiveData(USART3);
  30.                 else
  31.                         count = 0;
  32.         }
  33.         if(USART_GetFlagStatus(USART3,USART_FLAG_NE)==SET)
  34.         {
  35.                 USART_ClearFlag(USART3,USART_FLAG_NE);
  36.                 USART_ReceiveData(USART3);
  37.         }
  38.         if(USART_GetFlagStatus(USART3,USART_FLAG_FE)==SET)
  39.         {
  40.                 USART_ClearFlag(USART3,USART_FLAG_FE);
  41.                 USART_ReceiveData(USART3);
  42.         }
  43.          if(USART_GetITStatus(USART3, USART_FLAG_RXNE) == SET)           //判断读寄存器是否非空
  44.           {       
  45.                   USART_ClearITPendingBit(USART3,USART_IT_RXNE);
  46.                 // Read one byte from the receive data register
  47.                 RxBuf[RxCounter++]= USART_ReceiveData(USART3);
  48.                 if(RxBuf[0] != 0x55)        //帧头不对
  49.                         RxCounter = 0;
  50.                 if(RxCounter>=4 && RxBuf[1]==RxCounter)//接收完毕
  51.                 {
  52.                 //                RxBuf[0]=0;
  53.                         RxCounter=0;
  54.                         Rx** = 1;        //置位接收标志位
  55.                 }
  56.           }
  57.                
  58.           if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)                    
  59.           {
  60.              USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
  61.           }

  62. }

IMG_20160721_213200.jpg
icecut 发表于 2016-7-21 21:42 | 显示全部楼层
你先调没有 dma 的,没问题再加 dma.
建议你用 stm32cubemx 试试自动生成代码
 楼主| 582981826 发表于 2016-7-21 21:47 | 显示全部楼层
icecut 发表于 2016-7-21 21:42
你先调没有 dma 的,没问题再加 dma.
建议你用 stm32cubemx 试试自动生成代码

由于接受到完整的一帧数据才使用dma,所以没去管它;
另外stm32cubemx是什么东西?
airwill 发表于 2016-7-22 14:06 | 显示全部楼层
波形中可以看到确实4个数据都发出来了.
其实 9600 的波特率, 对于 STM32 来说, 根本不需要考虑 DMA 来传输.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

28

帖子

0

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