前言
虽然瑞萨提供了RASC,e2开发环境,以及FSP等,但是这对于熟悉基于通用MDK和IAR平台进行开发的用户,以及新手用户来说,迁移和学习成本过大,过于复杂了。
既然RA4M2系列是Cortex-M33内核的MCU,使用通用的MDK和IAR作为开发环境是更多人的首选。没必要再去安装一大堆开发环境,重新熟悉开发环境,代码框架等。对于有统一开发平台的企业用户来说,更是这样,统一的开发环境非常重要。
实际上STM32很大的一个优势就是提供风格统一的标准外设库,集成到MDK和IAR等开发工具中,自动添加启动代码,system初始化代码等,用户按需添加外设库即可,其他的都是Cortex-M内核,比如NVIC,Systick等都按照CMSIS标准,都是通用的API,外设库也风格统一,这样迁移学习成本很低。而瑞萨则自己又搞了一套e2开发工具,搞一套rasc代码生成工具,搞一套比较混乱且非常复杂的fsp代码框架,说实话反而搞得复杂了。
所以本文介绍,不依赖上述e2等任何开发环境,就将RA4M2作为一个普通的Cortex-M系列通用MCU对待,基于MDK完全从0开始搭建开发环境。
准备
安装MDK
我这里基于5.38版本,其安装过程不再赘述。
安装MDK支持包
https://www.ramcu.cn/lists/21.html
下载Renesas.RA_DFP.4.2.0.pack
双击Renesas.RA_DFP.4.2.0.pack安装MDK支持包
会自动搜索MDK安装路径
安装后位于C:Keil_v5ARMPACKRenesasRA_DFP4.2.0
确认软件支持包已经安装,没有安装也可以按如下方式安装,其他组件按需安装
获取头文件
https://github.com/renesas/fsp
头文件位于
fsprafspsrcbspcmsisDeviceRENESASInclude
我这里根据型号是R7FA4M2AD.h,下载,后面需要添加到工程。
获取启动代码
fspra\fspsrcbspcmsisDeviceRENESASSource下有
startup.c,system.c是配合RASC自动生成的工程使用的,我们这里不使用。
既然是CORTEX-M33内核我们就使用通用的启动代码。
MDK安装路径下就有,复制C:Keil_v5ARMPACKARMCMSIS5.9.0DeviceARMARMCM33文件夹下所有文件,等下添加到工程目录。
Source目录下就是针对不同编译器的汇编启动代码。
新建工程
Project->New uVision Project...
不使用RTE,不勾选任何选项直接OK
新建文件夹src,添加main.c文件,将main.c添加到工程
复制C:Keil_v5ARMPACKARMCMSIS5.9.0CMSISCoreInclude下的
core_cm33.h,cmsis_version.h,cmsis_compiler.h,cmsis_armclang.h,mpu_armv8.h到srcARMCM33Include下
工程中新建group ARMCM33将
ARMCM33Source下的system_ARMCM33.c
ARMCM33SourceARM下的
startup_ARMCM33.S
ARMCM33Include下的所有头文件添加到group ARMCM33(头文件可以不添加到工程,为了方便查看这里添加进来了)。
取消所有文件的只读属性。
srcARMCM33IncludeARMCM33.h中
#define __FPU_PRESENT 0U 改为
#define __FPU_PRESENT 1U
#define __DSP_PRESENT 0U
改为
#define __DSP_PRESENT 1U
将ARMCM33Include所在目录添加到头文件包含路径。
工程中定义ARMCM33
配置分散加载文件ARMCM33_ac6.sct
其中ARMCM33_ac6_s.sct表示支持secure的配置我们这里不使用。
修改分散加载文件
参考《RA4M2 Group User’s Manual: Hardware》
我们这里的MCU的FLASH和RAM分别是512KB和128KB。
Main中先实现main函数
int main(void)
{
while(1);
}
R7FA4M2AD.h
中注释掉
//#include "system.h"
//#define __CM33_REV 0x0004U /*!< CM33 Core Revision */
//#define __NVIC_PRIO_BITS 4 /*!< Number of Bits used for Priority Levels */
//#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */
//#define __VTOR_PRESENT 1 /*!< Set to 1 if CPU supports Vector Table Offset Register */
//#define __MPU_PRESENT 1 /*!< MPU present */
//#define __FPU_PRESENT 1 /*!< FPU present */
//#define __FPU_DP 0 /*!< Double Precision FPU */
//#define __DSP_PRESENT 1 /*!< DSP extension present */
//#define __SAUREGION_PRESENT 0 /*!< SAU region present */
ARMCM33.h中 使用上述注释掉的宏值替换
注释掉
//#define __CM33_REV 0x0000U /* Core revision r0p1 */
//#define __SAUREGION_PRESENT 0U /* SAU regions present */
//#define __MPU_PRESENT 1U /* MPU present */
//#define __VTOR_PRESENT 1U /* VTOR present */
//#define __NVIC_PRIO_BITS 3U /* Number of Bits used for Priority Levels */
//#define __Vendor_SysTickConfig 0U /* Set to 1 if different SysTick Config is used */
//#define __FPU_PRESENT 1U /* no FPU present */
//#define __DSP_PRESENT 1U /* no DSP extension present */
改为
#define __CM33_REV 0x0004U /*!< CM33 Core Revision */
#define __NVIC_PRIO_BITS 4 /*!< Number of Bits used for Priority Levels */
#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */
#define __VTOR_PRESENT 1 /*!< Set to 1 if CPU supports Vector Table Offset Register */
#define __MPU_PRESENT 1 /*!< MPU present */
#define __FPU_PRESENT 1 /*!< FPU present */
#define __FPU_DP 0 /*!< Double Precision FPU */
#define __DSP_PRESENT 1 /*!< DSP extension present */
#define __SAUREGION_PRESENT 0 /*!< SAU region present */
此时即可编译通过,工程搭建完成。
仿真
进入仿真环境
自动停在了main函数入口
至此完成了开发环境的搭建。
总结
以上完全从0开始,不依赖e2,RASC等工具生成工程,完全手动创建工程,简洁明了,有助于理解工程的结构以及依赖关系。避免了虽然使用复杂的e2,RASC开发环境,生成了模板工程但是知其然不知其所以然。
参考
开发板相关资料
https://bbs.elecfans.com/jishu_2329264_1_1.html
https://www.ramcu.cn/lists/21.html
|