0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解hal_entry入口函数

瑞萨MCU小百科 ? 来源:野火电子 ? 2025-07-25 15:34 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    main函数不一定就是程序入口

    我们都知道,main函数是C程序的入口,那这个入口能不能修改?
    发表于 06-15 17:09 ?813次阅读

    【RA-Eco-RA4E2-64PIN-V1.0开发板试用】MDK+点灯+流水灯

    调用了 hal_entry 函数。 由于我们新建的工程是没有选用 RTOS 的,因此,用户程序从 hal_entry 函数开始执行。 我们直接打开 “\\\\src\\\\
    发表于 12-15 15:59

    【小e物联网试用体验】之修改程序入口函数

    入口函数名然后如下图所示,修改ld脚本的entry命令,将命令的选项设置为函数名最后修改gen_appbin.py工具脚本,如下图所示,将入口
    发表于 07-10 18:00

    PICC库函数详解

    PICC库函数详解
    发表于 04-18 20:13 ?132次下载

    Cadance安装入口详解

    Cadance安装入口详解
    发表于 12-04 16:00 ?0次下载

    STM32F4 HAL函数说明下载

    STM32F4 HAL函数说明下载
    发表于 05-26 09:27 ?79次下载

    HAL库部分常用函数名称及作用

    HAL带msp的函数功能:MCU Specific Package 单片机的具体方案,即MSP是指和MCU相关的初始化HAL带MX前缀的函数:应该是与CubeMX相关(可能是与MX通用
    发表于 11-30 10:51 ?9次下载
    <b class='flag-5'>HAL</b>库部分常用<b class='flag-5'>函数</b>名称及作用

    STM32HAL函数

    函数的主要功能是将我们在1函数初始化之后的引脚恢复成默认的状态,即各个寄存器复位时的值例:HAL_GPIO_DeInit(GPIOx,GPIO_PIN_X);(2)HAL_GPIO_E
    发表于 12-04 18:06 ?218次下载
    STM32<b class='flag-5'>HAL</b>库<b class='flag-5'>函数</b>

    STM32F4xx usb库源码详解HAL_PCDEx_SetRxFiFo 和 HAL_PCDEx_SetTxFiFo

    HAL_PCDEx_SetRxFiFo 和 HAL_PCDEx_SetTxFiFo这两个函数的作用是:该EndPoint数据传输最大数量的限定除前面贴子里廛的影响数据传输量的函数外,这
    发表于 12-20 19:33 ?9次下载
    STM32F4xx usb库源码<b class='flag-5'>详解</b>:<b class='flag-5'>HAL</b>_PCDEx_SetRxFiFo 和 <b class='flag-5'>HAL</b>_PCDEx_SetTxFiFo

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

    以实例程序(串口通信),分析基于标准库函数与基于HAL函数的stm32编程方式的差异一、基于标准库函数的stm32编程方式二、基于HAL
    发表于 12-28 19:09 ?30次下载
    基于标准库<b class='flag-5'>函数</b>与基于<b class='flag-5'>HAL</b>库<b class='flag-5'>函数</b>的stm32编程方式对比

    STM32 HAL 库延时函数 HAL_Delay 解析

    HAL 库有提供延时函数,只不过它只能实现简单的毫秒级别延时,没有实现 us 级别延时。下面我们列出HAL 库实现延时相关的函数。首先是功能配置函数
    发表于 01-17 09:48 ?8次下载
    STM32 <b class='flag-5'>HAL</b> 库延时<b class='flag-5'>函数</b> <b class='flag-5'>HAL</b>_Delay 解析

    HAL库常用函数汇总

    1,系统函数HAL_Delay原型:voidHAL_Delay(uint32_tDelay);作用:利用滴答定时器生成的系统延迟函数参数:Delay:延迟时间,单位是ms返回值:无示例代码
    的头像 发表于 11-29 08:00 ?5203次阅读
    <b class='flag-5'>HAL</b>库常用<b class='flag-5'>函数</b>汇总

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

    Assistance找到Call Quick Setup,鼠标左键点选,保持左键按下的状态,拖动到hal_entry.c文件的hal_entry()函数定义之前。
    的头像 发表于 08-22 10:27 ?943次阅读
    RA Swap模式在FSP中的支持(1)

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

    entry的stack使用相关信息: 如果对应启动代码没有使用默认的入口函数__iar_program_start,需要使用--entry链接器选项指定对应的
    的头像 发表于 11-25 16:23 ?1082次阅读
    如何获取<b class='flag-5'>入口</b><b class='flag-5'>函数</b>不是__iar_program_start的Program <b class='flag-5'>entry</b>的stack使用情况

    HAL库的函数调用示例

    HAL(Hardware Abstraction Layer,硬件抽象层)库是STM32等微控制器中常用的库,它为开发者提供了访问和控制硬件设备的接口。以下是一些常用的HAL函数及其调用示例: 一
    的头像 发表于 12-02 14:01 ?1652次阅读