您的位置 首页 方案

STM32 USART 一般串口使用,调试总结

配置STM32L151CBT6,在普通串口模式。当初没有好好看数据手册,只是看着别人的例子写出来一个程序,虽然效果出来了,但不明白其中一些问题…

装备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中止。这样既能确保进入中止的时刻短,也能确保最终一个数据即便在关掉串口时能真实传送出去。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/277471.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部