STM32軟件仿真的一個注意點


最近才做的板子由於自己的粗心把串口線搞反了,還好只有兩條,飛線解決,而且現在還只是樣板,但是還是應該引以為戒,以后做硬件一定要謹慎。

今天同事出差把CAN分析儀拿走了,本來在開發板上調試好的程序不知為何移植到板子上以后CAN突然不能發送數據了,恰好今天沒法用硬件調試,只能用軟件仿真了。除了CAN部分在主函數前還有和USART相關的操作,起初我苦思冥想也沒想到這能有什么錯,之前用開發板的時候串口和CAN都可以用。昨天僅僅把串口1移植到了串口2,盡管這兩個串口不在同一個總線上,但是想起來和CAN八竿子打不着,怎么也不應該影響CAN呀。后來實在沒辦法了注釋掉了main函數中while(1)之前串口發送的語句,意外地發現CAN部分終於發送數據了。

       這是怎么回事?太奇怪了啊。沒辦法,單步調試,當進入串口發送函數時發現了這么一句:

 while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);

     繼續執行,卻會發現始終在這一句循環,也就是說函數不能返回。當然無法進入while循環發送CAN數據了,難怪之前只要把CAN的初始化部分放在USART發送函數之后,就會看到CAN一直處於sleep狀態。這是為什么呢?看芯片手冊:

      TC標志位是在數據發送完成后由硬件置位的,而且庫中已經定義了typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;

所以循環回無法跳出,也就沒法執行發送函數之后的操作了。當然同理,用以下的循環語句來判斷數據是否轉移到移位寄存器也是不能跳出循環的。

       while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET );

      可以看出,由硬件自動進行操作的寄存器位的判斷在軟件仿真時都不能放在while循環中判斷,否則會出現死循環,無法執行后面的操作。謹記,今天竟然犯了這么一個小錯誤,汗一個!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM