[size=21.3333px]【瑞萨FPB-RA4E2快速原型板】2、呼吸灯效果 1、开发板简介 FPB-RA4E2快速原型板上有2个用户LED。
2、程序 - #include "hal_data.h" // 包含硬件抽象层(HAL)的数据头文件,提供对板级硬件资源的访问
- void R_BSP_WarmStart(bsp_warm_start_event_t event); // 声明暖启动函数,用于在启动过程中配置系统
- extern bsp_leds_t g_bsp_leds; // 声明一个外部的LED结构体,包含板上LED的配置信息
- /*******************************************************************************************************************//**
- * @brief 呼吸灯示例应用程序
- *
- * 通过使用软件PWM逐渐增加和减少LED亮度来模拟呼吸效果。
- *
- **********************************************************************************************************************/
- void hal_entry (void)
- {
- #if BSP_TZ_SECURE_BUILD
- /* 如果使用TrustZone安全构建,进入非安全代码区域 */
- R_BSP_NonSecureEnter();
- #endif
- /* 定义用于软件延迟函数的时间单位 */
- const bsp_delay_units_t bsp_delay_units = BSP_DELAY_UNITS_MILLISECONDS; // 延迟单位:毫秒
- /* 获取当前板子的LED信息 */
- bsp_leds_t leds = g_bsp_leds;
- /* 如果此开发板上没有LED,则进入死循环 */
- if (0 == leds.led_count)
- {
- while (1)
- {
- ; // 没有LED可用,程序停在这里
- }
- }
- /* 定义控制亮度的变量 */
- uint32_t brightness = 0; // 亮度级别,初始为0(范围:0到max_brightness)
- int32_t step = 1; // 亮度变化的步进值,用于递增或递减亮度
- const uint32_t max_brightness = 100; // 最大亮度值,定义亮度的上限
- /* 每个步骤的延迟时间(可调整以改变呼吸效果的速度) */
- const uint32_t delay_time = 10; // 每一步延迟10毫秒
- while (1) // 主循环
- {
- /* 使能对PFS(引脚功能选择)寄存器的访问 */
- R_BSP_PinAccessEnable();
- /* 通过根据亮度设置LED的开启和关闭时间来模拟PWM */
- for (uint32_t i = 0; i < leds.led_count; i++) // 遍历所有可用的LED
- {
- /* 获取要控制的引脚编号 */
- uint32_t pin = leds.p_leds[i];
- /* 根据亮度百分比的时间点亮LED */
- R_BSP_PinWrite((bsp_io_port_pin_t) pin, BSP_IO_LEVEL_HIGH); // 将引脚设置为高电平,点亮LED
- R_BSP_SoftwareDelay((brightness * delay_time) / max_brightness, bsp_delay_units); // 按照亮度比例延迟
- /* 在剩余的时间内关闭LED */
- R_BSP_PinWrite((bsp_io_port_pin_t) pin, BSP_IO_LEVEL_LOW); // 将引脚设置为低电平,关闭LED
- R_BSP_SoftwareDelay(((max_brightness - brightness) * delay_time) / max_brightness, bsp_delay_units); // 按照剩余比例延迟
- }
- /* 禁止对PFS寄存器的访问以保护它们 */
- R_BSP_PinAccessDisable();
- /* 更新亮度以实现呼吸效果 */
- brightness += step; // 增加或减少亮度
- /* 当达到亮度的最大或最小值时,反转步进方向 */
- if (brightness == max_brightness || brightness == 0)
- {
- step = -step; // 改变步进的方向,实现亮度的循环增减
- }
- }
- }
- /*******************************************************************************************************************//**
- * 该函数在启动过程中的不同点被调用。此实现使用了在main()函数之前调用的事件来设置引脚。
- *
- * @param[in] event 当前启动过程中的事件位置
- **********************************************************************************************************************/
- void R_BSP_WarmStart (bsp_warm_start_event_t event)
- {
- if (BSP_WARM_START_RESET == event) // 系统复位后的第一阶段
- {
- #if BSP_FEATURE_FLASH_LP_VERSION != 0
- /* 使能从数据闪存读取 */
- R_FACI_LP->DFLCTL = 1U; // 设置DFLCTL为1,允许数据闪存读取
- #endif
- }
- if (BSP_WARM_START_POST_C == event) // C运行时环境初始化之后
- {
- /* C运行时环境和系统时钟已设置 */
- /* 通过打开IOPORT模块来配置引脚 */
- R_IOPORT_Open(&g_ioport_ctrl, g_ioport.p_cfg); // 初始化I/O端口配置
- }
- }
复制代码· 引入头文件和声明函数: o #include"hal_data.h":包含硬件抽象层的数据头文件,这使得程序可以使用硬件相关的函数和定义。 o voidR_BSP_WarmStart(bsp_warm_start_event_t event);:声明暖启动函数,用于在系统启动时配置硬件。 o extern bsp_leds_tg_bsp_leds;:声明外部LED配置结构体,获取板子上LED的信息。 · 主函数 hal_entry: o 安全区域检查: § #if BSP_TZ_SECURE_BUILD:如果使用TrustZone安全构建,进入非安全区域代码。 o 定义延迟单位: § const bsp_delay_units_tbsp_delay_units = BSP_DELAY_UNITS_MILLISECONDS;:将延迟单位设置为毫秒,供软件延迟函数使用。 o 获取LED信息: § bsp_leds_t leds =g_bsp_leds;:获取当前板子上LED的数量和引脚信息。 o 检查是否有LED: § 如果板子上没有LED(leds.led_count == 0),则进入无限循环,程序停止运行。 o 亮度控制变量: § uint32_t brightness:亮度值,初始为0。 § int32_t step:亮度变化的步进值,初始为1,表示亮度每次增加1。 § const uint32_tmax_brightness:最大亮度值,定义亮度的上限为100。 § const uint32_t delay_time:每个步骤的延迟时间,这里设置为10毫秒,可以调整此值来改变呼吸效果的速度。 o 主循环: § 使用while (1)进入无限循环,不断执行呼吸灯效果。 § 使能引脚访问: § R_BSP_PinAccessEnable();:允许对引脚功能选择寄存器的访问,方便后续配置。 § 模拟PWM控制LED亮度: § 遍历所有LED,引脚保存在leds.p_leds数组中。 § 点亮LED: § R_BSP_PinWrite((bsp_io_port_pin_t) pin, BSP_IO_LEVEL_HIGH);:将LED引脚设置为高电平,点亮LED。 § 计算点亮时间:(brightness * delay_time) / max_brightness,根据当前亮度占最大亮度的比例,计算应该点亮的时间。 § R_BSP_SoftwareDelay(...):软件延迟函数,延迟指定的时间。 § 关闭LED: § R_BSP_PinWrite((bsp_io_port_pin_t) pin, BSP_IO_LEVEL_LOW);:将LED引脚设置为低电平,关闭LED。 § 计算关闭时间:((max_brightness - brightness) * delay_time) / max_brightness,剩余的时间用于关闭LED。 § 通过快速开启和关闭LED,并调整开启时间和关闭时间的比例,模拟PWM,从而控制LED的亮度。 § 禁止引脚访问: § R_BSP_PinAccessDisable();:禁用对引脚功能选择寄存器的访问,保护寄存器不被意外修改。 § 更新亮度值: § brightness += step;:根据步进值更新亮度。 § 方向反转: § 当亮度达到最大值或最小值时,反转步进方向,即step = -step;,这样亮度会在0和最大值之间来回变化,形成呼吸效果。 · 暖启动函数 R_BSP_WarmStart: o 复位事件处理: § if (BSP_WARM_START_RESET ==event):当系统刚复位时执行的代码。 § 使能数据闪存读取: § R_FACI_LP->DFLCTL = 1U;:设置DFLCTL寄存器,允许从数据闪存读取。这在有些微控制器中是必要的初始化步骤。 o C运行时环境初始化完成后: § if (BSP_WARM_START_POST_C ==event):在C库初始化和系统时钟配置完成后执行的代码。 § 配置引脚:
§ R_IOPORT_Open(&g_ioport_ctrl,g_ioport.p_cfg);:初始化IO端口配置,根据板子的具体配置文件设置引脚的功能。
3、效果
|