1. 程式人生 > >微控制器在清除標誌位時不要用位操作

微控制器在清除標誌位時不要用位操作

       這兩天在除錯一個專案的時候,一臺主機與兩臺從機通訊,但是有一臺從機的報文收不到,仔細閱讀程式碼,發現暫存器等配置都正常,自信閱讀程式碼發現在清接收完成暫存器的時候用到了位域,猜想這就是問題所在,於是修改了程式,下載後一切正常。在微控制器中一般的標誌暫存器都是寫1清0,好多中斷標誌等都是這樣設計的,這時候就要注意在清除標誌的時候不能用位域,因為好多微控制器不不支援位操作的。

        比如要清除IrqReg暫存器的BIT5,IrqReg.bit5 = 1;在沒有位操作的微控制器中會編譯成

IrqReg |= BIT5;這條語句分三步執行,先讀IrqReg暫存器,進行位或操作,最後把位或的結果寫入該暫存器,這樣問題就產生了,如果這句操作之前IrqReg中BIT5和BIT6都是置位的,那麼寫的時候本來是清除BIT5的現在BIT6也清除了,正確的操作應該是IrqReg=BIT5

        這個問題在最開始學習AVR微控制器的時候在AVR的技術手冊中看到過,所以這次解決這個問題沒有費太大的周折,要不然真是很難想到這裡會出問題。