關(guān)于STM32利用硬件仿真串口中斷處理函數(shù)應(yīng)注意的問題
我們在利用jlink或其他仿真器對串口中斷處理函數(shù)的數(shù)據(jù)接收進行仿真時,如果在中斷函數(shù)中設(shè)置了斷點,我們向串口發(fā)送數(shù)據(jù)端會采用逐個字節(jié)發(fā)送而不能采用一次性發(fā)送多個字節(jié),當(dāng)然從廣義上來講,你一次發(fā)那么多字節(jié)我在斷點處程序已經(jīng)停止了再運行肯定你的數(shù)據(jù)我會丟失啊,所以需要逐個字節(jié)發(fā)送這是可以理解的。而我這里講的是如果你一次發(fā)送多個字節(jié)將會導(dǎo)致什么后果的問題.
假設(shè)1:假如你的斷點設(shè)置在res = USART_ReceiveData(USART1)之后,以下面發(fā)送的這串字符為例,那么實際上當(dāng)你停到斷點處看到接收到fe時由于DR寄存器之前已經(jīng)清空,實際上01已經(jīng)存到DR中了,這時你運行會再次運行到這個斷點,即受到了fe 和01兩個字符,接下來再運行就不會再停止了,因為后面數(shù)據(jù)已丟失。
假設(shè)2:假設(shè)你的斷點在res = USART_ReceiveData(USART1)之前,你會發(fā)現(xiàn)如果你仍發(fā)送這串?dāng)?shù)據(jù)那么你的程序第一次接收到fe后再運行再發(fā)什么數(shù)據(jù)都接收不到了,并且主函數(shù)也是不運行的,點擊停止要么仍在中斷中,要么在USART_GetITStatus()某處。查看手冊你p523頁關(guān)于溢出錯誤的解釋你就會明白在EXNE未清除之前再來數(shù)據(jù)會導(dǎo)致溢出錯誤的?。?!這樣會導(dǎo)致程序始終陷入中斷中??!可通過接口USART_GetFlagStatus(USART1,USART_IT_ORE)進行驗證
這才是調(diào)試串口中斷處理函數(shù)不能一下發(fā)送一串字符的原因!!而不僅僅是數(shù)據(jù)會丟失問題