第一經(jīng)濟(jì)網(wǎng)歡迎您!
        當(dāng)前位置:首頁(yè)>金融動(dòng)態(tài) > 正文內(nèi)容

        RA6M3 HMI Board之UART實(shí)踐介紹

        1.1 前言說(shuō)明 串口是MCU上最常見(jiàn)和使用最為頻繁的外設(shè)之一,可以用作打印調(diào)試信息、遠(yuǎn)程登陸、控制支持串口通訊的外設(shè)等功能,了解和掌握串口是嵌入式開(kāi)發(fā)中的一項(xiàng)必備技能。


        (相關(guān)資料圖)

        1.1.1 本章內(nèi)容 使用RT-ThreadStudio創(chuàng)建開(kāi)發(fā)板的程序,編寫UART的程序,實(shí)現(xiàn)串口打印數(shù)據(jù)的功能,同時(shí)使用Finsh Shell控制開(kāi)發(fā)板上的LED

        1.1.2 模塊介紹 開(kāi)發(fā)板上提供了兩個(gè)串口連接,分別是在P109和P110的串口9,通過(guò)調(diào)試器的虛擬串口與上位機(jī)通訊。

        另一個(gè)串口位于P205和P206的串口4,TXD和RXD引腳引出到Ardinuo接口上,在開(kāi)發(fā)板上也直接標(biāo)出了。

        1.1.3 開(kāi)發(fā)軟件 根據(jù)《實(shí)踐指南說(shuō)明》安裝fsp3.5.0和RT-Thread Studio(2.2.6)。

        1.2 步驟說(shuō)明 安裝好開(kāi)發(fā)環(huán)境后,首先對(duì)RT-Thread Studio的SDK Manager中安裝包進(jìn)行檢查,確定相關(guān)的軟件支持包已經(jīng)安裝。

        1.2.1 新建工程 點(diǎn)擊工具欄中的文件->新建->RT-Thread項(xiàng)目

        選擇目標(biāo)開(kāi)發(fā)板以及工程默認(rèn)位置,這里一定要選擇HMI_Board,對(duì)應(yīng)的BSP版本為1.0.3,如果選擇RA6M3-HMI-Board,對(duì)應(yīng)的BSP版本為1.0.2,在使用串口時(shí)有Bug存在,會(huì)導(dǎo)致程序無(wú)法正常運(yùn)行。

        給項(xiàng)目一個(gè)合適的名字

        點(diǎn)擊完成后,就可以得到一個(gè)打印信息以及一秒鐘翻轉(zhuǎn)LED的程序。

        這個(gè)程序是一個(gè)完整的程序,點(diǎn)擊編譯后可以直接下載運(yùn)行。在此基礎(chǔ)上我們就可以根據(jù)自己的需要編寫相應(yīng)的驅(qū)動(dòng)程序。

        如果在下載過(guò)程中遇到上述問(wèn)題,可以通過(guò)更新pyocd的版本來(lái)修正,這一問(wèn)題的原因是pyocd的版本過(guò)低導(dǎo)致。安裝0.2.0的pyocd添加對(duì)瑞薩的支持就可以解決這個(gè)問(wèn)題。

        由RT-Thread Studio創(chuàng)建的軟件工程本身就是一個(gè)演示了LED翻轉(zhuǎn)和串口功能的例程,我們上來(lái)就可以得到可以運(yùn)行的使用了串口輸出信息的程序。需要注意的是,rtthread為了方便開(kāi)發(fā)者調(diào)試,在系統(tǒng)中嵌入了Finsh這個(gè)簡(jiǎn)易的控制臺(tái)程序,根據(jù)用戶使能的模塊提供了不同的控制指令。

        新創(chuàng)建的工程編譯通過(guò)后,利用板載的daplink將固件燒寫到開(kāi)發(fā)板上。

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

        其中l(wèi)ist的功能很多,后面跟隨不同的參數(shù)可以實(shí)現(xiàn)不同的功能, 如圖所示,可以產(chǎn)看當(dāng)前系統(tǒng)中的線程、定時(shí)器信號(hào)量、互斥量、事件、郵箱、消息隊(duì)列以及設(shè)備的實(shí)例個(gè)數(shù)。可以幫助開(kāi)發(fā)者掌握當(dāng)前系統(tǒng)的運(yùn)行狀態(tài)。另外reboot功能可以減少設(shè)備上下電的次數(shù),方便遠(yuǎn)程調(diào)試。

        Finsh的除了上述已經(jīng)定義好的功能,還支持自定義指令,可以幫助開(kāi)發(fā)者自定義一些測(cè)試函數(shù),方便針對(duì)特定情境進(jìn)行測(cè)試。

        開(kāi)發(fā)板默認(rèn)使用uart9作為調(diào)試串口,在開(kāi)發(fā)板上的Ardinuo接口上,引出了uart4。開(kāi)發(fā)板默認(rèn)是不開(kāi)啟uart4,為了能使用uart4,首先使用FSP工具配置相關(guān)的引腳。

        點(diǎn)擊工程中的RA Smart Configurator,可以啟動(dòng)代碼配置工具對(duì)MCU的外設(shè)進(jìn)行配置。

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

        修改General欄中的通道和設(shè)備名稱

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

        點(diǎn)擊“GenerateProject Content”,即可關(guān)閉FSP工具。

        回到工程中點(diǎn)擊RT-Thread Settings,對(duì)工程中要使用的硬件進(jìn)行配置。

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

        保存文件后,就可以在工程中添加uart4,并在工程調(diào)用相關(guān)的串口函數(shù)。

        1.3 代碼驗(yàn)證

        通過(guò)串口發(fā)送字符串,是嵌入式應(yīng)用中的基本程序,檢驗(yàn)串口是否正常工作。在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" /串口設(shè)備名稱 / staticrt_device_t serial; /串口設(shè)備句柄 / char str[] = "hello RT-Thread!rn"; void hal_entry(void) { rt_kprintf("nHello RT-Thread!n"); /查找串口設(shè)備 / serial = rt_device_find(SAMPLE_UART_NAME); rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); // 串口設(shè)備使用模式為 (發(fā)送阻塞 接收非阻塞) 模式 while (1) { rt_pin_write(LED_PIN, PIN_HIGH); rt_thread_mdelay(500); rt_pin_write(LED_PIN, PIN_LOW); rt_thread_mdelay(500); /發(fā)送字符串 */ rt_device_write(serial, 0, str, (sizeof(str) - 1)); } }

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

        下面使用Finsh的自定義功能實(shí)現(xiàn)uart4的回環(huán)功能。具體的代碼如下

        #include #include "hal_data.h" #include #define LED_PIN BSP_IO_PORT_02_PIN_09 /* Onboard LED pins / #define SAMPLE_UART_NAME "uart4" /串口設(shè)備名稱 / static rt_device_t serial; /串口設(shè)備句柄 / /串口接收消息結(jié)構(gòu) / struct rx_msg { rt_device_t dev; rt_size_t size; }; /消息隊(duì)列控制塊 / static struct rt_messagequeue rx_mq; /接收數(shù)據(jù)回調(diào)函數(shù) / 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) { /消息隊(duì)列滿 */ 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)); /從消息隊(duì)列中讀取消息 / result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER); if (result == RT_EOK) { /從串口讀取數(shù)據(jù) / rx_length = rt_device_read(msg.dev, 0, rx_buffer, msg.size); rx_buffer[rx_length] = "?"; /通過(guò)串口設(shè)備 serial 輸出讀取到的消息 / rt_device_write(serial, 0, rx_buffer, rx_length); /打印數(shù)據(jù) */ 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); } /查找串口設(shè)備 / serial = rt_device_find(uart_name); if (!serial) { rt_kprintf("find %s failed!n", uart_name); return RT_ERROR; } /初始化消息隊(duì)列 / rt_mq_init(&rx_mq, "rx_mq", msg_pool, /存放消息的緩沖區(qū) / sizeof(struct rx_msg), /一條消息的最大長(zhǎng)度 / sizeof(msg_pool), /存放消息的緩沖區(qū)大小 / RT_IPC_FLAG_FIFO); /如果有多個(gè)線程等待,按照先來(lái)先得到的方法分配消息 / /以 非阻塞接收及阻塞發(fā)送方式打開(kāi)串口設(shè)備 / rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); /設(shè)置接收回調(diào)函數(shù) / rt_device_set_rx_indicate(serial, uart_input); /發(fā)送字符串 / rt_device_write(serial, 0, str, (sizeof(str) - 1)); /創(chuàng)建 serial 線程 / rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10); /創(chuàng)建成功則啟動(dòng)線程 / if (thread != RT_NULL) { rt_thread_startup(thread); } else { ret = RT_ERROR; } return ret; } /導(dǎo)出到 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); } }

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

        測(cè)試效果如圖所示:

        1.4 章節(jié)總結(jié)

        使用RT-Thread和FSP進(jìn)行開(kāi)始還是很方便的,在FSP中修改相關(guān)引腳的功能,RT-Thread中使用配置工具對(duì)BSP進(jìn)行使能。同時(shí)RT-Thread官網(wǎng)上還有詳細(xì)的文檔和示例代碼,幫助新手快速搭建工程和入門嵌入式開(kāi)發(fā)是一個(gè)不錯(cuò)的選擇。

        關(guān)鍵詞:

        標(biāo)簽閱讀


        精品亚洲视频在线观看| 亚洲国产精品无码久久98| www亚洲精品少妇裸乳一区二区| 亚洲中文字幕AV每天更新| 亚洲国产精品成人综合久久久 | 久久精品熟女亚洲av麻豆| 亚洲国产综合AV在线观看| 亚洲精品GV天堂无码男同| 亚洲日韩国产一区二区三区在线| 亚洲天堂2017无码中文| 伊人久久亚洲综合影院首页| 亚洲欧洲免费无码| 亚洲a∨无码精品色午夜| 国产亚洲精彩视频| 亚洲日韩在线第一页| 日本亚洲国产一区二区三区| 亚洲人成网站在线播放vr| 亚洲国产精品成人精品无码区| 亚洲av无码乱码国产精品fc2| 午夜亚洲AV日韩AV无码大全| 亚洲综合在线视频| 亚洲冬月枫中文字幕在线看 | 国产精品亚洲综合专区片高清久久久| 亚洲成年人啊啊aa在线观看| 亚洲片国产一区一级在线观看| 国产亚洲情侣一区二区无| 亚洲日本va中文字幕久久| 亚洲av午夜福利精品一区| 亚洲综合久久综合激情久久| 亚洲国产韩国一区二区| 在线亚洲午夜片AV大片| 免费在线观看亚洲| 国产亚洲情侣一区二区无码AV | 亚洲AV综合色区无码一二三区| 亚洲AV无码一区二区三区久久精品| 偷自拍亚洲视频在线观看99| 亚洲伊人久久大香线蕉综合图片| 久久亚洲精品无码| 亚洲三级视频在线| 亚洲AV无码AV男人的天堂不卡| 亚洲无码黄色网址|