STM32 USART 普通串口应用,调试总结

来源:互联网 发布:网络400电话价格 编辑:程序博客网 时间:2024/05/01 07:56

配置STM32L151CBT6,在普通串口模式。当初没有好好看数据手册,只是看着别人的例子写出来一个程序,虽然效果出来了,但不明白其中一些问题的道理,带着这些问题,问了同事,得到的答案,确实最低级的错误。这说明看数据手册的重要性。看程序和问题如下

程序刚初始化时,

//设置为发送使能,接收使能

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

//值开启接收中断。

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

在接收到数据后,把手册拷贝到发送缓冲区,然后开启发送

void USART_Start_Send_Data(USART_TypeDef* USARTx,sCommBufType *psCommBuf)
{
    USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);
psCommBuf->pu8Tx_ptr = psCommBuf->au8TxBuf;
    USART_SendData(USARTx,*g_sUsart1Buf.pu8Tx_ptr++);
    g_sUsart1Buf.u16TxLen--;
}

中断中发送处理函数如下

void USART1_IRQHandler(void)
{

if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
    {   
        //USART_ClearITPendingBit(USART1, USART_IT_TXE);
        //g_sUsart1Buf.u16TxLen--;
        //g_sUsart1Buf.pu8Tx_ptr++;
        if((g_sUsart1Buf.u16TxLen != 0) && (g_sUsart1Buf.pu8Tx_ptr < &g_sUsart1Buf.au8TxBuf[TX1_BUFFLEN-1])) 
        {
            USART_SendData(USART1, *g_sUsart1Buf.pu8Tx_ptr++);
g_sUsart1Buf.u16TxLen--;
        }
        else 
        {
            USART_ITConfig(USART1, USART_IT_TXE, DISABLE);   //关闭发送中断
        }
    }
}

目前应用的目的,是设备接收到什么串口数据,就返回什么数据,就这种模式得到的情况是,每次发送数据都会少最后一个字节

TX:68 AA AA AA AA AA AA 68 13 00 DF 16 (09:59:55:759)
RX00:68 AA AA AA AA AA AA 68 13 00 DF (09:59:55:917)

后来解决了这个问题。需要注意几个关键点,就能避免这个问题。


1.开启USART_ITConfig(USART1, USART_IT_TXE, ENABLE);时,就会立刻进入发送数据寄存器为空中断。所以void USART_Start_Send_Data(USART_TypeDef* USARTx,sCommBufType *psCommBuf)中的USART_SendData(USARTx,*g_sUsart1Buf.pu8Tx_ptr++);
    g_sUsart1Buf.u16TxLen--;可以去掉,直接在中断里面处理。否则会打乱中断处理数据的顺序。

2.开启中断前一定要先清除响应的中断标志位,否则可能出现一些不想要的数据,对于多次运行时,可能性比较大。

3.中断里面不要按照发送完成中断才传输数据,因为这样会造成进入中断的时间变长,因为它要等到移位寄存器中的数据发送完成后才进行中断。可以按照USART_IT_TXE进入中断发送数据,等到最后一个数据时关闭USART_IT_TXE中断,然后打开USART_IT_TC中断。这样既能保证进入中断的时间短,也能保证最后一个数据即使在关掉串口时能真正传送出去。



0 0