本帖最后由 jf_37047872 于 2023-2-27 09:30 编辑
本次【RA4M2设计挑战赛】给了我一个熟悉瑞萨MCU产品的机会,一接触就感觉与熟悉的STM及其他品牌产品开发方式存在很大的不同,这对于初次上手RA开发的新手而言,需要花费一些时间来逐步熟悉和了解。之前的帖子中,我已经介绍过关于RA4M2开发板的使用方法,不了解的小伙伴可以看《拿到一块新的开发板,你需要做些什么? 》。这次我准备聊聊关于瑞萨的代码框架,这对于后续的开发工作非常重要,下面的内容是基于“RASA+KEILv5”的开发方式。 RA官方提供了一个配置工具——RASC,通过这个工具可以通过可视化方式对常用外部设备进行配置,包括但不限于GPIO引脚、时钟、各种通信接口等,对于这部分的介绍,可以参考这个帖子: 《如何让RA4M2开发板运行你的第一个程序》 在使用RASC进行配置后,可以自动生成一个KEIL工程,其中已经包含了之前已经配置好的那些外设的基础代码,这样可以大大减轻代码编写的工作量。但这时,我们通过KEIL编辑器打开工程会发现,其中的代码框架并不是我们熟悉的情况,于是我们先来看看RA官方的代码框架图。 根据上图所示,我们看到RA提供了一个称为"FSP"的代码框架,中文叫“灵活软件包”,其中分为三层架构。最底层是BSP,也就是板级支持包。这部分主要包括的就是我们在写STM32代码时熟悉的一些“库文件”。在这一层上面,RA封装了两部分内容,一个是基于操作系统开发方式下的RTOS框架,支持FreeRTOS操作系统;另一个是基于非操作系统开发方式下的各类外设驱动,即HAL驱动,这部分就相当于STM32CUBE的HAL库。有了这层封装,我们就可以不用管那么多库函数了。在HAL驱动层之上,RA提供了更进一步的封装,即中间件,主要包括一些常用的接口、协议等。这样做的好处是,可以让我们像使用HAL一样方便的操作这些复杂接口和协议。此外,RA还基于其产品特色,提供了TrustZone安全组件,可以增加产品的安全特性。在往上就是用户自己编写的应用层了。说了这么多,可能大家觉得这些都是理论的东西,跟我编写代码有啥关系,其实这是理解RA官方代码框架的基础。我们继续往下看RA官方给出的代码框架。 - project - ra(核心文件) - ARM(包含ARM CMSIS 代码) - CMSIS 5 - board(包含开发板文件) - ra4m2_ek - board_init.h(声明bsp_init函数) - board_init.c(定义bsp_init函数) - board_leds.h(声明led结构体及led枚举类型) - board_leds.c(定义并初始化板载LED结构体及引脚数组) - board.h(引用开发板相关初始化及外设函数,定义BOARD_RA4M2_EK宏) - fsp(FSP库本体) - inc(FSP库核心文件) - api(FSP接口,包含API定义) - bsp_api.h(引用FSP库各类外设,声明获取FSP库版本函数) - r_ioport_api.h(声明IO端口相关的宏、枚举及结构体) - instances(FSP实例,接口的实例) - r_ioport.h(声明IO端口接口实例结构体、IO端口和引脚枚举类型及IO端口相关函数) - fsp_common_api.h(声明FSP包的各种报错结果枚举类型) - fsp_features.h(声明FSP包的可用设备及中断信号相关枚举类型) - fsp_version.h(声明FSP包的版本相关的宏、联合体和结构体) - src(BSP层及FSP模块) - bsp(板级支持包文件) - cmsis(包含寄存器定义文件和启动文件) - DEVICE - RENESAS - include - R7FA4M2AD.h(声明MCU相关外设名称、地址、偏移及掩码等宏) - renesas.h(根据条件引用对应的MCU相关头文件) - system.h(声明系统时钟频率变量、系统初始化函数及改变系统时钟函数) - source - startup.c(定义启动函数) - system.c(定义系统初始化函数及改变系统时钟函数) - mcu(包含BSP代码) - all - bsp_xxx - ra4m2 - bsp_elc.h - bsp_feature.h - bsp_mcu_info.h - r_(FSP模块) - r_.c - ra_gen(用户的FSP配置文件) - bsp_clock_cfg.h(BSP时钟配置的宏定义) - common_data.c(定义外设结构体并赋予初始值,定义外设接口及初始化函数) - common_data.h(声明外设接口、控制结构体及初始化函数) - hal_data.c(定义hal初始化函数) - hal_data.h(声明hal入口函数及初始化函数) - main.c(定义main函数:调用hal入口函数) - pin_data.c(定义并初始化外设配置结构体及引脚配置结构体) - vector_data.c(定义向量中断数量) - vector_data.h(声明向量中断数量) - ra_cfg(FSP配置文件) - fsp_cfg - bsp - board_cfg.h(引用board.h) - bsp_cfg.h - bsp_mcu_device_cfg.h - bsp_mcu_device_pn_cfg.h - bsp_mcu_family_cfg.h - bsp_pin_cfg.h - r_ioport_cfg.h - debug(编译生成的中间文件及结果文件) - memory_regions.ld - src(用户文件) - hal_entry.c(应用程序入口文件) 在一个RA的标准项目(Project)下,一般主要包含5个文件夹:RA、RA_GEN、RA_CFG、DEBUG、SRC,分别用于存放核心文件、用户的FSP配置文件、FSP配置文件、编译生成的中间文件及结果文件、用户文件等内容。在官方提供的代码框架中,并不包含对每个文件夹作用的说明,我将这些说明文件列在了括号中,大家可以对照查阅。 然而,当我们通过KEIL打开通过RASC配置并生成的工程就会发现,这里面的代码框架并不是像上面官方提供的那样,而是仅仅包含了三个文件夹:Source Group 1、Renesas RA Smart Configurator:Common Sources、Flex Software,如下图所示。 那么,我们该如何基于KEIL进行RA项目开发呢?其实很简单,Flex Software文件夹下包含了整个RA官方的FSP,切记,不要试图去修改这个文件夹下的所有文件,因为即使修改后保存了,在下次重新通过RASC生成工程代码时,也会被恢复成RA提供的文件内容。Renesas RA Smart Configurator:Common Sources文件夹保存的是用户文件,最开始只有包含hal_entry.c文件,这个就是工程的主函数所在的文件,相当于STM32工程的main.c。同时对于用户自己编写的一些外设文件(包括.c和.h文件),也保存在这个文件夹下。但如果你直接通过KEIL的Manage Project Items是无法添加到工程的,系统会提示:该文件夹不能被移除、添加或删除内容。你可以将你编写的文件放置到工程的这个路径:RASmartConfiguratorworkspace【工程名称】src,然后运行RASC重新生成工程代码,你就能在KEIL的Renesas RA Smart Configurator:Common Sources文件夹下看到你的文件了。而Source Group 1文件夹,你可以随意添加保存任何文件。 现在还有最后一个问题没有解决,RA将所有FSP的内容统统放在了一个文件夹下,我怎么知道需要寻找的内容在哪个文件里呢?这就需要用到上面最初的代码框架了,你可以对照官方的代码框架,根据每个文件的前缀,来区分这个文件属于代码框架的哪一层,然后就可以大概判断出这个文件所存放的是哪部分代码内容了。好了先说这么多,后面我会结合具体开发项目,逐步帮助大家熟悉常用的一些外设的配置方法,希望这篇帖子能对大家熟悉和了解RA项目的开发有所帮助。
|