查看: 183|回复: 0

【瑞萨FPB-RA4E2快速原型板】2、呼吸灯效果

[复制链接]

18

主题

87

帖子

5374

积分

论坛元老

Rank: 8Rank: 8

积分
5374
发表于 2024-11-20 15:59:16 | 显示全部楼层 |阅读模式
[size=21.3333px]【瑞萨FPB-RA4E2快速原型板】2、呼吸灯效果
1、开发板简介
FPB-RA4E2快速原型板上有2个用户LED。


2、程序
  1. #include "hal_data.h" // 包含硬件抽象层(HAL)的数据头文件,提供对板级硬件资源的访问

  2. void R_BSP_WarmStart(bsp_warm_start_event_t event); // 声明暖启动函数,用于在启动过程中配置系统

  3. extern bsp_leds_t g_bsp_leds; // 声明一个外部的LED结构体,包含板上LED的配置信息

  4. /*******************************************************************************************************************//**
  5. * @brief  呼吸灯示例应用程序
  6. *
  7. * 通过使用软件PWM逐渐增加和减少LED亮度来模拟呼吸效果。
  8. *
  9. **********************************************************************************************************************/
  10. void hal_entry (void)
  11. {
  12. #if BSP_TZ_SECURE_BUILD
  13.     /* 如果使用TrustZone安全构建,进入非安全代码区域 */
  14.     R_BSP_NonSecureEnter();
  15. #endif

  16.     /* 定义用于软件延迟函数的时间单位 */
  17.     const bsp_delay_units_t bsp_delay_units = BSP_DELAY_UNITS_MILLISECONDS; // 延迟单位:毫秒

  18.     /* 获取当前板子的LED信息 */
  19.     bsp_leds_t leds = g_bsp_leds;

  20.     /* 如果此开发板上没有LED,则进入死循环 */
  21.     if (0 == leds.led_count)
  22.     {
  23.         while (1)
  24.         {
  25.             ; // 没有LED可用,程序停在这里
  26.         }
  27.     }

  28.     /* 定义控制亮度的变量 */
  29.     uint32_t brightness = 0;           // 亮度级别,初始为0(范围:0到max_brightness)
  30.     int32_t step = 1;                  // 亮度变化的步进值,用于递增或递减亮度
  31.     const uint32_t max_brightness = 100; // 最大亮度值,定义亮度的上限

  32.     /* 每个步骤的延迟时间(可调整以改变呼吸效果的速度) */
  33.     const uint32_t delay_time = 10;    // 每一步延迟10毫秒

  34.     while (1) // 主循环
  35.     {
  36.         /* 使能对PFS(引脚功能选择)寄存器的访问 */
  37.         R_BSP_PinAccessEnable();

  38.         /* 通过根据亮度设置LED的开启和关闭时间来模拟PWM */
  39.         for (uint32_t i = 0; i < leds.led_count; i++) // 遍历所有可用的LED
  40.         {
  41.             /* 获取要控制的引脚编号 */
  42.             uint32_t pin = leds.p_leds[i];

  43.             /* 根据亮度百分比的时间点亮LED */
  44.             R_BSP_PinWrite((bsp_io_port_pin_t) pin, BSP_IO_LEVEL_HIGH); // 将引脚设置为高电平,点亮LED
  45.             R_BSP_SoftwareDelay((brightness * delay_time) / max_brightness, bsp_delay_units); // 按照亮度比例延迟

  46.             /* 在剩余的时间内关闭LED */
  47.             R_BSP_PinWrite((bsp_io_port_pin_t) pin, BSP_IO_LEVEL_LOW); // 将引脚设置为低电平,关闭LED
  48.             R_BSP_SoftwareDelay(((max_brightness - brightness) * delay_time) / max_brightness, bsp_delay_units); // 按照剩余比例延迟
  49.         }

  50.         /* 禁止对PFS寄存器的访问以保护它们 */
  51.         R_BSP_PinAccessDisable();

  52.         /* 更新亮度以实现呼吸效果 */
  53.         brightness += step; // 增加或减少亮度

  54.         /* 当达到亮度的最大或最小值时,反转步进方向 */
  55.         if (brightness == max_brightness || brightness == 0)
  56.         {
  57.             step = -step; // 改变步进的方向,实现亮度的循环增减
  58.         }
  59.     }
  60. }

  61. /*******************************************************************************************************************//**
  62. * 该函数在启动过程中的不同点被调用。此实现使用了在main()函数之前调用的事件来设置引脚。
  63. *
  64. * @param[in]  event    当前启动过程中的事件位置
  65. **********************************************************************************************************************/
  66. void R_BSP_WarmStart (bsp_warm_start_event_t event)
  67. {
  68.     if (BSP_WARM_START_RESET == event) // 系统复位后的第一阶段
  69.     {
  70. #if BSP_FEATURE_FLASH_LP_VERSION != 0
  71.         /* 使能从数据闪存读取 */
  72.         R_FACI_LP->DFLCTL = 1U; // 设置DFLCTL为1,允许数据闪存读取
  73. #endif
  74.     }

  75.     if (BSP_WARM_START_POST_C == event) // C运行时环境初始化之后
  76.     {
  77.         /* C运行时环境和系统时钟已设置 */
  78.         /* 通过打开IOPORT模块来配置引脚 */
  79.         R_IOPORT_Open(&g_ioport_ctrl, g_ioport.p_cfg); // 初始化I/O端口配置
  80.     }
  81. }
复制代码
·        引入头文件和声明函数:
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、效果


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

用户排行榜

RA助手

主题: 116帖子:136精华:0

RA_Lance

主题: 94帖子:138精华:9

lugl

主题: 53帖子:152精华:1

xujiwei263

主题: 18帖子:87精华:0

Juggernaut

主题: 12帖子:118精华:0

books咦

主题: 11帖子:11精华:2
快速回复 返回顶部 返回列表