第一經濟網歡迎您!
        當前位置:首頁>金融動態 > 正文內容

        RA6M3 HMI Board之UART實踐介紹

        1.1 前言說明 串口是MCU上最常見和使用最為頻繁的外設之一,可以用作打印調試信息、遠程登陸、控制支持串口通訊的外設等功能,了解和掌握串口是嵌入式開發中的一項必備技能。


        (相關資料圖)

        1.1.1 本章內容 使用RT-ThreadStudio創建開發板的程序,編寫UART的程序,實現串口打印數據的功能,同時使用Finsh Shell控制開發板上的LED

        1.1.2 模塊介紹 開發板上提供了兩個串口連接,分別是在P109和P110的串口9,通過調試器的虛擬串口與上位機通訊。

        另一個串口位于P205和P206的串口4,TXD和RXD引腳引出到Ardinuo接口上,在開發板上也直接標出了。

        1.1.3 開發軟件 根據《實踐指南說明》安裝fsp3.5.0和RT-Thread Studio(2.2.6)。

        1.2 步驟說明 安裝好開發環境后,首先對RT-Thread Studio的SDK Manager中安裝包進行檢查,確定相關的軟件支持包已經安裝。

        1.2.1 新建工程 點擊工具欄中的文件->新建->RT-Thread項目

        選擇目標開發板以及工程默認位置,這里一定要選擇HMI_Board,對應的BSP版本為1.0.3,如果選擇RA6M3-HMI-Board,對應的BSP版本為1.0.2,在使用串口時有Bug存在,會導致程序無法正常運行。

        給項目一個合適的名字

        點擊完成后,就可以得到一個打印信息以及一秒鐘翻轉LED的程序。

        這個程序是一個完整的程序,點擊編譯后可以直接下載運行。在此基礎上我們就可以根據自己的需要編寫相應的驅動程序。

        如果在下載過程中遇到上述問題,可以通過更新pyocd的版本來修正,這一問題的原因是pyocd的版本過低導致。安裝0.2.0的pyocd添加對瑞薩的支持就可以解決這個問題。

        由RT-Thread Studio創建的軟件工程本身就是一個演示了LED翻轉和串口功能的例程,我們上來就可以得到可以運行的使用了串口輸出信息的程序。需要注意的是,rtthread為了方便開發者調試,在系統中嵌入了Finsh這個簡易的控制臺程序,根據用戶使能的模塊提供了不同的控制指令。

        新創建的工程編譯通過后,利用板載的daplink將固件燒寫到開發板上。

        在串口終端中輸入help,可以查看當前支持的指令。

        其中list的功能很多,后面跟隨不同的參數可以實現不同的功能, 如圖所示,可以產看當前系統中的線程、定時器信號量、互斥量、事件、郵箱、消息隊列以及設備的實例個數。可以幫助開發者掌握當前系統的運行狀態。另外reboot功能可以減少設備上下電的次數,方便遠程調試。

        Finsh的除了上述已經定義好的功能,還支持自定義指令,可以幫助開發者自定義一些測試函數,方便針對特定情境進行測試。

        開發板默認使用uart9作為調試串口,在開發板上的Ardinuo接口上,引出了uart4。開發板默認是不開啟uart4,為了能使用uart4,首先使用FSP工具配置相關的引腳。

        點擊工程中的RA Smart Configurator,可以啟動代碼配置工具對MCU的外設進行配置。

        在Stack欄中的New Stack->Connnectivity->UART添加新的UART實例。

        修改General欄中的通道和設備名稱

        Pins引腳欄中設定使用的引腳和引腳的工作模式。

        點擊“GenerateProject Content”,即可關閉FSP工具。

        回到工程中點擊RT-Thread Settings,對工程中要使用的硬件進行配置。

        在配置界面的硬件一欄中勾選Enable UART4

        保存文件后,就可以在工程中添加uart4,并在工程調用相關的串口函數。

        1.3 代碼驗證

        通過串口發送字符串,是嵌入式應用中的基本程序,檢驗串口是否正常工作。在hal_entry.c中添加以下代碼:

        #include #include "hal_data.h" #include #define LED_PIN BSP_IO_PORT_02_PIN_09 /* Onboard LED pins / #define SAMPLE_UART_NAME "uart4" /串口設備名稱 / staticrt_device_t serial; /串口設備句柄 / char str[] = "hello RT-Thread!rn"; void hal_entry(void) { rt_kprintf("nHello RT-Thread!n"); /查找串口設備 / serial = rt_device_find(SAMPLE_UART_NAME); rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); // 串口設備使用模式為 (發送阻塞 接收非阻塞) 模式 while (1) { rt_pin_write(LED_PIN, PIN_HIGH); rt_thread_mdelay(500); rt_pin_write(LED_PIN, PIN_LOW); rt_thread_mdelay(500); /發送字符串 */ rt_device_write(serial, 0, str, (sizeof(str) - 1)); } }

        串口打印的效果如下圖所示。

        下面使用Finsh的自定義功能實現uart4的回環功能。具體的代碼如下

        #include #include "hal_data.h" #include #define LED_PIN BSP_IO_PORT_02_PIN_09 /* Onboard LED pins / #define SAMPLE_UART_NAME "uart4" /串口設備名稱 / static rt_device_t serial; /串口設備句柄 / /串口接收消息結構 / struct rx_msg { rt_device_t dev; rt_size_t size; }; /消息隊列控制塊 / static struct rt_messagequeue rx_mq; /接收數據回調函數 / static rt_err_t uart_input(rt_device_t dev, rt_size_t size) { struct rx_msg msg; rt_err_t result; msg.dev = dev; msg.size = size; result = rt_mq_send(&rx_mq, &msg, sizeof(msg)); if (result == -RT_EFULL) { /消息隊列滿 */ rt_kprintf("message queue full!n"); } return result; } static void serial_thread_entry(void parameter) { struct rx_msg msg; rt_err_t result; rt_uint32_t rx_length; static char rx_buffer[BSP_UART4_RX_BUFSIZE + 1]; while (1) { rt_memset(&msg, 0, sizeof(msg)); /從消息隊列中讀取消息 / result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER); if (result == RT_EOK) { /從串口讀取數據 / rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size); rx_buffer[rx_length] = "?"; /通過串口設備 serial 輸出讀取到的消息 / rt_device_write(serial, 0, rx_buffer, rx_length); /打印數據 */ rt_kprintf("%sn",rx_buffer); } } } static int uart_loop_sample(int argc, char argv[]) { rt_err_t ret = RT_EOK; char uart_name[RT_NAME_MAX]; static char msg_pool[256]; char str[] = "hello RT-Thread!rn"; if (argc == 2) { rt_strncpy(uart_name, argv[1], RT_NAME_MAX); } else { rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX); } /查找串口設備 / serial = rt_device_find(uart_name); if (!serial) { rt_kprintf("find %s failed!n", uart_name); return RT_ERROR; } /初始化消息隊列 / rt_mq_init(&rx_mq, "rx_mq", msg_pool, /存放消息的緩沖區 / sizeof(struct rx_msg), /一條消息的最大長度 / sizeof(msg_pool), /存放消息的緩沖區大小 / RT_IPC_FLAG_FIFO); /如果有多個線程等待,按照先來先得到的方法分配消息 / /以 非阻塞接收及阻塞發送方式打開串口設備 / rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); /設置接收回調函數 / rt_device_set_rx_indicate(serial, uart_input); /發送字符串 / rt_device_write(serial, 0, str, (sizeof(str) - 1)); /創建 serial 線程 / rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10); /創建成功則啟動線程 / if (thread != RT_NULL) { rt_thread_startup(thread); } else { ret = RT_ERROR; } return ret; } /導出到 msh 命令列表中 */ MSH_CMD_EXPORT(uart_loop_sample, uart device loop sample); void hal_entry(void) { while (1) { rt_pin_write(LED_PIN, PIN_HIGH); rt_thread_mdelay(500); rt_pin_write(LED_PIN, PIN_LOW); rt_thread_mdelay(500); } }

        在串口界面中輸入控制指令

        測試效果如圖所示:

        1.4 章節總結

        使用RT-Thread和FSP進行開始還是很方便的,在FSP中修改相關引腳的功能,RT-Thread中使用配置工具對BSP進行使能。同時RT-Thread官網上還有詳細的文檔和示例代碼,幫助新手快速搭建工程和入門嵌入式開發是一個不錯的選擇。

        關鍵詞:

        標簽閱讀


        亚洲AV无码AV男人的天堂不卡| 亚洲五月丁香综合视频| 亚洲欧洲日韩国产一区二区三区| 亚洲精品中文字幕无乱码| 日本久久久久亚洲中字幕| 久久久久久亚洲精品中文字幕| 亚洲av中文无码乱人伦在线r▽| 国产亚洲欧洲精品| 久久亚洲国产精品五月天| 亚洲乳大丰满中文字幕| 亚洲开心婷婷中文字幕| 亚洲老妈激情一区二区三区| 亚洲国产精彩中文乱码AV| 久久久久亚洲av无码专区蜜芽| 久久国产精品亚洲综合| 久久久久亚洲av无码尤物| 中文字幕亚洲色图| 亚洲最大在线观看| 亚洲sss综合天堂久久久| 亚洲综合欧美色五月俺也去| 亚洲欧美日韩中文字幕一区二区三区| 亚洲色大网站WWW永久网站| 亚洲乱码日产精品一二三| 激情婷婷成人亚洲综合| 亚洲精品WWW久久久久久| 最新精品亚洲成a人在线观看| 亚洲精品无码乱码成人| 亚洲成在人天堂在线| 亚洲精品免费在线视频| 亚洲AV成人噜噜无码网站| 亚洲熟妇少妇任你躁在线观看| 激情婷婷成人亚洲综合| 久久影视综合亚洲| 亚洲精品福利视频| 亚洲av成人一区二区三区| 亚洲国产AV无码一区二区三区| 国产天堂亚洲国产碰碰| 久久久久亚洲精品无码网址| 亚洲国产精品无码久久久秋霞2| 久久精品国产亚洲av麻豆色欲 | 亚洲一级毛片在线播放|