STM32 USART 普通串口應(yīng)用,調(diào)試總結(jié)
程序剛初始化時(shí),
本文引用地址:http://m.butianyuan.cn/article/201611/318059.htm//設(shè)置為發(fā)送使能,接收使能
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
//值開啟接收中斷。
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
在接收到數(shù)據(jù)后,把手冊(cè)拷貝到發(fā)送緩沖區(qū),然后開啟發(fā)送
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--;
}
中斷中發(fā)送處理函數(shù)如下
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); //關(guān)閉發(fā)送中斷
}
}
}
目前應(yīng)用的目的,是設(shè)備接收到什么串口數(shù)據(jù),就返回什么數(shù)據(jù),就這種模式得到的情況是,每次發(fā)送數(shù)據(jù)都會(huì)少最后一個(gè)字節(jié)
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)
后來解決了這個(gè)問題。需要注意幾個(gè)關(guān)鍵點(diǎn),就能避免這個(gè)問題。
1.開啟USART_ITConfig(USART1,USART_IT_TXE, ENABLE);時(shí),就會(huì)立刻進(jìn)入發(fā)送數(shù)據(jù)寄存器為空中斷。所以void USART_Start_Send_Data(USART_TypeDef* USARTx,sCommBufType *psCommBuf)中的USART_SendData(USARTx,*g_sUsart1Buf.pu8Tx_ptr++);
g_sUsart1Buf.u16TxLen--;可以去掉,直接在中斷里面處理。否則會(huì)打亂中斷處理數(shù)據(jù)的順序。
2.開啟中斷前一定要先清除響應(yīng)的中斷標(biāo)志位,否則可能出現(xiàn)一些不想要的數(shù)據(jù),對(duì)于多次運(yùn)行時(shí),可能性比較大。
3.中斷里面不要按照發(fā)送完成中斷才傳輸數(shù)據(jù),因?yàn)檫@樣會(huì)造成進(jìn)入中斷的時(shí)間變長,因?yàn)樗鹊?strong>移位寄存器中的數(shù)據(jù)發(fā)送完成后才進(jìn)行中斷??梢园凑誙SART_IT_TXE進(jìn)入中斷發(fā)送數(shù)據(jù),等到最后一個(gè)數(shù)據(jù)時(shí)關(guān)閉USART_IT_TXE中斷,然后打開USART_IT_TC中斷。這樣既能保證進(jìn)入中斷的時(shí)間短,也能保證最后一個(gè)數(shù)據(jù)即使在關(guān)掉串口時(shí)能真正傳送出去。
評(píng)論