10.2.3
hal_entry入口函数
当使用RTOS时,程序从main函数开始进行线程调度;当没有使用RTOS时,C语言程序的入口函数main函数调用了hal_entry函数。由于我们新建的工程是没有选用RTOS的,因此,用户程序从hal_entry函数开始执行。我们直接打开“srchal_entry.c”文件,在hal_entry函数里面编写我们的代码。
想要实现LED灯的闪烁效果,其思路非常地简单:首先初始化配置LED引脚,然后在一个死循环里面重复此流程:LED灯亮,延时1s,LED灯灭,延时1s,然后LED灯又亮。如此反复循环,就能实现LED灯的闪烁效果。
首先,我们需要通过R_IOPORT_Open函数来初始化IOPORT模块,在调用R_IOPORT_Open函数时,需要传入控制块参数g_ioport_ctrl和配置参数g_ioport.p_cfg。
左右滑动查看完整内容
//调用 R_IOPORT_Open 函数来初始化 IOPORT 模块 R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
注解
实际上,由于在R_BSP_WarmStart函数中已经打开了一个IOPORT模块,因此并不需要重复打开IOPORT模块,虽然重复打开也不会出错。R_BSP_WarmStart函数将会在后面的“FSP库启动文件详解”章节介绍到,这里可暂且忽略。
成功打开IOPORT模块后,说明IO引脚已经全部初始化完成。接着让程序继续往下执行,进入到while(1)死循环。在while(1)循环里,我们使用R_IOPORT_PinWrite和R_BSP_SoftwareDelay这两个函数来实现前面所述的思路。
使用R_IOPORT_PinWrite函数可以控制引脚的输出高低电平,从而控制LED灯的亮灭。它的第一个参数需要传入控制块g_ioport_ctrl,第二个参数传入IO端口和引脚号,第三个参数传入IO引脚电平。
左右滑动查看完整内容
fsp_err_tR_IOPORT_PinWrite(ioport_ctrl_t*constp_ctrl, bsp_io_port_pin_ →t pin,bsp_io_level_tlevel);
使用R_BSP_SoftwareDelay函数可以进行延时,LED灯维持亮和灭这两种状态的时间由此函数决定。它的第一个参数表示延时的时间量,第二个参数表示时间单位。
左右滑动查看完整内容
voidR_BSP_SoftwareDelay(uint32_tdelay,bsp_delay_units_tunits);
时间单位参数可选:
BSP_DELAY_UNITS_SECONDS,表示秒;
BSP_DELAY_UNITS_MILLISECONDS,表示毫秒;
BSP_DELAY_UNITS_MICROSECONDS,表示微秒。
以启明6M5开发板为例,完整代码如下:代码清单11_1
列表2:代码清单10-1:hal_entry入口函数
左右滑动查看完整内容
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 }
到此,我们已经完全实现了让LED闪烁的效果,读者可以跳到“下载验证”小节验证其实际效果。按照编写驱动程序的一般要求,我们可以把LED的驱动单独拿出来,放到独立的源文件/头文件里面进行封装。接下来将介绍封装LED设备驱动程序的一般方法。
10.2.4
封装LED设备驱动程序
让我们重新规划一下我们的工程结构。在src文件夹里面新建一个“led”文件夹,再在该文件夹里面新建两个文件:“bsp_led.c”和“bsp_led.h”,如同前面“新建工程”小节所述,把它们加入到我们的工程中。这两个文件的内容如下。
列表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) /* 使用寄存器来实现 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 初始化函数 */ voidLED_Init(void); #endif
列表4:代码清单10-3:led/bsp_led.c
左右滑动查看完整内容
#include"bsp_led.h" /* LED 初始化函数 */ voidLED_Init(void) { /* 初始化配置引脚(这里重复初始化了,可以注释掉) */ R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg); }
在“hal_entry.c”文件中添加对头文件“bsp_led.h”的包含,然后将hal_entry入口函数的内容改为如下。
列表5:代码清单10-4:hal_entry入口函数
左右滑动查看完整内容
/* 用户头文件包含 */ #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 }
通过这种方式来封装硬件的驱动程序可以使程序看起来更简单与清晰,并且会让我们以后的开发变得更加的顺畅。
10.3
下载验证
将程序编译并下载到开发板之后,按下复位按键来复位开发板,可以观察到开发板上面除了电源指示灯之外的三个LED灯在同时缓慢闪烁,三个LED灯每秒钟改变一次亮灭的状态。
-
瑞萨
+关注
关注
36文章
22388浏览量
88107 -
引脚
+关注
关注
16文章
1759浏览量
53028 -
函数
+关注
关注
3文章
4383浏览量
65020 -
代码
+关注
关注
30文章
4902浏览量
70871
原文标题:hal_entry入口函数——瑞萨RA系列FSP库开发实战指南(24)
文章出处:【微信号:瑞萨MCU小百科,微信公众号:瑞萨MCU小百科】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】MDK+点灯+流水灯
【小e物联网试用体验】之修改程序入口函数
HAL库部分常用函数名称及作用

STM32HAL库函数

STM32F4xx usb库源码详解:HAL_PCDEx_SetRxFiFo 和 HAL_PCDEx_SetTxFiFo

基于标准库函数与基于HAL库函数的stm32编程方式对比

STM32 HAL 库延时函数 HAL_Delay 解析

HAL库常用函数汇总

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

如何获取入口函数不是__iar_program_start的Program entry的stack使用情况

评论