本文轉(zhuǎn)自RA生態(tài)工作室:
瑞薩“RA MCU眾測(cè)寶典”環(huán)境搭建專(zhuān)題再添硬核實(shí)操!這次將解鎖“基本模板搭建與LED”技能,加入簡(jiǎn)易調(diào)度器實(shí)現(xiàn)多任務(wù)管理,一步步搞定“能直接落地”的開(kāi)發(fā)模板,不管是入門(mén)練手還是項(xiàng)目開(kāi)發(fā)都能復(fù)用。
開(kāi)啟寶典
前言
本人因參加嵌賽而接觸到瑞薩的新賽道,由此與瑞薩結(jié)緣。當(dāng)時(shí)投入到學(xué)習(xí)瑞薩對(duì)我來(lái)說(shuō)很新穎的開(kāi)發(fā)環(huán)境。相較于傳統(tǒng)開(kāi)發(fā)方式,瑞薩自家的FSP庫(kù)(類(lèi)似于HAL庫(kù))極大簡(jiǎn)化了作品的開(kāi)發(fā)流程,顯著提高了開(kāi)發(fā)效率,并提供了更高的靈活性。在完賽后本人也是深深?lèi)?ài)上這種簡(jiǎn)便開(kāi)發(fā)。
接下來(lái),我們將開(kāi)始對(duì)瑞薩基于Arm Cortex-M處理器內(nèi)核的RA4M2-100pin進(jìn)行系統(tǒng)學(xué)習(xí)與實(shí)驗(yàn)測(cè)試。
NO.1
開(kāi)發(fā)環(huán)境準(zhǔn)備
首先,引用以下文檔:

點(diǎn)擊查看大圖
RAM2系列是比較主流化的類(lèi)型之一,主打一個(gè)低功耗,基于48 MHz Arm Cortex-M33內(nèi)核,適用于電池供電、物聯(lián)網(wǎng)終端及其他對(duì)功耗敏感的應(yīng)用場(chǎng)景。我們自己做一些一般的嵌入式產(chǎn)品也完全夠用,我們測(cè)試的這一款是100pin腳的,有五六個(gè)串口,與獨(dú)立I2C等等。

點(diǎn)擊查看大圖
那么這里推薦用官方開(kāi)放軟件e2s,你也可以上網(wǎng)搜下用keil教程;下載器的話(huà),省時(shí)省力當(dāng)時(shí)直接到立創(chuàng)商城買(mǎi)的官方下載器,瑞薩所有系列芯片都支持用,如果板子上有板載下載器還可以直接用串口下載,就是稍微麻煩點(diǎn)。
01
下載e2studio
e2studio軟件的官方頁(yè)面和github下載頁(yè)面如下,可掃描二維碼或復(fù)制鏈接到瀏覽器查看。
e2studio軟件的官方頁(yè)面
https://www.renesas.cn/cn/zh/software-tool/e-studio
github上有各種版本下載,下載頁(yè)面如下
https://github.com/renesas/fsp/releases

點(diǎn)擊查看大圖
注意在最開(kāi)始讓選擇是快速安裝還是自定義安裝,選快速安裝,自己安裝容易少下載一些固件,在后續(xù)編碼時(shí)候容易出問(wèn)題。
02
下載Flash Programmer
我使用Renesas Flash Programmer軟件進(jìn)行燒錄hex程序,下載鏈接在官網(wǎng),可掃描二維碼或復(fù)制鏈接到瀏覽器查看。
Flash Programme下載鏈接
https://www.renesas.cn/zh/software-tool/renesas-flash-programmer-programming-gui
NO.2
模板準(zhǔn)備
01
入門(mén)
首先打開(kāi)e2s,新建文件:

點(diǎn)擊查看大圖
根據(jù)板子上的芯片,在Device中選擇對(duì)應(yīng)型號(hào),注意下面的Toolchains中選擇GNU,后面編譯起來(lái)更方便。

點(diǎn)擊查看大圖
后面頁(yè)面默認(rèn)不修改,之后得到一個(gè)初步程序。

點(diǎn)擊查看大圖
首先根據(jù)板子主晶振,修改時(shí)鐘:

點(diǎn)擊查看大圖
我這塊板子上芯片所接的外部晶振是24Mhz的,可能有些是12Mhz的,在下面這里可以修改晶振的大小,還可以修改不同時(shí)鐘線(xiàn)的頻率,我一般用外部晶振比較多,注意在這個(gè)小齒輪頁(yè)面做出的任何改動(dòng)都要最終按右上角的生成鍵。

點(diǎn)擊查看大圖

點(diǎn)擊查看大圖
在這個(gè)頁(yè)面里,首先修改成生成hex文件;其次這幾個(gè)勾選上,不然后續(xù)串口輸出編譯會(huì)報(bào)錯(cuò)。

點(diǎn)擊查看大圖

點(diǎn)擊查看大圖
02
配置基本函數(shù)
模板里面,需要一些LED和基本的串口輸出;因?yàn)镠AL庫(kù)雖然簡(jiǎn)便,但是也有弊端,程序出了問(wèn)題很難找到原因,所以我習(xí)慣用LED和串口打印幫助排除問(wèn)題;程序卡住LED可以直觀讓我知道具體卡在哪,串口則可以排除程序邏輯錯(cuò)誤等等。
在src新建倆文件,在倆文件內(nèi)新建LED和串口的.c.h文件。

點(diǎn)擊查看大圖
現(xiàn)在就可以去瑞薩特有的FSP庫(kù)生成初始代碼,先把燒錄方式改成SWD;看原理圖,這三個(gè)led燈接的pin腳,并且另一端是地,也就是給高電平是點(diǎn)亮,找到這幾個(gè)pin腳,修改為外部輸入模式OUTPUT。

點(diǎn)擊查看大圖

點(diǎn)擊查看大圖

點(diǎn)擊查看大圖
SCI里面找到和typeC一起的串口9,這樣既可以供電也可以用來(lái)調(diào)試。

點(diǎn)擊查看大圖

點(diǎn)擊查看大圖
串口這里要注意在pin腳頁(yè)面配置好后,還有配置Stack,會(huì)生成一個(gè)塊,點(diǎn)擊它,左下角屬性里面,可以修改配置串口詳細(xì)的所有基礎(chǔ)信息,函數(shù)名,波特率,回調(diào)函數(shù)等等。

點(diǎn)擊查看大圖
所使用的UART屬性描述

點(diǎn)擊生成代碼后旁邊的資源里面,在HAL里面就會(huì)有相應(yīng)你配置模塊的函數(shù),最常見(jiàn)一些OPEN,ENABLE等等,你可以直接拖動(dòng)出來(lái),使用這些函數(shù),相當(dāng)于幫你封裝好了功能函數(shù),你只需要根據(jù)需求修改封裝函數(shù)的入口參數(shù)即可。

點(diǎn)擊查看大圖
03
key板塊
首先是編寫(xiě)key常用封裝函數(shù),包括LED的開(kāi)閉,反轉(zhuǎn)以及定時(shí)閃爍。

點(diǎn)擊查看大圖
左右滑動(dòng)查看完整內(nèi)容
//LED單獨(dú)開(kāi)閉 #define LED1_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_LOW); #define LED1_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_05, BSP_IO_LEVEL_HIGH); #define LED2_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_LOW); #define LED2_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_HIGH); #define LED3_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_02, BSP_IO_LEVEL_LOW); #define LED3_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_02, BSP_IO_LEVEL_HIGH); //LED翻轉(zhuǎn) #defineLED1_TURN R_PORT4->PODR ^=1 <<(BSP_IO_PORT_04_PIN_05 & 0xFF); #define?LED2_TURN ? ? ? ? R_PORT4->PODR ^=1 <<(BSP_IO_PORT_04_PIN_04 & 0xFF); #define?LED3_TURN ? ? ? ? R_PORT0->PODR ^=1 <<(BSP_IO_PORT_00_PIN_02 & 0xFF); //LED閃爍函數(shù) #define?LED1_SHINE() ? ? ? ? ? ?R_PORT4->PODR ^=1 <<(BSP_IO_PORT_04_PIN_05 & 0xFF); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS); #define?LED2_SHINE() ? ? ? ? ? ?R_PORT4->PODR ^=1 <<(BSP_IO_PORT_04_PIN_04 & 0xFF); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS); #define?LED3_SHINE() ? ? ? ? ? ?R_PORT0->PODR ^=1 <<(BSP_IO_PORT_00_PIN_02 & 0xFF); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?R_BSP_SoftwareDelay(500,BSP_DELAY_UNITS_MILLISECONDS);
開(kāi)關(guān)函數(shù)(ON/OFF)
實(shí)現(xiàn)方式:調(diào)用瑞薩現(xiàn)成的庫(kù)函數(shù)R_IOPORT_PinWrite;
工作原理:直接向指定的引腳寫(xiě)入明確的高電平或低電平信號(hào),就像直接給燈下命令“開(kāi)”或“關(guān)”;
特點(diǎn):代碼最清晰,可移植性好,但執(zhí)行效率相對(duì)較低。
翻轉(zhuǎn)函數(shù)(TURN)
實(shí)現(xiàn)方式:直接操作硬件寄存器。
工作原理:使用按位異或操作符^=。1 << (PIN號(hào))會(huì)生成一個(gè)只有目標(biāo)位為1的掩碼,與該寄存器的當(dāng)前值進(jìn)行異或運(yùn)算。
異或規(guī)則:相同為0,不同為1
效果:如果目標(biāo)位當(dāng)前是0(燈滅),異或后變?yōu)?(燈亮);如果當(dāng)前是1(燈亮),異或后變?yōu)?
特點(diǎn):執(zhí)行速度極快(直接操作寄存器),但代碼可讀性稍差,且高度依賴(lài)硬件,但我個(gè)人最喜歡用這個(gè)排除錯(cuò)誤
閃爍函數(shù)(SHINE)
實(shí)現(xiàn)方式:翻轉(zhuǎn)函數(shù)+阻塞延時(shí)。
工作原理:它其實(shí)是先做了一次翻轉(zhuǎn)操作,然后立即調(diào)用一個(gè)延時(shí)函數(shù)R_BSP_SoftwareDelay。這個(gè)延時(shí)函數(shù)會(huì)讓整個(gè)CPU停下來(lái)等待指定的時(shí)間(500毫秒)。
特點(diǎn):
這是一個(gè)組合動(dòng)作(翻轉(zhuǎn)并延時(shí))。
阻塞式:在延時(shí)的半秒內(nèi),CPU不能做任何其他事情。因此它通常需要放在循環(huán)里才能實(shí)現(xiàn)連續(xù)閃爍,并且不適合在需要同時(shí)處理多任務(wù)的系統(tǒng)中使用。
個(gè)人喜歡用這個(gè)解決程序堵塞。

將其放在.h文件內(nèi),在主函數(shù)中聲明后,全局就都可以使用。
04
uart模塊
回顯輸出
左右滑動(dòng)查看完整內(nèi)容
#include"debug.h"
voidUart9_Init()
{
fsp_err_terr = FSP_SUCCESS;
//串口初始化
err =R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
}
//R_SCI_UART_Write(&g_uart9_ctrl, p_src, bytes);
//使用該函數(shù)后,標(biāo)志位會(huì)被置位,使用時(shí)要及時(shí)在被置位后清零標(biāo)志位,否則在連續(xù)調(diào)用時(shí),會(huì)導(dǎo)致數(shù)據(jù)丟失
volatilebool uart_complete_flag =false;
voidcallback_uart9_debug(uart_callback_args_t*p_args)
{
switch(p_args->event)
{
caseUART_EVENT_RX_CHAR:
{
R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t*)&(p_args->data),1);
//當(dāng)接受字符,出發(fā)中斷,發(fā)送原字符
break;
}
caseUART_EVENT_TX_COMPLETE:
{
uart_complete_flag=true;
break;
}
default:
break;
}
}
雖然Uart9_Init里面只有一行指令,但還是最好封裝為一個(gè)函數(shù),這樣方便后續(xù)程序多起來(lái)后我們可以直觀的理解與調(diào)用,也方便他人閱讀。
這樣編寫(xiě)好了串口的回顯,為了后續(xù)可以直接用printf串口打印調(diào)試信息,我們還需要在debug.c中加入printf向串口的重定義。
左右滑動(dòng)查看完整內(nèi)容
//串口重定向
//首先是條件編譯,檢查是否是GCC編譯;根據(jù)條件選擇使用哪種函數(shù)進(jìn)行重定向
#ifdefined __GNUC__ && !defined __clang__
int_write(intfd,char*pBuffer,intsize);//防止編譯警告
int_write(intfd,char*pBuffer,intsize)
{
(void)fd;
R_SCI_UART_Write(&g_uart9_ctrl,(uint8_t*)pBuffer,(uint32_t)size);
while(uart_complete_flag ==false);
uart_complete_flag =false;
returnsize;
}
#else
intfputc(intch, FILE *f)
{
(void)f;
R_SCI_UART_Write(&g_uart9_ctrl,(uint8_t*)&ch,1);
while(uart_complete_flag==false);
uart_complete_flag =false;
returnch;
}
#endif
05
主函數(shù)部分
調(diào)度器
瑞薩主函數(shù)為hal_entry,你也可以理解為main。對(duì)于一般集成了較多的程序,我習(xí)慣使用調(diào)度器,可以自由直觀的開(kāi)閉需要的部分,后期對(duì)于大項(xiàng)目也可以試試用rtos。
左右滑動(dòng)查看完整內(nèi)容
#include"hal_data.h" #include"gpt/gpt.h" #include"key/key.h" #include"led/led.h" #include"debug/debug.h" FSP_CPP_HEADER voidR_BSP_WarmStart(bsp_warm_start_event_tevent); FSP_CPP_FOOTER /*變量聲明區(qū)*/ /*------------------------------------------------------*/ uint32_tuwTick; //系統(tǒng)計(jì)時(shí)變量 /*------------------------------------------------------*/ uint32_tKey_Val, Key_Down, Key_Up, Key_Old; /*------------------------------------------------------*/ voidKey_Proc() { Key_Val =Key_Read(); Key_Down = Key_Val & (Key_Old ^ Key_Val);// 按鍵按下檢測(cè) Key_Up = ~Key_Val & (Key_Old ^ Key_Val); // 按鍵抬起檢測(cè) Key_Old = Key_Val; switch(Key_Down) { case3: LED1_TURN; break; case4: LED2_TURN; break; } } voidLED_Proc() { LED3_TURN; } /* 調(diào)度器任務(wù)結(jié)構(gòu)體定義 */ typedefstruct { void(*task_func)(void); // 任務(wù)函數(shù) unsignedlongint rate_ms; // 任務(wù)執(zhí)行周期(毫秒) unsignedlongint last_run;// 任務(wù)上次運(yùn)行時(shí)間 }task_t; /* 調(diào)度器任務(wù)列表 */ task_tScheduler_Task[] = { {Key_Proc,10,0}, // 鍵盤(pán)任務(wù),每10毫秒執(zhí)行一次 {LED_Proc,1000,0}, // 數(shù)碼管任務(wù),每100毫秒執(zhí)行一次 }; uint8_ttask_num=0;//任務(wù)數(shù)量 /* 調(diào)度器初始化 */ voidScheduler_Init(void) { task_num =sizeof(Scheduler_Task) /sizeof(task_t);// 計(jì)算任務(wù)數(shù)量 } /* 調(diào)度器運(yùn)行 */ voidScheduler_Run(void) { uint8_ti=0; for(i =0; i < task_num; i++) ? { ? ??uint32_t?now_time = uwTick;?// 獲取當(dāng)前時(shí)間 ? ??if?(now_time >= (Scheduler_Task[i].last_run + Scheduler_Task[i].rate_ms)) { Scheduler_Task[i].last_run = now_time;// 更新任務(wù)上次運(yùn)行時(shí)間 Scheduler_Task[i].task_func(); // 執(zhí)行任務(wù) } } } /*******************************************************************************************************************//** * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function * is called by main() when no RTOS is used. **********************************************************************************************************************/ voidhal_entry(void) { /*TODO:add your own code here */ Scheduler_Init(); Uart9_Init(); System_Init(); while(1) { Scheduler_Run(); } #ifBSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif }
功能
代碼里我寫(xiě)了,LED3的調(diào)度器設(shè)定的時(shí)間,間隔閃爍。

1000毫秒的閃爍間隔:

而按鍵則是,按鍵sw1,sw2分別對(duì)著LED1和LED2,按下則反轉(zhuǎn)一次。
NO.3
下載
然后準(zhǔn)備的差不多了,就可以下載了,打開(kāi)Flash Programmer,點(diǎn)擊左上角file,新建立一個(gè)。

按照這樣選:

點(diǎn)擊查看大圖
這里推薦給SWD下載這里做個(gè)段子,一來(lái)方便下載,二來(lái)這里要注意SWDIO,SWCLK兩條線(xiàn)要接緊一點(diǎn),不然老下不下去。

點(diǎn)擊查看大圖
這樣就下載成功了。
如果在FSP配置、調(diào)度器編寫(xiě)或下載調(diào)試中遇到問(wèn)題,或是有模板優(yōu)化、功能擴(kuò)展的巧思,歡迎在評(píng)論區(qū)分享交流~
環(huán)境搭建專(zhuān)題會(huì)持續(xù)覆蓋更多RA系列開(kāi)發(fā)板的實(shí)操指南,關(guān)注瑞薩嵌入式小百科,讓嵌入式開(kāi)發(fā)“從0 到1”更高效,后續(xù)還能解鎖更多項(xiàng)目模板和避坑技巧!
-
處理器
+關(guān)注
關(guān)注
68文章
20250瀏覽量
252209 -
mcu
+關(guān)注
關(guān)注
147文章
18924瀏覽量
398023 -
瑞薩
+關(guān)注
關(guān)注
37文章
22481瀏覽量
90858 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
26文章
6289瀏覽量
118049 -
開(kāi)發(fā)環(huán)境
+關(guān)注
關(guān)注
1文章
270瀏覽量
17637
原文標(biāo)題:瑞薩RA MCU眾測(cè)寶典 | 環(huán)境搭建之【RA-Eco-RA4M2】基本模板搭建與LED
文章出處:【微信號(hào):瑞薩嵌入式小百科,微信公眾號(hào):瑞薩嵌入式小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
瑞薩RA-Eco-RA6E2-64PIN-V1.0開(kāi)發(fā)板介紹及環(huán)境搭建指南
【RA-Eco-RA4M2開(kāi)發(fā)板評(píng)測(cè)】1 RA4M2開(kāi)發(fā)環(huán)境搭建
【RA-Eco-RA4M2開(kāi)發(fā)板評(píng)測(cè)】RA-Eco-RA4M2 Keil 開(kāi)發(fā)環(huán)境搭建
【RA-Eco-RA4M2開(kāi)發(fā)板評(píng)測(cè)】2+uart方式
【RA-Eco-RA4M2開(kāi)發(fā)板評(píng)測(cè)】UART測(cè)試實(shí)驗(yàn)
【RA-Eco-RA4M2開(kāi)發(fā)板評(píng)測(cè)】RTC測(cè)試
【RA-Eco-RA6M4開(kāi)發(fā)板評(píng)測(cè)】——2.串口打印
【RA-Eco-RA6M4開(kāi)發(fā)板評(píng)測(cè)】+01+開(kāi)箱測(cè)評(píng)+UART+PWM+LED
【RA-Eco-RA6M4開(kāi)發(fā)板評(píng)測(cè)】介紹、環(huán)境搭建、工程測(cè)試
【瑞薩RA4系列開(kāi)發(fā)板體驗(yàn)】開(kāi)發(fā)環(huán)境搭建和新手點(diǎn)燈指南
【瑞薩RA4系列開(kāi)發(fā)板體驗(yàn)】1 RA4M2開(kāi)發(fā)環(huán)境搭建
【精品聚合】RA-Eco-RA4M2-100PIN開(kāi)發(fā)板試用報(bào)告作品匯總
【瑞薩RA4系列開(kāi)發(fā)板體驗(yàn)】+ 3種瑞薩開(kāi)發(fā)板的比較
【有獎(jiǎng)試用14期】RA-Eco-RA4M2-100PIN開(kāi)發(fā)板
有獎(jiǎng)試用??!RA-Eco-RA4M2-100PIN-V1.0開(kāi)發(fā)板試用活動(dòng)報(bào)名
瑞薩RA-Eco-RA4M2開(kāi)發(fā)板基本模板搭建與LED指南
評(píng)論