摘要:使用中斷方式通過接收數據實驗目的本節實驗目的為實現串口發送和接收。如果兩臺設備之間需要通過串口進行通信,上面提到的波特率數據位停止位和奇偶校驗位等這些必要參數,必須設置一致,才能進行串口通信。
使用中斷方式通過UART接收數據
????????本節實驗目的為實現串口發送和接收。這一節計劃采取中斷的方式來實現串口接收,K210串口接收到0x00,則熄滅前節提到的紅色LED燈,并通過串口打印Red Led Off,否則,則點亮前節提到的紅色LED燈,并通過串口打印Red Led On。
????????1)、帶UART和發光二極管(LED)的K210開發板一塊,用于實踐并查看實驗現象;
????????2)、官方裸機編程指導手冊:kendryte_standalone_programming_guide,用于查閱SDK中接口說明。
????????串口通信是指外設和計算機間,通過數據線、地線和控制線等,按位進行數據傳輸的一種通信方式,傳輸方式為一個字符一個字符的傳輸,每個字符一位一位的傳輸,先傳輸低位,再傳輸高位,并且傳輸每個字符時,總是以起始位開始,以停止位結束,位于位之間可根據自己需求,設置時間間隔,這個時間間隔對應波特率;而對于有些場景,為了保證數據的可靠性,還需加上校驗位,稱之為奇偶校驗位,以此來校驗傳輸數據的正確性。如果兩臺設備之間需要通過串口進行通信,上面提到的波特率、數據位、停止位和奇偶校驗位等這些必要參數,必須設置一致,才能進行串口通信。另外,串口通信支持全雙工通信,即:使用一根數據線發送數據的同時,可以用另一個數據線進行數據接收。
????????硬件電路圖如下:
????????軟件流程圖如下:
????????根據硬件設計和軟件設計可知,本節應用實現步驟如下:
????????1)、設置引腳復用功能:由硬件原理圖可知:我們需要將IO12設置為GPIOHS功能,IO4和IO5設置為UART的RX和TX功能,如下圖:
????????2)、LED初始化,如下圖:
????????3)、UART初始化,如下圖:
????????4)、實現uart3接收中斷回調函數,在接收中斷回調函數中,實現串口接收和記錄接收數據長度,如下圖:
????????5)、通過UART發送提示信息,如下圖:
????????6)、判斷是否接收到數據,如果接收到數據,判斷接收到的控制命令類型,根據接收到的控制命令,進行相應的操作,如下圖:
????????根據上述實現步驟,最終代碼如下:
#include #include #include #include #include #include #include #define LED_R_PIN (12)#define LED_R_GPIOHSNUM (0)#define LED_R_FUNC (FUNC_GPIOHS0+LED_R_GPIOHSNUM)#define UART3_RX_PIN (4)#define UART3_TX_PIN (5)#define UART3_NUM (UART_DEVICE_3)#define UART3_RX_FUNC (FUNC_UART1_RX+UART3_NUM*2)#define UART3_TX_FUNC (FUNC_UART1_TX+UART3_NUM*2)/********************************* * 管腳功能初始化 ********************************/void init_hardware(void){ // 將紅色LED管腳設置復用為GPIOHS fpioa_set_function(LED_R_PIN, LED_R_FUNC); // 將UART管腳設置復用為UART fpioa_set_function(UART3_RX_PIN, UART3_RX_FUNC); fpioa_set_function(UART3_TX_PIN, UART3_TX_FUNC);}/********************************* * LED初始化 ********************************/void init_led(gpio_pin_value_t value){ // 設置輸出 gpiohs_set_drive_mode(LED_R_GPIOHSNUM, GPIO_DM_OUTPUT); // 設置初始電平狀態 gpiohs_set_pin(LED_R_GPIOHSNUM, value);}/********************************* * 控制LED亮滅 ********************************/void ctl_led(gpio_pin_value_t value){ gpiohs_set_pin(LED_R_GPIOHSNUM, value);}struct RCVBUF { char buf[128]; unsigned char len;};/********************************* * UART接收中斷回調函數 ********************************/int irq_uart3_rcv(void *ctx){ struct RCVBUF *rcv_buf = (struct RCVBUF *)ctx; rcv_buf->len = uart_receive_data(UART3_NUM, rcv_buf->buf, 1); return 0;}/********************************* * UART初始化 ********************************/void init_uart(struct RCVBUF *rcv_buf){ // 初始化 uart uart_init(UART3_NUM); // 設置 uart 工作模式 uart_set_work_mode (UART3_NUM , UART_NORMAL); // 設置 UART 相關參數 uart_config (UART3_NUM , 115200 , UART_BITWIDTH_8BIT , UART_STOP_1 , UART_PARITY_NONE); // 初始化外部中斷 plic_init(); // 注冊 UART 中斷函數 uart_irq_register (UART3_NUM, UART_RECEIVE, irq_uart3_rcv, rcv_buf , 1); // 設置接收中斷 觸發 FIFO 深度 uart_set_receive_trigger(UART3_NUM, UART_RECEIVE_FIFO_1); // 使能系統中斷,如果使用中斷,一定要開啟系統中斷 sysctl_enable_irq();}int main(int argc, char **argv){ init_hardware(); init_led(GPIO_PV_HIGH); struct RCVBUF rcv_buf = { .len = 0, }; init_uart(&rcv_buf); uart_send_data(UART3_NUM, "CTL LED:[0:OFF/1:ON] /r/n", sizeof("CTL LED:[0:OFF/1:ON] /r/n")); while (1) { if(rcv_buf.len != 0) { uart_send_data(UART3_NUM, "rcv_buf.len:", sizeof("rcv_buf.len:")); uart_send_data(UART3_NUM, (char *)&rcv_buf.len, sizeof(rcv_buf.len)); if(rcv_buf.buf[0] == 0) { uart_send_data(UART3_NUM, "LER_R OFF! /r/n", sizeof("LER_R OFF! /r/n")); ctl_led(GPIO_PV_HIGH); } else { uart_send_data(UART3_NUM, "LER_R ON! /r/n", sizeof("LER_R ON! /r/n")); ctl_led(GPIO_PV_LOW); } uart_send_data(UART3_NUM, "CTL LED:[0:OFF/1:ON] /r/n", sizeof("CTL LED:[0:OFF/1:ON] /r/n")); rcv_buf.len = 0; } usleep(20000); } return 0;}
????????1)、同上一節類似,在SDK中創建uart_irq文件夾,在新建的文件夾中創建一個main.c文件,然后將本節代碼輸入到main.c文件中,如下圖:
????????2)、同上一節的編譯方式類似,打開vscode終端,在終端中進入上一節創建的build文件夾,然后輸入:cmake ../ -DPROJ=uart_irq -G "MinGW Makefiles" ,生成makefile文件,如下圖:
????????3)、生成makefile文件后,輸入:make ,開始編譯,如下圖:
????????4)、編譯完成后,會在build目錄下生成燒錄文件:uart_irq.bin,如下圖:
????????同上一節的燒錄方式類似,注意:Firmware那一項選擇我們剛編譯出的uart_irq.bin文件。
????????通過串口助手,發送0x00,紅色LED燈熄滅,發送其他非零數,紅色LED亮起。如下圖:
????????1)、開啟LED
????????2)、關閉LED
????????1)、K210串口中斷有接收中斷和發送中斷,用戶可根據需求設置想要的中斷方式;
????????2)、K210串口的中斷可設置觸發FIFO深度,用戶可根據需求設置想要的FIFO深度。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/123277.html
摘要:緊接著上一篇博文。。。編寫串口中斷函數當中斷發生的時候,程序就會執行中斷服務函數,我們在中斷服務函數中編寫相應的邏輯代碼就可以了。將以下代碼編寫在中串口輸出重定義到注意頭文件需要包含標準庫,也就是。 ...
摘要:目前,所有型號串口的輸入是輸出是。串口全雙工通信是沒有時鐘脈沖的,只能依靠晶振脈沖定時器的溢出脈沖。中斷中讀取,清標志,然后返回給計算機,等待發送完畢防重疊最少時間次位定時器時間。實現燒錄程序的目的。 ...
摘要:異步通信與同步通信異步通信異步通信是指通信的發送與接收設備使用各自的時鐘控制數據的發送和接收過程。同步通信同步通信時要建立發送方時鐘對接收方時鐘的直接控制,使雙方達到完全同步。配置串口設置為異步通信基礎參數波特率為。 ...
摘要:接收緩沖區和發送緩沖區的請求是獨立的。此時串口實際上還有個字節并未發送完成,數據寄存器和移位寄存器中的個字節還需要發送,并不能關閉串口發送。 文章目錄 串口通訊串...
閱讀 2473·2021-11-24 09:39
閱讀 3406·2021-11-15 11:37
閱讀 2251·2021-10-08 10:04
閱讀 3965·2021-09-09 11:54
閱讀 1883·2021-08-18 10:24
閱讀 1032·2019-08-30 11:02
閱讀 1793·2019-08-29 18:45
閱讀 1651·2019-08-29 16:33