最近做乙個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 的作用是 在應用程式...