1.通过KeilIDE的PackInstaller在线安装S32KSDKpack
2.升级KeilPack中EAR0.8.6的S32K14xSDK到RTM2.0.0版本
2.1通过packSDK安装目录下的ReleaseNotes确定SDK版本
2.3将KeilpackSDK安装目录下的middleware、platform和rtos三个文件夹替换为RTM2.0.0SDK的,以实现SDK升级
3.新建S32K的Keil应用工程并选择使用SDK
3.1创建S32K的Keil应用工程
3.2选择和配置S32KSDK驱动
4.在S32DSforARMv2018.R1中使用ProcessorExpert图形化配置生成SDK驱动配置文件
4.1新建S32K144的S32DS应用工程并选择使用S32K14xSDKRTM2.0.0
4.2从ProcessorExpert的ComponentLibrary中添加SDK驱动组件
4.3根据S32K144-EVB硬件设计配置SDK组件
4.4生成SDK配置代码
4.5将ProcessorExpert生成的S32KSDK配置代码拷贝添加到Keil应用工程中
5.设置S32KKeil应用工程选项与在Keil中调用S32KSDK
5.1设置Target使用MicroLIBC语言库
5.2设置KeilC/C++编译器配置
5.3设置Keil汇编代码编译器配置
5.4设置Linker的链接文件使用SDK提供的S32K144_64_flash.sct
5.5调用S32K14xSDK驱动及添加测试应用程序
①用户按键GPIO输入中断ISR
②main()函数调用时钟初始化、GPIO引脚初始化、GPIOIRQ中断使能及ISR安装、ADC模块初始化和自校准(AutoCalibration)以及LPUART串口初始化函数
③main()函数主循环中调用ADC软件触发采样转换及转换结果读取API,并将结果通过LPUART串口阻塞发送API函数发送给PC电脑
5.6编译KeilSDK应用工程
6.使下载调试和测试S32K的KeilSDK应用工程
6.1设置编译目标为Flash,将应用程序下载到S32KFlash中进行调试,掉电程序不丢失
6.2设置编译目标为SRAM,将应用程序下载到S32KSRAM中进行调试,掉电后程序丢失
总结
ARM公司的Keil,也被称为KeilMDK(MicrocontrollerDevelopmentKit)集成开发环境(IDE)是很多ARM内核控制器开发者的首选工具链,原因如下:
①Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。其方便易用的集成环境、强大的软件仿真调试工具让MCU的应用工程开发事半功倍;
②Keil是与IAR齐名的专业MCU编译器,其编译效率非常高,并对业界的几乎所有调试器(debugger)都支持,相对GHS和Windriver来说,性价比较高;
④KeilIDE的ARM编译器的界面保持了与之前C51编译器一致,都十分简洁易用,让很多之前使用51单片机的庞大用户群体能够无缝升级;
NXP的S32K1xx系列汽车级通用MCU,使用ARMCortexM0+/M4F内核,也当然可以使用KeilMDK开发其应用程序,但是在NXP提供的SDK中,并不直接支持KeilMDK:
然而,Keil公司在2017年年底通过其packinstaller提供过一般SDK的支持包:一方面,其使用的SDK版本是EAR0.8.6,是早期版本,存在很多bug,因此,并不推荐用户使用;另一方面,Keil中无法像S32DSIDE一样使用ProcessorExpert对S32KSDK进行图形化配置从而自动生成SDK驱动配置文件;
为此,本文详细介绍KeilIDE中S32KSDK的pack安装、SDK升级至RTM2.0.0、使用S32DSIDE的ProcessorExpert为S32KKeil应用工程配置S32KSDK,S32K的Keil应用工程编译器、链接器设置,编译链接和调试等,并提供了配套的demo工程供大家参考学习,希望对大家有所帮助。
下载安装MDK(Keil5)IDE,这里使用最新的Keilv5.27。只有Keilv5.24及以上版本才支持S32K1xx系列MCU。
打开安装好KeilIDE,在下图中点击其菜单栏PackInstaller的快捷图标即可打开补丁包安装器:
然后,在补丁包安装器--PackInstaller,在线(online)搜索S32K下载安装其最新的SDKpack,请保持电脑网络连接正常:
安装完成后,结果如下:
这样S32KSDK作为Pack,就被安装在Keil的安装目录下了。其中,
通过检查每个安装目录下的ReleaseNotes.pdf,可以确定该pack中的SDK版本:
可以发现,Keil的pack中包含的SDK版本较老,还是EAR0.8.6的,并非推荐使用的RTM版本。所以需要更换为最小的RTM版本,这里替换为S32K14xRTM2.0.0,具体方法和步骤如下:
①目录platform/devices/S32K144/startup下的arm文件夹
Tips:该文件夹包含个partnumber的启动汇编文件--startup_S32K14x.s,需要备份S32K142/4/6/8相应子目录以支持整个S32K14x系列:
②目录platform/devices下的startup.c启动文件
③目录platform/devices/S32K144/linker下的arm文件夹
Tips:该文件夹包含个partnumber链接文件--*.sct,分散加载文件,需要备份S32K142/4/6/8相应子目录以支持整个S32K14x系列:
④目录platform/drivers/src/interrupt下的interrupt_manager.c文中断管理器驱动源文件
①将KeilpackSDK安装目录下的middleware、platform和rtos三个文件夹删除:
②然后,将S32DSforARMv2018.R1安装目录下S32K14x_RTM_2.0.0文件夹下的middleware、platform和rtos三个文件夹拷贝到Keil的S32Kpack安装目录下:
使用该压缩包,大家可以省略步骤2.2的备份工作;
大家将其下载后,在2.4步骤,将压缩包拷贝到KeilpackSDK安装根目录下,右键->解压到当前文件夹(X),覆盖新的SDK即可完成升级最后一步Keil工具链移植代码恢复:
在解压过程中确认文件替换窗口中,选择“全部选是(A)”:
选择菜单Project->NewUvisionProject...创建应用工程:
选择保存路径,并输入应用工程名,点击“save”保存:
选择MCU型号(Device)和软件pack,这里测试硬件平台使用S32K144EVB,其partnumber为FS32K144UAVLL,LQFP-100引脚封装,故选择S32K144UAxxxLLx即可:
Tips:在以上窗口中,可以通过搜索快速找到具体的partnumber,S32K1xx系列MCU的partnumber命名规则如下:
在Keil的ManageRun-TimeEnvironment窗口中,选择需要使用到的SDK驱动和BSP及中间件协议栈等;
这里,为了测试S32K144-EVB的ADC模拟输入、GPI按键输入和LED输出以及LPUART窗口通信,选择如下:
BoardSupport(BSP):(S32K144-EVB)
Tips:不能选择这里的BSPAPI,因为其调用的还是老版本SDKERA0.8.6的驱动,其与我们更新的RTM2.0.0不兼容;
Device:
eDMA:由ADC驱动、LPUART及其他通信外设驱动使用;
Device->SDKDriver中选择的SDK驱动具体如下:
Tips:在选择SDK驱动时,Keil会Validate用户的选择,找出其中的依赖关系,比如选择S32K144-EVB的LED组件时,其依赖其SDK的PINDriver和Clock驱动,点击“Resolve”即可自动选择添加相应SDK驱动:
Tips:Keil应用工程的SDK配置可以在开发过程中随意增加和删除,通过KeilIDE的ManageTun-TimeEnvironment快捷图标即可打开:
选择好SDK驱动之后,其相应的底层驱动代码就会被添加到应用工程中:
在S32DSforARMv2018.R1中新建一个S32K144的应用工程,选择使用同样的S32K14xSDKRTM2.0.0:
为了配置生成Keil应用工程中SDK驱动的配置文件,在S32DS应用工程中,添加相应的SDK组件--ADC、LPUART,PINS、Clock_Manager、Interrupt_Manager、eDMA和osif等:
根据S32K144-EVB的以下硬件设计:
S32K144-EVB上有一颗三色RGBLED,低电平点亮,高电平熄灭:
RGBLED的S32K144MCU引脚分配如下表:
RGBLED
S32K144GPIO
方向
BLUE
PTD0
输出
RED
PTD15
RGEEN
PTD16
S32K144-EVB设计了两个下拉到地的用户机械按键作为GPIO输入,可做GPIOIRQ上升沿中断测试:
USERBUTTONS的S32K144MCU引脚分配如下表:
USERBUTTONS
BTN0
PTC12
输入下拉
PTC13
S32K144-EVB设计了一个5K的滑动变阻器连接到S32K144MCU的ADC0的12通道,以测试ADC模拟信号采集转换功能:
外部滑动变阻器的S32K144MCU引脚分配如下表:
外部滑动变阻器
ADC通道
POTENTIOMETER
PTC14
ADC0_SE12
S32K144的LPUART连接到S32K144-EVB的板载OpenSDA虚拟串口:
LPUART1的S32K144MCU引脚分配如下表:
LPUART1
TXD
PTC7
输入
RXD
PTC6
完成以上SDK驱动组件配置后,点击GenerateCode,即可生成需要的SDK配置代码:
Tips:在S32DSIDE应用工程中,打开任意C代码源文件,在编辑窗口中,右键->ShowIn->SystemExplorer,即可在Windows的资源管理器中打开其所在的文件夹目录:
在Keil应用工程工程根目录下新建ProcessorExpert_Generate_SDK_ConfigFiles和Application文件夹,并将S32DS应用工程中ProcessorExpert配置生成的代码和main.c拷贝到相应目录下:
并在Keil工程中,创建两个同名的group,将相应目录下的所有文件添加到Keil应用工程中:
若在应用程序中要使用C语言标准库,比如stdio.h中的标准输入输出函数,则需要使能使用MicroLIB库,方法如下:
在Keil工程的目标选项(OptionsforTarget)的Target一栏勾选UseMicroLIB选项如下:
在Keil工程的目标选项(OptionsforTarget)的C/C++一栏设置其C/C++编译器选项如下:
在Keil工程的目标选项(OptionsforTarget)的Asm一栏设置其汇编编译器选项如下:
在linker设置中,将默认的"UseMemoryLayoutfromTargetDialog"选项去勾选,然后手动选择S32K144_64_flash.sct作为工程链接文件(ScatterFile,分散加载文件):
完成以上设置之后,在keil应用工程中就可以使用S32K14xSDK了,只需要在调用SDK驱动的C源代码文件中,包含Cpu.h头文件即可:
#include"Cpu.h"
针对本例测试,在main.c中添加如下代码:
①用户按键GPIO输入中断IST
Tips:以上代码中使用了S32K14xSDK的中断管理器(Interrupt_Manager)组件的中断ISR安装API函数--INT_SYS_InstallHandler(),故需要将MCU的中断向量表重映射到SRAM中,所以需要修改工程的分散加载文件--,S32K144_64_flash.sct在其开始处定义宏--__ram_vector_table__:
#define__ram_vector_table__1
完成以上代码之后,编译即可:
选择编译和调试目标为“S32K144_DebugFlash”进行编译:
编译完成后,在工程目标选项的Debug配置中,选择使用合适的硬件调试器:
然后又点击Keil菜单栏的调试进入图标,即可进入调试,并运行至默认的main()函数第一行的断点:
全速运行,或者重新复位S32K144-EVB板,即可发现测试功能工作正常:
Tips:Keil除了可以支持ULINK和JLINK这样的专业调试器对S32K系列MCU进行程序下载和调试器之外,还支持使用S32K144-EVB板载OpenSDA或者PEMicro的U-Multink作为调试器下载和调试S32K的KeilSDK应用工程。
具体方法和配置,请参考Keil官网通过的以下应用笔记(其中还包含了诸多KeilIDE的编译器使用和Debugger软件使用Tips,是学习KeilIDE不可多得的参考资料,强烈推荐):
选择编译和调试目标为“S32K144_DebugRAM”重新编译应用工程:
然后,在工程目标选项的Debug配置中,选择使用合适的硬件调试器:
Tips:这里实现将程序加载到MCUSRAM中进行调试的关键是:在以上配置界面中,去勾选“loadApplicationatStartup”,选择InitializationFile,使用工程根目录下的Dbg_RAM.ini初始化脚本,其通过控制脚本实现了从编译结果*.axf中读取并设置CPU内核堆栈指针(SP),程序计数器(PC)和中断向量表偏移地址(VTOR)设置,复位并加载编译器结果到MCUSRAM以及脚本命令控制运行到main()函数等工作:
DebugRAM的调试结果如下:
与DebugFlash一样,可以实现相同的调试功能,全速运行,测试结果与DebugFlash一致。
Tips:DebugRAM时,中断向量表和应用程序被编译到SRAM中了,不占用MCU的Flash资源,所以其不会破坏原有MCUFlash中的程序,且下载过程无需擦除和编程Flash,所以下载速度非常快,也因此,其常被用作外设/应用程序快速验证或者产品量产后做失效分析(FA--FailureAnalyze)进行硬件外设模块功能验证。其掉电后,程序丢失。其实,即使下载后未掉电,SRAM中的程序不会丢失,此时复位MCU,SRAM中的程序也不会执行,因为MCU复位后默认的中断向量表在0x0000的Flash地址;
本文详细介绍了ARMKeil5.27IDE中使用S32KSDK开发S32K应用程序的方法和步骤,以及如何将S32DS中ProcessorExpert图形化配置和生成的S32KSDK配置文件添加到Keil工程中使用的方法和步骤。
同样的SDK代码,在不开编译器优化的情况下:
使用Keil编译的结果如下:
使用S32DSv2018.R1(gccv6.3)编译的结果如下:
可以看到,Keil和S32DS编译的结果,占用SRAM资源相差不大,但占用的Flash(代码编译结果存储器)空间却只有S32DS编译结果的一半不到(15.72kB.vs33.45kB);
代码编译效率提高了一倍多!!!
除了本文的Keil开发S32K应用程序及SDK使用之外,Keil官网也提供了以下三个应用笔记和丰富的demo工程,供大家参考学习: