串列埠1中斷服務函式的解析

2021-08-03 09:55:46 字數 1630 閱讀 4039

//串列埠1中斷服務函式的解析

void usart1_irqhandler(void)                

u8 res;

if(usart_getitstatus(usart1, usart_it_rxne) != reset)//接收到的資料必須是0x0d 0x0a結尾,reset=0

else//還沒接收到0x0d

}}  

} //

typedef enum flagstatus, itstatus;//reset=0;

//u16 usart_rx_sta=0;//接收狀態標記

/// 當接收到從電腦發過來的資料,把接收到的資料儲存在 usart_rx_buf 中,

同時在接收狀態暫存器(usart_rx_sta)中計數接收到的有效資料個數,當

收到回車(回車的表示由 2 個位元組組成:0x0d 和 0x0a)的第乙個位元組 0x0d 

時,計數器將不再增加,等待0x0a 的到來,而如果 0x0a 沒有來到,則認為

這次接收失敗,重新開始下一次接收。如果順利接收到 0x0a,則標記 usart_rx_sta 

的第 15 位,這樣完成一次接收,並等待該位被其他程式清除,從而開始下一次的接收,

而如果遲遲沒有收到 0x0d,那麼在接收資料超過 usart_rec_len 的時候,則會

丟棄前面的資料,重新接收。

計算機向串列埠傳送一串字元,一般不止乙個,例如傳送」abcdefg回車「。那麼串列埠中斷

函式會執行9次,回車要執行兩次串列埠中斷。

當串列埠中斷函式第一次執行時,usart1->dr裡面裝的是字元a,下面以串列埠第一次執行來分析這

個串列埠中斷函式。

if(usart_getitstatus(usart1, usart_it_rxne) != reset);//這是判斷讀資料暫存器是否空,因為接受到了a,所以不是空的,這個判斷成立。

res =usart_receivedata(usart1);//(usart1->dr); 既然接受到了字元a,那麼就要把他讀取出來

if((usart_rx_sta&0x8000)==0);//因為現在接受的是第乙個字元,所以接收肯定沒有完成,usart_rx_sta還是它的初始化值,於是第15位還是0,

這個判斷語句成立。於是要執行下面這句話

if(usart_rx_sta&0x4000) ;// usart_rx_sta的第14位仍然是0,所以這個判斷不成立,所以會執行下面這句話   

if(res==0x0d);//當然這個判斷也不成立,所以要執行下面這句話

usart_rx_buf[usart_rx_sta&0x3fff]=res ;//計算出接收的是第幾個字元,然後裝到快取裡面

//0x3fff=0011 1111 1111 1111

usart_rx_sta++;//加1表明已經接收好了幾個資料

面試題之二 中斷服務函式

中斷問題也是面試嵌入式崗位時,面試官比較喜歡拷問的問題之一,作為乙個嵌入式開發人員,自然少不了與中斷打交道,裸機程式中作為前台服務程式,發揮著重要的作用。中斷服務函式應該注意的四大點 1.中斷服務函式不能傳入引數 2.中斷服務函式不能有返回值 3.中斷服務函式應做到短小精悍 4.不要在中斷函式中使用...

Linux2 6 中斷處理函式和申請中斷函式的變化

linux2.6 中斷處理函式和申請中斷函式的變化 2009 07 29 08 46 今天練習了中斷。linux裝置驅動開發技術及應用 作者使用的是2.6.4,現在看來也很古老了,按照書上的例子,免不了很多錯。例如 裡 自己定義的中斷處理函式 irqreturn t int interrupt in...

51微控制器 中斷1 中斷整體介紹

外部中斷請求源 即外部中斷0 和1,經由外部引腳引入,在微控制器上有兩個引腳,外稱為int0 int1,也就是p3.2 p3.3這兩個引腳 mcs51 微控制器內部的中斷模組在每個cpu週期都查詢各個中斷源的狀態,當其發生預期的中斷事件時,通知cpu將程式跳轉到中斷服務程式所在的程式儲存器 rom ...