摘要:使用中斷方式通過接收數(shù)據實驗目的本節(jié)實驗目的為實現(xiàn)串口發(fā)送和接收。如果兩臺設備之間需要通過串口進行通信,上面提到的波特率數(shù)據位停止位和奇偶校驗位等這些必要參數(shù),必須設置一致,才能進行串口通信。
使用中斷方式通過UART接收數(shù)據
????????本節(jié)實驗目的為實現(xiàn)串口發(fā)送和接收。這一節(jié)計劃采取中斷的方式來實現(xiàn)串口接收,K210串口接收到0x00,則熄滅前節(jié)提到的紅色LED燈,并通過串口打印Red Led Off,否則,則點亮前節(jié)提到的紅色LED燈,并通過串口打印Red Led On。
????????1)、帶UART和發(fā)光二極管(LED)的K210開發(fā)板一塊,用于實踐并查看實驗現(xiàn)象;
????????2)、官方裸機編程指導手冊:kendryte_standalone_programming_guide,用于查閱SDK中接口說明。
????????串口通信是指外設和計算機間,通過數(shù)據線、地線和控制線等,按位進行數(shù)據傳輸?shù)囊环N通信方式,傳輸方式為一個字符一個字符的傳輸,每個字符一位一位的傳輸,先傳輸?shù)臀?,再傳輸高位,并且傳輸每個字符時,總是以起始位開始,以停止位結束,位于位之間可根據自己需求,設置時間間隔,這個時間間隔對應波特率;而對于有些場景,為了保證數(shù)據的可靠性,還需加上校驗位,稱之為奇偶校驗位,以此來校驗傳輸數(shù)據的正確性。如果兩臺設備之間需要通過串口進行通信,上面提到的波特率、數(shù)據位、停止位和奇偶校驗位等這些必要參數(shù),必須設置一致,才能進行串口通信。另外,串口通信支持全雙工通信,即:使用一根數(shù)據線發(fā)送數(shù)據的同時,可以用另一個數(shù)據線進行數(shù)據接收。
????????硬件電路圖如下:
????????軟件流程圖如下:
????????根據硬件設計和軟件設計可知,本節(jié)應用實現(xiàn)步驟如下:
????????1)、設置引腳復用功能:由硬件原理圖可知:我們需要將IO12設置為GPIOHS功能,IO4和IO5設置為UART的RX和TX功能,如下圖:
????????2)、LED初始化,如下圖:
????????3)、UART初始化,如下圖:
????????4)、實現(xiàn)uart3接收中斷回調函數(shù),在接收中斷回調函數(shù)中,實現(xiàn)串口接收和記錄接收數(shù)據長度,如下圖:
????????5)、通過UART發(fā)送提示信息,如下圖:
????????6)、判斷是否接收到數(shù)據,如果接收到數(shù)據,判斷接收到的控制命令類型,根據接收到的控制命令,進行相應的操作,如下圖:
????????根據上述實現(xiàn)步驟,最終代碼如下:
#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); // 設置初始電平狀態(tài) 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接收中斷回調函數(shù) ********************************/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 相關參數(shù) uart_config (UART3_NUM , 115200 , UART_BITWIDTH_8BIT , UART_STOP_1 , UART_PARITY_NONE); // 初始化外部中斷 plic_init(); // 注冊 UART 中斷函數(shù) uart_irq_register (UART3_NUM, UART_RECEIVE, irq_uart3_rcv, rcv_buf , 1); // 設置接收中斷 觸發(fā) FIFO 深度 uart_set_receive_trigger(UART3_NUM, UART_RECEIVE_FIFO_1); // 使能系統(tǒng)中斷,如果使用中斷,一定要開啟系統(tǒng)中斷 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)、同上一節(jié)類似,在SDK中創(chuàng)建uart_irq文件夾,在新建的文件夾中創(chuàng)建一個main.c文件,然后將本節(jié)代碼輸入到main.c文件中,如下圖:
????????2)、同上一節(jié)的編譯方式類似,打開vscode終端,在終端中進入上一節(jié)創(chuàng)建的build文件夾,然后輸入:cmake ../ -DPROJ=uart_irq -G "MinGW Makefiles" ,生成makefile文件,如下圖:
????????3)、生成makefile文件后,輸入:make ,開始編譯,如下圖:
????????4)、編譯完成后,會在build目錄下生成燒錄文件:uart_irq.bin,如下圖:
????????同上一節(jié)的燒錄方式類似,注意:Firmware那一項選擇我們剛編譯出的uart_irq.bin文件。
????????通過串口助手,發(fā)送0x00,紅色LED燈熄滅,發(fā)送其他非零數(shù),紅色LED亮起。如下圖:
????????1)、開啟LED
????????2)、關閉LED
????????1)、K210串口中斷有接收中斷和發(fā)送中斷,用戶可根據需求設置想要的中斷方式;
????????2)、K210串口的中斷可設置觸發(fā)FIFO深度,用戶可根據需求設置想要的FIFO深度。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/123277.html
摘要:緊接著上一篇博文。。。編寫串口中斷函數(shù)當中斷發(fā)生的時候,程序就會執(zhí)行中斷服務函數(shù),我們在中斷服務函數(shù)中編寫相應的邏輯代碼就可以了。將以下代碼編寫在中串口輸出重定義到注意頭文件需要包含標準庫,也就是。 ...
摘要:目前,所有型號串口的輸入是輸出是。串口全雙工通信是沒有時鐘脈沖的,只能依靠晶振脈沖定時器的溢出脈沖。中斷中讀取,清標志,然后返回給計算機,等待發(fā)送完畢防重疊最少時間次位定時器時間。實現(xiàn)燒錄程序的目的。 ...
摘要:異步通信與同步通信異步通信異步通信是指通信的發(fā)送與接收設備使用各自的時鐘控制數(shù)據的發(fā)送和接收過程。同步通信同步通信時要建立發(fā)送方時鐘對接收方時鐘的直接控制,使雙方達到完全同步。配置串口設置為異步通信基礎參數(shù)波特率為。 ...
摘要:接收緩沖區(qū)和發(fā)送緩沖區(qū)的請求是獨立的。此時串口實際上還有個字節(jié)并未發(fā)送完成,數(shù)據寄存器和移位寄存器中的個字節(jié)還需要發(fā)送,并不能關閉串口發(fā)送。 文章目錄 串口通訊串...
閱讀 2681·2021-11-24 09:39
閱讀 3513·2021-11-15 11:37
閱讀 2470·2021-10-08 10:04
閱讀 4090·2021-09-09 11:54
閱讀 1951·2021-08-18 10:24
閱讀 1181·2019-08-30 11:02
閱讀 1866·2019-08-29 18:45
閱讀 1769·2019-08-29 16:33