MPC5607B串列埠接收中斷程式

2021-09-07 19:36:03 字數 1494 閱讀 4694

最近做乙個innovation專案時碰到串列埠接收中斷的問題困擾了好久,終於找到知道原因了。專案用到的晶元是nxpmpc5607b,與乙個指紋模組通過串列埠進行資料傳輸。在已有的autosar架構的專案的**中加入指紋模組**,另外需要對串列埠進行正確的配置,才能完成最終的功能。串列埠接收中斷

根據解讀晶元手冊,配置串列埠需要先配置sui埠,pctl暫存器,然後配置linflex相關暫存器。因為這款晶元,串列埠uart和lin是結合在一起的,因此配置時需要設定uart模式,然後配置波特率等。直接附上串列埠配置**:

void linflex1_init(uint16_t baudrate)

break;

case 19200:

break;

case 38400:

break;

case 57600:

break;

case 115200:

break;

default:

break;

} linflex_1.linier.b.drie = 1; // enable the receive interrupt

linflex_1.uartsr.b.drf = 1; // clear the receive data complete flag

linflex_1.uartsr.b.dtf = 1; // clear the transmit data complete flag

= 0x01; // set the interrupt priority as 1

linflex_1.lincr1.b.init = 0; // change to normal mode

}

串列埠初始化結束後,接著是編寫中斷函式,中斷函式非常簡單,就是從暫存器中讀取接受的資料存到乙個資料快取arrar_uart中,接收完需要清除接收完成標誌位drf。

void uart1_isrfunc(void) 

__asm("    e_lis  r0,%hi( uart1_isr_cat2c)");

__asm("    e_or2i       r0,%lo( uart1_isr_cat2c)");

設定中斷函式的入口位址,由於中斷函式在osek任務排程同一管理,下面的uart1_isr_cat2c即是osek中的中斷函式,此處可以直接替換成中斷函式uart1_isrfunc。

尤其要注意的是設定中斷優先順序的這段

__asm("   e_add16i   r31, r31, 26");     /* prio 1 for uart1_isr */

__asm("   e_add16i   r30, r30, 0");

__asm("   e_stb    r30, 0(r31)");

否則中斷會被其他的中斷搶占,而導致進不了中斷函式,在除錯過程中,之前**沒有設定優先順序,從而導致中斷函式一直進不去。

串列埠接收標誌位語句 串列埠程式設計中,如何設定標誌位

1級2011 08 25 回答 你好樓主,前一陣正好研究了一下linux串列埠程式設計,苦惱了一陣,不過總算弄通了,下面說一下我的思路和理解。struct termios state 這是乙個設計到串列埠屬性的結構體,通過給結構體內的屬性賦值來設計串列埠 的一些屬性。tcgetattr stdin ...

樹莓派3b接收USB串列埠資料並解析處理

通過樹莓派3b使用wiringpi接收串列埠資料,並對幀頭幀尾進行判斷,解析出符合幀協議的資料。我們在這裡定義串列埠資料的幀頭為 0x3a 0x3b,幀尾為 0x7e 0x7f,一幀最大的長度為 10個位元組。幀頭幀尾格式可自行更改。最大幀長度 define maxframelength 10 對最...

C 中Invoke的串列埠接收事件中的用法

在用.net framework框架的winform構建gui程式介面時,如果要在串列埠serilport控制項的datareceived事件響應函式中改變控制項的狀態,直接更改會報錯,可以使用invoke 解決。例如 this.invoke new action invoke 的作用是 在應用程式...