10.2.3
hal_entry入口函數(shù)
當使用RTOS時,程序從main函數(shù)開始進行線程調度;當沒有使用RTOS時,C語言程序的入口函數(shù)main函數(shù)調用了hal_entry函數(shù)。由于我們新建的工程是沒有選用RTOS的,因此,用戶程序從hal_entry函數(shù)開始執(zhí)行。我們直接打開“srchal_entry.c”文件,在hal_entry函數(shù)里面編寫我們的代碼。
想要實現(xiàn)LED燈的閃爍效果,其思路非常地簡單:首先初始化配置LED引腳,然后在一個死循環(huán)里面重復此流程:LED燈亮,延時1s,LED燈滅,延時1s,然后LED燈又亮。如此反復循環(huán),就能實現(xiàn)LED燈的閃爍效果。
首先,我們需要通過R_IOPORT_Open函數(shù)來初始化IOPORT模塊,在調用R_IOPORT_Open函數(shù)時,需要傳入控制塊參數(shù)g_ioport_ctrl和配置參數(shù)g_ioport.p_cfg。
左右滑動查看完整內容
//調用 R_IOPORT_Open 函數(shù)來初始化 IOPORT 模塊 R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
注解
實際上,由于在R_BSP_WarmStart函數(shù)中已經(jīng)打開了一個IOPORT模塊,因此并不需要重復打開IOPORT模塊,雖然重復打開也不會出錯。R_BSP_WarmStart函數(shù)將會在后面的“FSP庫啟動文件詳解”章節(jié)介紹到,這里可暫且忽略。
成功打開IOPORT模塊后,說明IO引腳已經(jīng)全部初始化完成。接著讓程序繼續(xù)往下執(zhí)行,進入到while(1)死循環(huán)。在while(1)循環(huán)里,我們使用R_IOPORT_PinWrite和R_BSP_SoftwareDelay這兩個函數(shù)來實現(xiàn)前面所述的思路。
使用R_IOPORT_PinWrite函數(shù)可以控制引腳的輸出高低電平,從而控制LED燈的亮滅。它的第一個參數(shù)需要傳入控制塊g_ioport_ctrl,第二個參數(shù)傳入IO端口和引腳號,第三個參數(shù)傳入IO引腳電平。
左右滑動查看完整內容
fsp_err_tR_IOPORT_PinWrite(ioport_ctrl_t*constp_ctrl, bsp_io_port_pin_ →t pin,bsp_io_level_tlevel);
使用R_BSP_SoftwareDelay函數(shù)可以進行延時,LED燈維持亮和滅這兩種狀態(tài)的時間由此函數(shù)決定。它的第一個參數(shù)表示延時的時間量,第二個參數(shù)表示時間單位。
左右滑動查看完整內容
voidR_BSP_SoftwareDelay(uint32_tdelay,bsp_delay_units_tunits);
時間單位參數(shù)可選:
BSP_DELAY_UNITS_SECONDS,表示秒;
BSP_DELAY_UNITS_MILLISECONDS,表示毫秒;
BSP_DELAY_UNITS_MICROSECONDS,表示微秒。
以啟明6M5開發(fā)板為例,完整代碼如下:代碼清單11_1
列表2:代碼清單10-1:hal_entry入口函數(shù)
左右滑動查看完整內容
voidhal_entry(void)
{
/*TODO:add your own code here */
/* 初始化配置引腳(這里重復初始化了,可以注釋掉) */
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);//延時 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);//延時 1 秒
}
#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
到此,我們已經(jīng)完全實現(xiàn)了讓LED閃爍的效果,讀者可以跳到“下載驗證”小節(jié)驗證其實際效果。按照編寫驅動程序的一般要求,我們可以把LED的驅動單獨拿出來,放到獨立的源文件/頭文件里面進行封裝。接下來將介紹封裝LED設備驅動程序的一般方法。
10.2.4
封裝LED設備驅動程序
讓我們重新規(guī)劃一下我們的工程結構。在src文件夾里面新建一個“l(fā)ed”文件夾,再在該文件夾里面新建兩個文件:“bsp_led.c”和“bsp_led.h”,如同前面“新建工程”小節(jié)所述,把它們加入到我們的工程中。這兩個文件的內容如下。
列表3:代碼清單10-2:led/bsp_led.h
左右滑動查看完整內容
#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) /* 使用寄存器來實現(xiàn) LED 燈翻轉 */ #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
左右滑動查看完整內容
#include"bsp_led.h"
/* LED 初始化函數(shù) */
voidLED_Init(void)
{
/* 初始化配置引腳(這里重復初始化了,可以注釋掉) */
R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
}
在“hal_entry.c”文件中添加對頭文件“bsp_led.h”的包含,然后將hal_entry入口函數(shù)的內容改為如下。
列表5:代碼清單10-4:hal_entry入口函數(shù)
左右滑動查看完整內容
/* 用戶頭文件包含 */
#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);//延時 1 秒
LED1_OFF;// LED1 滅
LED2_OFF;// LED2 滅
LED3_OFF;// LED3 滅
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS);//延時 1 秒
}
#ifBSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
通過這種方式來封裝硬件的驅動程序可以使程序看起來更簡單與清晰,并且會讓我們以后的開發(fā)變得更加的順暢。
10.3
下載驗證
將程序編譯并下載到開發(fā)板之后,按下復位按鍵來復位開發(fā)板,可以觀察到開發(fā)板上面除了電源指示燈之外的三個LED燈在同時緩慢閃爍,三個LED燈每秒鐘改變一次亮滅的狀態(tài)。
-
瑞薩
+關注
關注
37文章
22482瀏覽量
90901 -
引腳
+關注
關注
16文章
2111瀏覽量
55710 -
函數(shù)
+關注
關注
3文章
4417瀏覽量
67547 -
代碼
+關注
關注
30文章
4968瀏覽量
74004
發(fā)布評論請先 登錄
【RA-Eco-RA4E2-64PIN-V1.0開發(fā)板試用】MDK+點燈+流水燈
【小e物聯(lián)網(wǎng)試用體驗】之修改程序入口函數(shù)
HAL庫部分常用函數(shù)名稱及作用
STM32HAL庫函數(shù)
STM32F4xx usb庫源碼詳解:HAL_PCDEx_SetRxFiFo 和 HAL_PCDEx_SetTxFiFo
基于標準庫函數(shù)與基于HAL庫函數(shù)的stm32編程方式對比
STM32 HAL 庫延時函數(shù) HAL_Delay 解析
HAL庫常用函數(shù)匯總
RA Swap模式在FSP中的支持(1)
如何獲取入口函數(shù)不是__iar_program_start的Program entry的stack使用情況
詳解hal_entry入口函數(shù)
評論