FSP 介绍
FSP 全称为 Flexible Software Package ,中文译为 灵活软件包 ,FSP网址。FSP 寄存器文档
灵活软件包(FSP)是一款增强型软件包,旨在为使用瑞萨RA系列Arm微控制器的嵌入式系统设计提供用户友好、可扩展、高质量的软件,确保RA系列从入门级到高性能微控制器的软件兼容性,FSP提供了一种快速而通用的方式来构建安全的物联网设备,使用生产就绪的驱动程序,Azure®RTOS, FreeRTOS™和其他中间件堆栈。
FSP 框架如下图所示:
注:FSP采用ISO/IEC 9899:1999 (C99) C编程语言标准。特定的功能C99中引入的所使用的类型包括标准整数类型(stint .h),布尔类型(stdbool.h),指定初始化器,以及混合声明和代码的能力。
FSP 文件结构
解释:
- ra_gen:包含由RA Configuration编辑器生成的代码
- ra:文件夹的文件夹被分为源文件夹和包含文件夹。包含文件夹与源代码分开,以便于浏览和设置包含路径。
- ra_cfg:文件夹存放每个模块的配置头文件。
⚠️Generate Project Content
任何由软件生成的文件用户都不要去编辑!因为在每次进行 FSP 配置之后,软件会自动重新创建这些文件,所做的任何操作都将被覆盖。
FSP 框架说明
上面的相关概念我这里就不在转述了,其实 FSP 的核心组成就是模块,所有的模块都共享向上提供功能接口,向下请求功能的基本要求。若是有多个模块彼此分层,就是形成一个 FSP stack ,通过将一个模块的内容与另一个模块的内容进行匹配来实现。例如,SPI模块(SPI (r_spi))需要一个模块提供传输接口(transfer interface)在没有CPU中断的情况下发送或接收数据。可以满足传输接口的要求由DTC驱动模块传输(r_dtc)。通过这种方法,相同的代码可以被多个模块同时共享。的下面的示例说明了相同的DTC模块如何与SPI (SPI (r_spi)), UART (UART)一起使用(r_sci_uart))和SDHI (SD/MMC (r_sdhi))。
函数说明
R_IOPORT_PinWrite
设置引脚的输出为高或低。
fsp_err_t R_IOPORT_PinWrite ( ioport_ctrl_t *const p_ctrl, bsp_io_port_pin_t pin, bsp_io_level_tlevel )
函数参数和返回值含义如下:
参数:
- ioport_ctrl_t 结构体:IO 端口模块的控制句柄,需通过 R_IOPORT_Open() 函数初始化后传入。若传入 NULL,函数将返回 FSP_ERR_ASSERTION。
- bsp_io_port_pin_t 枚举值:指定要操作的目标引脚,例如 BSP_IO_PORT_4_PIN_02(表示 P402 引脚),若传入无效引脚,返回 FSP_ERR_INVALID_ARGUMENT。
- bsp_io_level_t 枚举值:指定引脚输出电平,通常为 BSP_IO_LEVEL_HIGH(高电平),BSP_IO_LEVEL_LOW(低电平),若传入无效值,返回 FSP_ERR_INVALID_ARGUMENT。
返回:
- FSP_SUCCESS :引脚设置成功,引脚电平已更新
- FSP_ERR_INVALID_ARGUMENT :pin 或 level 参数无效。
- FSP_ERR_NOT_OPEN :IO 端口模块未通过 R_IOPORT_Open() 初始化。
- FSP_ERR_ASSERTION :p_ctrl 为 NULL
R_IOPORT_PinRead
读取引脚的输入状态。
fsp_err_t R_IOPORT_PinRead ( ioport_ctrl_t *const p_ctrl, bsp_io_port_pin_t pin, bsp_io_level_t *p_pin_value )
函数参数和返回值含义如下:
参数:
- ioport_ctrl_t 结构体:IO 端口模块的控制句柄,需通过 R_IOPORT_Open() 函数初始化后传入。若传入 NULL,函数将返回 FSP_ERR_ASSERTION。
- bsp_io_port_pin_t 枚举值:指定要读取的目标引脚,例如 BSP_IO_PORT_4_PIN_02(表示 P402 引脚),若传入无效引脚,返回 FSP_ERR_INVALID_ARGUMENT。
- bsp_io_level_t 枚举值:用于存储读取到的引脚电平,可能的值为 BSP_IO_LEVEL_HIGH(高电平),BSP_IO_LEVEL_LOW(低电平),若传入无效值,返回 FSP_ERR_INVALID_ARGUMENT。
返回:
- FSP_SUCCESS :引脚设置成功,引脚电平已更新
- FSP_ERR_INVALID_ARGUMENT :pin 或 level 参数无效。
- FSP_ERR_NOT_OPEN :IO 端口模块未通过 R_IOPORT_Open() 初始化。
- FSP_ERR_ASSERTION :p_ctrl 为 NULL
R_BSP_SoftwareDelay
延时函数
void R_BSP_SoftwareDelay ( uint32_t delay, bsp_delay_units_t units )
- 参数:
- delay : 指定延时的数量,终止的延时时间是由 延时数量*延时单位 。
- units :指定延时单位,BSP_DELAY_UNITS_SECONDS(秒),BSP_DELAY_UNITS_MILLISECONDS(毫秒),BSP_DELAY_UNITS_MICROSECONDS(微秒)。
注:根据系统时钟频率(通过 bsp_cpu_clock_get() 获取)和预设的循环常量 BSP_DELAY_LOOP_CYCLES 计算需要执行的空循环次数。例如:系统时钟为 12MHz 时,每个循环约 332 纳秒,若需延时 2 微秒,则执行 6 次循环,通过调用 bsp_prv_software_delay_loop() 执行计算出的循环次数,实现延时。由于是软件实现的时间延时的一个大概时间,一般用于对时间不太严格的场景。
R_IOPORT_Open
fsp_err_t R_IOPORT_Open ( ioport_ctrl_t *const p_ctrl, const ioport_cfg_t * p_cfg )
参数:
- ioport_ctrl_t 结构体 : IO 端口模块的控制句柄,需由用户定义并传入。
- ioport_cfg_t 结构体: 配置参数,通常包含引脚初始状态、上拉 / 下拉设置等。若传入 NULL,函数使用默认配置。
返回:
- FSP_SUCCESS:初始化成功,引脚已按配置更新。
- FSP_ERR_ASSERTION:p_ctrl 为 NULL。
- FSP_ERR_ALREADY_OPEN:模块已被打开,重复调用 Open() 会触发此错误。
工具创建
这里的就不在展示创建过程了,与上一章寄存器介绍文档一致。
配置引脚 在 FSP Configuration -> Pins -> Ports -> P4 -> P402 接下来我们需要配置 Mode 选择 Output mode(Initial Low) ,如下图所示:
设置完成后,按下 Ctrl + S 进行保存,然后点击 Generate Project Content 进行工程生成。
程序编写
然后再 src 下创建一个 Applay 的文件夹,在里面创建 app.c 与 app.h 两个文件如下图所示
#include "Apply\app.h"
void Run(void)
{
while(1)
{
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_LOW);
R_BSP_SoftwareDelay (1, BSP_DELAY_UNITS_SECONDS);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_02, BSP_IO_LEVEL_HIGH);
R_BSP_SoftwareDelay (1, BSP_DELAY_UNITS_SECONDS);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef __APP_H
#define __APP_H
#include "hal_data.h"
void Run(void);
#endif
2
3
4
5
6
7
8
#include "hal_data.h"
#include "Apply\app.h"
FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
/*******************************************************************************************************************//**
* main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used. This function
* is called by main() when no RTOS is used.
**********************************************************************************************************************/
void hal_entry(void)
{
/* TODO: add your own code here */
Run();
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
实验效果
下载完成后,可以看到P402等开始以一秒周期开始闪烁。