详解hal_entry入口函数

描述

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 * const p_ctrl, bsp_io_port_pin_
→t pin, bsp_io_level_t level);

 

使用R_BSP_SoftwareDelay函数可以进行延时,LED灯维持亮和灭这两种状态的时间由此函数决定。它的第一个参数表示延时的时间量,第二个参数表示时间单位。

左右滑动查看完整内容

 

voidR_BSP_SoftwareDelay(uint32_t delay, bsp_delay_units_t units);

 

时间单位参数可选:

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 秒
}
#if BSP_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 灯亮 */
#define LED1_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00,
→ BSP_IO_LEVEL_LOW)
#define LED2_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03,
→ BSP_IO_LEVEL_LOW)
#define LED3_ON R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04,
→ BSP_IO_LEVEL_LOW)
/* LED 引脚置高电平 LED 灯灭 */
#define LED1_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_00,
→ BSP_IO_LEVEL_HIGH)
#define LED2_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_03,
→ BSP_IO_LEVEL_HIGH)
#define LED3_OFF R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04,
→ BSP_IO_LEVEL_HIGH)
/* 使用寄存器来实现 LED 灯翻转 */
#define LED1_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 秒
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

 

通过这种方式来封装硬件的驱动程序可以使程序看起来更简单与清晰,并且会让我们以后的开发变得更加的顺畅。

10.3

下载验证

将程序编译并下载到开发板之后,按下复位按键来复位开发板,可以观察到开发板上面除了电源指示灯之外的三个LED灯在同时缓慢闪烁,三个LED灯每秒钟改变一次亮灭的状态。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分