10.2.3
hal_entry入口函數(shù)
當(dāng)使用RTOS時(shí),程序從main函數(shù)開始進(jìn)行線程調(diào)度;當(dāng)沒有使用RTOS時(shí),C語(yǔ)言程序的入口函數(shù)main函數(shù)調(diào)用了hal_entry函數(shù)。由于我們新建的工程是沒有選用RTOS的,因此,用戶程序從hal_entry函數(shù)開始執(zhí)行。我們直接打開“srchal_entry.c”文件,在hal_entry函數(shù)里面編寫我們的代碼。
想要實(shí)現(xiàn)LED燈的閃爍效果,其思路非常地簡(jiǎn)單:首先初始化配置LED引腳,然后在一個(gè)死循環(huán)里面重復(fù)此流程:LED燈亮,延時(shí)1s,LED燈滅,延時(shí)1s,然后LED燈又亮。如此反復(fù)循環(huán),就能實(shí)現(xiàn)LED燈的閃爍效果。
首先,我們需要通過(guò)R_IOPORT_Open函數(shù)來(lái)初始化IOPORT模塊,在調(diào)用R_IOPORT_Open函數(shù)時(shí),需要傳入控制塊參數(shù)g_ioport_ctrl和配置參數(shù)g_ioport.p_cfg。
左右滑動(dòng)查看完整內(nèi)容
//調(diào)用 R_IOPORT_Open 函數(shù)來(lái)初始化 IOPORT 模塊 R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
注解
實(shí)際上,由于在R_BSP_WarmStart函數(shù)中已經(jīng)打開了一個(gè)IOPORT模塊,因此并不需要重復(fù)打開IOPORT模塊,雖然重復(fù)打開也不會(huì)出錯(cuò)。R_BSP_WarmStart函數(shù)將會(huì)在后面的“FSP庫(kù)啟動(dòng)文件詳解”章節(jié)介紹到,這里可暫且忽略。
成功打開IOPORT模塊后,說(shuō)明IO引腳已經(jīng)全部初始化完成。接著讓程序繼續(xù)往下執(zhí)行,進(jìn)入到while(1)死循環(huán)。在while(1)循環(huán)里,我們使用R_IOPORT_PinWrite和R_BSP_SoftwareDelay這兩個(gè)函數(shù)來(lái)實(shí)現(xiàn)前面所述的思路。
使用R_IOPORT_PinWrite函數(shù)可以控制引腳的輸出高低電平,從而控制LED燈的亮滅。它的第一個(gè)參數(shù)需要傳入控制塊g_ioport_ctrl,第二個(gè)參數(shù)傳入IO端口和引腳號(hào),第三個(gè)參數(shù)傳入IO引腳電平。
左右滑動(dòng)查看完整內(nèi)容
fsp_err_tR_IOPORT_PinWrite(ioport_ctrl_t*constp_ctrl, bsp_io_port_pin_ →t pin,bsp_io_level_tlevel);
使用R_BSP_SoftwareDelay函數(shù)可以進(jìn)行延時(shí),LED燈維持亮和滅這兩種狀態(tài)的時(shí)間由此函數(shù)決定。它的第一個(gè)參數(shù)表示延時(shí)的時(shí)間量,第二個(gè)參數(shù)表示時(shí)間單位。
左右滑動(dòng)查看完整內(nèi)容
voidR_BSP_SoftwareDelay(uint32_tdelay,bsp_delay_units_tunits);
時(shí)間單位參數(shù)可選:
BSP_DELAY_UNITS_SECONDS,表示秒;
BSP_DELAY_UNITS_MILLISECONDS,表示毫秒;
BSP_DELAY_UNITS_MICROSECONDS,表示微秒。
以啟明6M5開發(fā)板為例,完整代碼如下:代碼清單11_1
列表2:代碼清單10-1:hal_entry入口函數(shù)
左右滑動(dòng)查看完整內(nèi)容
voidhal_entry(void) { /*TODO:add your own code here */ /* 初始化配置引腳(這里重復(fù)初始化了,可以注釋掉) */ R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg); while(1) { R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_ →LEVEL_LOW);//LED1 亮 R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03, BSP_IO_ →LEVEL_LOW);//LED2 亮 R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_ →LEVEL_LOW);//LED3 亮 R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);//延時(shí) 1 秒 R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, BSP_IO_ →LEVEL_HIGH);//LED1 滅 R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03, BSP_IO_ →LEVEL_HIGH);//LED2 滅 R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_ →LEVEL_HIGH);//LED3 滅 R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);//延時(shí) 1 秒 } #ifBSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif }
到此,我們已經(jīng)完全實(shí)現(xiàn)了讓LED閃爍的效果,讀者可以跳到“下載驗(yàn)證”小節(jié)驗(yàn)證其實(shí)際效果。按照編寫驅(qū)動(dòng)程序的一般要求,我們可以把LED的驅(qū)動(dòng)單獨(dú)拿出來(lái),放到獨(dú)立的源文件/頭文件里面進(jìn)行封裝。接下來(lái)將介紹封裝LED設(shè)備驅(qū)動(dòng)程序的一般方法。
10.2.4
封裝LED設(shè)備驅(qū)動(dòng)程序
讓我們重新規(guī)劃一下我們的工程結(jié)構(gòu)。在src文件夾里面新建一個(gè)“l(fā)ed”文件夾,再在該文件夾里面新建兩個(gè)文件:“bsp_led.c”和“bsp_led.h”,如同前面“新建工程”小節(jié)所述,把它們加入到我們的工程中。這兩個(gè)文件的內(nèi)容如下。
列表3:代碼清單10-2:led/bsp_led.h
左右滑動(dòng)查看完整內(nèi)容
#ifndef__BSP_LED_H #define__BSP_LED_H #include"hal_data.h" /* LED 引腳置低電平 LED 燈亮 */ #defineLED1_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, → BSP_IO_LEVEL_LOW) #defineLED2_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03, → BSP_IO_LEVEL_LOW) #defineLED3_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, → BSP_IO_LEVEL_LOW) /* LED 引腳置高電平 LED 燈滅 */ #defineLED1_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00, → BSP_IO_LEVEL_HIGH) #defineLED2_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03, → BSP_IO_LEVEL_HIGH) #defineLED3_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, → BSP_IO_LEVEL_HIGH) /* 使用寄存器來(lái)實(shí)現(xiàn) LED 燈翻轉(zhuǎn) */ #defineLED1_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_00 & 0xFF) #define?LED2_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_03 & 0xFF) #define?LED3_TOGGLE R_PORT4->PODR ^= 1<<(BSP_IO_PORT_04_PIN_04 & 0xFF) /* LED 初始化函數(shù) */ voidLED_Init(void); #endif
列表4:代碼清單10-3:led/bsp_led.c
左右滑動(dòng)查看完整內(nèi)容
#include"bsp_led.h" /* LED 初始化函數(shù) */ voidLED_Init(void) { /* 初始化配置引腳(這里重復(fù)初始化了,可以注釋掉) */ R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg); }
在“hal_entry.c”文件中添加對(duì)頭文件“bsp_led.h”的包含,然后將hal_entry入口函數(shù)的內(nèi)容改為如下。
列表5:代碼清單10-4:hal_entry入口函數(shù)
左右滑動(dòng)查看完整內(nèi)容
/* 用戶頭文件包含 */ #include"led/bsp_led.h" voidhal_entry(void) { /*TODO:add your own code here */ LED_Init();// LED 初始化 while(1) { LED1_ON;// LED1 亮 LED2_ON;// LED2 亮 LED3_ON;// LED3 亮 R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);//延時(shí) 1 秒 LED1_OFF;// LED1 滅 LED2_OFF;// LED2 滅 LED3_OFF;// LED3 滅 R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);//延時(shí) 1 秒 } #ifBSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter(); #endif }
通過(guò)這種方式來(lái)封裝硬件的驅(qū)動(dòng)程序可以使程序看起來(lái)更簡(jiǎn)單與清晰,并且會(huì)讓我們以后的開發(fā)變得更加的順暢。
10.3
下載驗(yàn)證
將程序編譯并下載到開發(fā)板之后,按下復(fù)位按鍵來(lái)復(fù)位開發(fā)板,可以觀察到開發(fā)板上面除了電源指示燈之外的三個(gè)LED燈在同時(shí)緩慢閃爍,三個(gè)LED燈每秒鐘改變一次亮滅的狀態(tài)。
-
瑞薩
+關(guān)注
關(guān)注
36文章
22388瀏覽量
88105 -
引腳
+關(guān)注
關(guān)注
16文章
1759瀏覽量
53019 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4383瀏覽量
65008 -
代碼
+關(guān)注
關(guān)注
30文章
4902瀏覽量
70862
原文標(biāo)題:hal_entry入口函數(shù)——瑞薩RA系列FSP庫(kù)開發(fā)實(shí)戰(zhàn)指南(24)
文章出處:【微信號(hào):瑞薩MCU小百科,微信公眾號(hào):瑞薩MCU小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
【RA-Eco-RA4E2-64PIN-V1.0開發(fā)板試用】MDK+點(diǎn)燈+流水燈
【小e物聯(lián)網(wǎng)試用體驗(yàn)】之修改程序入口函數(shù)
HAL庫(kù)部分常用函數(shù)名稱及作用

STM32HAL庫(kù)函數(shù)

STM32F4xx usb庫(kù)源碼詳解:HAL_PCDEx_SetRxFiFo 和 HAL_PCDEx_SetTxFiFo

基于標(biāo)準(zhǔn)庫(kù)函數(shù)與基于HAL庫(kù)函數(shù)的stm32編程方式對(duì)比

STM32 HAL 庫(kù)延時(shí)函數(shù) HAL_Delay 解析

HAL庫(kù)常用函數(shù)匯總

RA Swap模式在FSP中的支持(1)

如何獲取入口函數(shù)不是__iar_program_start的Program entry的stack使用情況

評(píng)論