成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

K210應用5-使用中斷方式通過UART接收數(shù)據

antz / 3512人閱讀

摘要:使用中斷方式通過接收數(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ù)據接收。

  • 硬件設計

????????硬件電路圖如下:

  • 軟件設計

????????軟件流程圖如下:

  • 軟件實現(xiàn)

????????根據硬件設計和軟件設計可知,本節(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文件。

  • 實驗現(xiàn)象

????????通過串口助手,發(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

相關文章

  • STM32串口通信(HAL庫 二)

    摘要:緊接著上一篇博文。。。編寫串口中斷函數(shù)當中斷發(fā)生的時候,程序就會執(zhí)行中斷服務函數(shù),我們在中斷服務函數(shù)中編寫相應的邏輯代碼就可以了。將以下代碼編寫在中串口輸出重定義到注意頭文件需要包含標準庫,也就是。 ...

    frontoldman 評論0 收藏0
  • 身價過億的妖媚子對小碼農說串口能傳送我的愛嗎?

    摘要:目前,所有型號串口的輸入是輸出是。串口全雙工通信是沒有時鐘脈沖的,只能依靠晶振脈沖定時器的溢出脈沖。中斷中讀取,清標志,然后返回給計算機,等待發(fā)送完畢防重疊最少時間次位定時器時間。實現(xiàn)燒錄程序的目的。 ...

    iOS122 評論0 收藏0
  • 【STM32】標準庫與HAL庫對照學習教程八--串口通信詳解

    摘要:異步通信與同步通信異步通信異步通信是指通信的發(fā)送與接收設備使用各自的時鐘控制數(shù)據的發(fā)送和接收過程。同步通信同步通信時要建立發(fā)送方時鐘對接收方時鐘的直接控制,使雙方達到完全同步。配置串口設置為異步通信基礎參數(shù)波特率為。 ...

    yck 評論0 收藏0
  • stm32 高效串口收發(fā)

    摘要:接收緩沖區(qū)和發(fā)送緩沖區(qū)的請求是獨立的。此時串口實際上還有個字節(jié)并未發(fā)送完成,數(shù)據寄存器和移位寄存器中的個字節(jié)還需要發(fā)送,并不能關閉串口發(fā)送。 文章目錄 串口通訊串...

    darkerXi 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<