打印
[STM32F1]

stm32串口中断溢出问题

[复制链接]
1819|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
问题描述:
主机发送 0x55 0x04 0x02 0x06 这4个字节的数据,但是从机每次进串口中断都检查到会溢出错误标志位
并且主机发送一帧数据下面从机也只收到 0x55 0x02这两个数据。
通信方式是rs232,波特率是9600,用示波器看了波形很好,可以排除硬件故障


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

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

        USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);                                        //使能接收中断
        USART_DMACmd(USARTx,USART_DMAReq_Tx,ENABLE);
        /* Enable the USARTx */
        USART_Cmd(USARTx, ENABLE);       
}
void USART3_IRQHandler(void)
{

        if(USART_GetFlagStatus(USART3,USART_FLAG_ORE)==SET)
        {
                USART_ClearFlag(USART3,USART_FLAG_ORE);
                if(count<50)
                        rxb[count++]= USART_ReceiveData(USART3);
                else
                        count = 0;
        }
        if(USART_GetFlagStatus(USART3,USART_FLAG_NE)==SET)
        {
                USART_ClearFlag(USART3,USART_FLAG_NE);
                USART_ReceiveData(USART3);
        }
        if(USART_GetFlagStatus(USART3,USART_FLAG_FE)==SET)
        {
                USART_ClearFlag(USART3,USART_FLAG_FE);
                USART_ReceiveData(USART3);
        }
         if(USART_GetITStatus(USART3, USART_FLAG_RXNE) == SET)           //判断读寄存器是否非空
          {       
                  USART_ClearITPendingBit(USART3,USART_IT_RXNE);
                // Read one byte from the receive data register
                RxBuf[RxCounter++]= USART_ReceiveData(USART3);
                if(RxBuf[0] != 0x55)        //帧头不对
                        RxCounter = 0;
                if(RxCounter>=4 && RxBuf[1]==RxCounter)//接收完毕
                {
                //                RxBuf[0]=0;
                        RxCounter=0;
                        Rx** = 1;        //置位接收标志位
                }
          }
               
          if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)                    
          {
             USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
          }

}

IMG_20160721_213200.jpg (437.46 KB )

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

粉丝