LPC2138串列埠中斷總結

2021-06-07 20:15:31 字數 937 閱讀 1884

lpc2138的串列埠帶有16位元組的接收和傳送fifo,並且接收fifo的觸發點可設為1,4,8,14位元組。

1)接收

當接收到的位元組數達到設定的觸發點(通過fcr暫存器設定)時,就會產生接收中斷;而當接收到的位元組數未能達到設定的觸發點(比如觸發點設定為14,但是只接收到了10個位元組的資料),那麼經過短暫的等待時間後會產生超時中斷。在這兩種情況下需要正確讀取rbr暫存器,妥善儲存接收到的資料。

舉例來說,假設接收fifo的觸發點設定為14,而要接收的資料一共有16位元組。那麼接收過程中會產生兩次中斷:第一次是當接收到第14個位元組時產生的接收中斷;之後只剩2個位元組要接收,達不到觸發點14,所以經過等待時間後會產生超時中斷。

中斷服務程式裡,對於這兩種中斷可進行如下的處理(假設使用uart1):

switch (u1iir & 0x0e)

2)傳送

傳送fifo並沒有觸發點的問題。要傳送資料時,首先把資料寫入thr暫存器,之後mcu會將其移入傳送fifo緩衝區中,一旦thr暫存器被移空,就會產生傳送中斷。換句話說,在使能了傳送中斷的情況下,每向thr暫存器寫乙個位元組就會引起一次傳送中斷。所以要傳送一系列的資料時,只需要傳送第乙個位元組來啟動傳送過程,剩餘的位元組由中斷服務程式來完成就可以了。

假設send_length為要傳送的總位元組數,程式中的處理如下:

u1thr = txd_buffer[0];

index = 1;

void __irq uart1_isp(void)                           // 中斷服務程式}}

個人覺得,使能傳送中斷會導致mcu的工作效率變低。因為一旦thr暫存器為空就會進入中斷服務程式,會出現連續的無效中斷。(如果理解有錯誤,還請指正)

在不使能傳送中斷的情況下,可用查詢方式實現以上的傳送過程:

int i;

for (i = 0; i < send_length; i++)

STM32串列埠中斷方式接收

經過除錯在stm32f101cbt6中實現通訊。注意還要配乙個ttl轉usb介面,才能進行通訊。實現字串回發 include stm32f10x it.h include stm32f10x conf.h void rcc configuration void 時鐘配置 void usart con...

STM32 串列埠中斷裡面使用printf 出現錯誤

串列埠收發中斷處理函式 void uart trxover interrupt void if usart getitstatus usart1,usart it rxne set 就是在這個裡面,包含了printf就無法全部回傳傳送的資訊 但是將printf 注釋掉以後,傳送什麼資訊過去,就會回傳...

串列埠中斷進行傳輸陣列資料和字串

這是乙個大致框架,首先我們開啟串列埠,然後將u16型別的資料放入u8型別的rec data裡。看下後面綠字備註,可以知道 s e 分別代表協議中的開始與結束符,最下面那個判斷是說傳輸的資料位元組在0 uart3 rec num之間時執行。也就是說我們正常的執行順序為if裡的函式,再進行第二個else...