發表文章

目前顯示的是 1月, 2018的文章

NUC200 NUC220接收&處理GPS之資料

圖片
透過MCU的UART接收GPS的資料,然後透過字串處理解讀NMEA GPRMC #include "stdlib.h" #include "stdio.h" #include "string.h" #include "NUC200Series.h" #define PLL_CLOCK 48000000 char gps_data[512] = { 0 }; int flag = 0; struct { char _gprmc[10]; char utc_time[10]; char status[10]; char latitude_value[10]; char latitude[10]; char longtitude_value[10]; char longtitude[10]; char speed[10]; char azimuth_angle[10]; char utc_date[10]; char declination_value[10]; char declination[10]; char check_sum[10]; } gprmc = { 0 }; void SYS_Init(void) { /*---------------------------------------------------------------------------------------------------------*/ /* Init System Clock */ /*---------------------------------------------------------------------------------------------------------*/ /* Enable Internal RC 22.1184MHz clock */ CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);

Nuvoton NUC200 NUC220使用FIFO觸發中斷及接收超時中斷處理UART接收的資料

圖片
NUC200NUC220_BSP當中所提供之UART_Read(uart, pu8RxBuf, u32ReadBytes)函式屬於輪詢方式,接收緩衝器為空時這個函式就會在原地等待,屆時CPU沒辦法做其他事情。本篇介紹使用中斷的方式處理UART接收到的資料。 在這邊我們使用到UART兩個中斷源,分別是"接收資料可用中斷"及"接收超時中斷"。 接收資料可用中斷的發生條件為,當接收到的位元組大於等於所設定之閥值發生,而閥值可由UART->FCR[7:4] RFITL設定1Byte、4Bytes、8Bytes、14Bytes、30Bytes、46Bytes及62Bytes。在這邊要注意,NUC220的UART0才有提供到64Bytes的接收緩衝區,UART1及UART2只提供了16Bytes的接收緩衝區,當閥值設定超過14Bytes則以14Bytes為準。清除接收資料可用中斷的中斷旗標只要讀取RBR即可。 接收超時中斷的發生條件為,當超時計數器的值大於等於超時比較器(UART->TOR[7:0] TOIC)的值發生接收超時中斷。超時計數器在每一個Byte進來時會歸零並且開始計時,而計數器的時脈等於Baudrate,所以建議將TOIC設定在40~255之間,以避免在下一個Byte進來以前就發生了超時中斷。若要清除接收超時中斷的中斷旗標同樣讀取RBR即可。 那麼為甚麼我們要使用這兩種中斷? 首先我們將緩衝區設定在30Bytes會發生中斷,若進來資料是一長串的話可以每30Bytes收一次以降低CPU的負擔。問題是如果進來的資料不剛好整除30個Byte怎麼辦? 這些不到30Bytes的資料就透過超時中斷來處理。假設進來的資料剛好是30個Byte,那很好就剛好把30個Byte收完以後就結束了,如果大於30個Byte則會在超時中斷發生時將剩下的幾個Byte讀取完畢。 下面的程式透過接收中斷的方式將RX接收到的資料傳回TX,所以TX應傳出RX所接收到的資料。由Arduino IDE的Serial Monitor來輸入資料及監測程式運作的狀況。記得UART0的中斷服務程式要叫做"UART02_IRQHandler"。 1. 首先輸入一個不到30Bytes的字串會發生超時中斷,並將這些字元存入軟體b