汽车电子expert成长之路

本博客发布的个人原创精品----嵌入式系统技术文章,欢迎大家参考学习,并转发分享!

S32K SDK使用详解之Keil MDK开发S32K1xx系列MCU应用程序(使用Processor Expert配置SDK)

0
阅读(2229) 评论(0)

S32K SDK使用详解之Keil MDK开发S32K1xx系列MCU应用程序(使用Processor Expert配置SDK)

内容提要

引言

1. 通过Keil IDE的Pack Installer在线安装S32K SDK pack

2. 升级Keil Pack中EAR0.8.6的S32K14x SDK到 RTM2.0.0版本

    2.1 通过pack SDK安装目录下的ReleaseNotes确定SDK版本

    2.2 备份Keil pack SDK中Keil工具链相关的启动文件、链接文件及中断管理器驱动

    2.3 将Keil pack SDK安装目录下的middleware、platform和rtos三个文件夹替换为RTM 2.0.0 SDK的,以实现SDK升级

    2.4 备份Keil pack SDK中Keil工具链相关的启动文件、链接文件及中断管理器驱动

3. 新建S32K的Keil应用工程并选择使用SDK

    3.1创建S32K的Keil应用工程

    3.2 选择和配置S32K SDK驱动

4. 在S32DS for ARM v2018.R1中使用Processor Expert图形化配置生成SDK驱动配置文件

    4.1 新建S32K144的S32DS应用工程并选择使用S32K14x SDK RTM2.0.0

    4.2 从Processor Expert的Component Library中添加SDK驱动组件

    4.3 根据S32K144-EVB硬件设计配置SDK组件

    4.4 生成SDK配置代码

    4.5 将Processor Expert生成的S32K SDK配置代码拷贝添加到Keil应用工程中

5. 设置S32K Keil应用工程选项与在Keil中调用S32K SDK

    5.1 设置Target使用MicroLIB C语言库

    5.2 设置Keil C/C++编译器配置

    5.3 设置Keil汇编代码编译器配置

    5.4 设置Linker的链接文件使用SDK提供的S32K144_64_flash.sct

    5.5 调用S32K14x SDK驱动及添加测试应用程序

    ①用户按键GPIO输入中断ISR

    ②main()函数调用时钟初始化、GPIO引脚初始化、GPIO IRQ中断使能及ISR安装、ADC模块初始化和自校准(AutoCalibration)以及LPUART串口初始化函数

    ③main()函数主循环中调用ADC软件触发采样转换及转换结果读取API,并将结果通过LPUART串口阻塞发送API函数发送给PC电脑

    5.6 编译Keil SDK应用工程

6. 使下载调试和测试S32K的Keil SDK应用工程

    6.1 设置编译目标为Flash,将应用程序下载到S32K Flash中进行调试,掉电程序不丢失

    6.2 设置编译目标为SRAM,将应用程序下载到S32K SRAM中进行调试,掉电后程序丢失

总结


引言


ARM公司的Keil, 也被称为Keil MDK(Microcontroller Development Kit)集成开发环境(IDE)是很多ARM内核控制器开发者的首选工具链,原因如下:

①Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。其方便易用的集成环境、强大的软件仿真调试工具让MCU的应用工程开发事半功倍;


②Keil是与IAR齐名的专业MCU编译器,其编译效率非常高,并对业界的几乎所有调试器(debugger)都支持,相对GHS和Windriver来说,性价比较高;


③ Keil工具链隶属ARM公司,对ARM Cortex M系列CPU内核的CMSIS库支持非常好,最先发布的CMSIS库都会第一时间支持并集成到Keil IDE中;比如,如果要在基于对ARM Cortex M系列CPU内核的MCU应用程序中调用CMSIS-DSP库,则使用Keil IDE将十分方便;


 ④Keil IDE的ARM编译器的界面保持了与之前C51编译器一致,都十分简洁易用,让很多之前使用51单片机的庞大用户群体能够无缝升级;


⑤在中国,有很多在校大学生和初创公司,使用破解版的Keil工具链,因此其拥有众多粉丝。


NXP的S32K1xx系列汽车级通用MCU,使用ARM Cortex M0+/M4F内核,也当然可以使用Keil MDK开发其应用程序,但是在NXP提供的SDK中,并不直接支持Keil MDK:

然而,Keil公司在2017年年底通过其pack installer提供过一般SDK的支持包:一方面,其使用的SDK版本是EAR 0.8.6,是早期版本,存在很多bug,因此,并不推荐用户使用;另一方面,Keil中无法像S32DS IDE一样使用Processor Expert对S32K SDK进行图形化配置从而自动生成SDK驱动配置文件;


为此,本文详细介绍Keil IDE中S32K SDK的pack安装、SDK升级至RTM2.0.0、使用S32DS IDE的Processor Expert为S32K Keil应用工程配置S32K SDK,S32K的Keil应用工程编译器、链接器设置,编译链接和调试等,并提供了配套的demo工程供大家参考学习,希望对大家有所帮助。


1. 通过Keil IDE的Pack Installer在线安装S32K SDK pack


下载安装MDK(Keil 5) IDE,这里使用最新的Keil v5.27。只有Keil v5.24及以上版本才支持S32K1xx系列MCU。


打开安装好Keil IDE,在下图中点击其菜单栏Pack Installer的快捷图标即可打开补丁包安装器:

然后,在补丁包安装器--Pack Installer,在线(online)搜索S32K下载安装其最新的SDK pack,请保持电脑网络连接正常:

安装完成后,结果如下:

这样S32K SDK作为Pack,就被安装在Keil的安装目录下了。其中,

  • S32_SDK_DFP目录下存放的是S32K14x系列MCU的SDK;

  • S32K116_SDK_DFP目录存放的是S32K116的SDK;

  • S32K118_SDK_DFP目录存放的是S32K118的SDK;

2. 升级Keil Pack中EAR0.8.6的S32K14x SDK到 RTM2.0.0版本


2.1 通过pack SDK安装目录下的ReleaseNotes确定SDK版本

通过检查每个安装目录下的ReleaseNotes.pdf,可以确定该pack中的SDK版本:

可以发现,Keil的pack中包含的SDK版本较老,还是EAR 0.8.6的,并非推荐使用的RTM版本。所以需要更换为最小的RTM版本,这里替换为S32K14x RTM 2.0.0,具体方法和步骤如下:


2.2 备份Keil pack SDK中Keil工具链相关的启动文件、链接文件及中断管理器驱动


由于NXP提供的S32K1xx系列MCU原始SDK并不支持Keil,所以在Keil提供的pack SDK中,对其启动文件、链接文件和中断管理器驱动等编译器相关的文件做了移植,所以在替换SDK RTM2.0.0之前,需要将相应的文件做备份,以便在替换成新版本的SDK后进行恢复:


①目录platform/devices/S32K144/startup下的arm文件夹


Tips:该文件夹包含个part number的启动汇编文件--startup_S32K14x.s,需要备份S32K142/4/6/8相应子目录以支持整个S32K14x系列:

②目录platform/devices下的startup.c启动文件

③目录platform/devices/S32K144/linker下的arm文件夹


Tips:该文件夹包含个part number链接文件--*.sct,分散加载文件,需要备份S32K142/4/6/8相应子目录以支持整个S32K14x系列:

④目录platform/drivers/src/interrupt下的interrupt_manager.c文中断管理器驱动源文件


2.3 将Keil pack SDK安装目录下的middleware、platform和rtos三个文件夹替换为RTM 2.0.0 SDK的,以实现SDK升级


①将Keil pack SDK安装目录下的middleware、platform和rtos三个文件夹删除:

②然后,将S32DS for ARM v2018.R1安装目录下S32K14x_RTM_2.0.0文件夹下的middleware、platform和rtos三个文件夹拷贝到Keil的S32K pack安装目录下:


2.4 备份Keil pack SDK中Keil工具链相关的启动文件、链接文件及中断管理器驱动


最后,将以上2.2步骤备份的Keil工具链相关的启动文件、链接文件及中断管理器驱动恢复到新SDK相应的目录下或者覆盖掉新SDK中的startup.c和interrupt_manger.c即可完成SDK升级;


Tips:为了方便大家对SDK进行升级,我将S32K14x SDK审计需要备份的目录和文件压缩为platform.zip,分享到以下百度云盘:


  • 链接: https://pan.baidu.com/s/1oK1IePoKtACtwNejhKB31w

  • 提取码: 4wjt


使用该压缩包,大家可以省略步骤2.2的备份工作;


大家将其下载后,在2.4步骤,将压缩包拷贝到Keil pack SDK安装根目录下,右键->解压到当前文件夹(X),覆盖新的SDK即可完成升级最后一步Keil工具链移植代码恢复:

在解压过程中确认文件替换窗口中,选择“全部选是(A)”:


3. 新建S32K的Keil应用工程并选择使用SDK


3.1创建S32K的Keil应用工程


选择菜单Project->New Uvision Project...创建应用工程:

选择保存路径,并输入应用工程名,点击“save”保存:

选择MCU型号(Device)和软件pack,这里测试硬件平台使用S32K144EVB,其part number为FS32K144UAVLL,LQFP-100引脚封装,故选择S32K144UAxxxLLx即可:

Tips:在以上窗口中,可以通过搜索快速找到具体的part number,S32K1xx系列MCU的part number命名规则如下:


3.2 选择和配置S32K SDK驱动


在Keil的Manage Run-Time Environment窗口中,选择需要使用到的SDK驱动和BSP及中间件协议栈等;


这里,为了测试S32K144-EVB的ADC模拟输入、GPI按键输入和LED输出以及LPUART窗口通信,选择如下:


Board Support(BSP):(S32K144-EVB)


  • A/D Converter:ADC API

  • Buttons:按键输入API

  • LED:RGB LED输出API


Tips:不能选择这里的BSP API,因为其调用的还是老版本SDK ERA 0.8.6的驱动,其与我们更新的RTM 2.0.0不兼容;


Device:


  • Starup:启动代码(必选)

  • SDK Driver:

    • ADC:ADC驱动

    • Clock:系统时钟初始化配置,是SDK驱动的基础(必选)

    • Interrupt:中断配置,被Buttons按键输入和LPUART驱动串口通信使用

    • LPUART:串口驱动,用于串口通信测试;

    • PINS:GPIO输入输出和外设功能复用选择(必选);

           eDMA:由ADC驱动、LPUART及其他通信外设驱动使用;

  • SDK_OSIF

  • OSIF: 裸码操作系统接口API,由S32K SDK中的通信驱动调用;


Device->SDK Driver中选择的SDK驱动具体如下:

Tips:在选择SDK驱动时,Keil会Validate用户的选择,找出其中的依赖关系,比如选择S32K144-EVB的LED组件时,其依赖其SDK的PIN Driver和Clock驱动,点击“Resolve”即可自动选择添加相应SDK驱动:

Tips:Keil应用工程的SDK配置可以在开发过程中随意增加和删除,通过Keil IDE的Manage Tun-Time Environment快捷图标即可打开:

选择好SDK驱动之后,其相应的底层驱动代码就会被添加到应用工程中:


4. 在S32DS for ARM v2018.R1中使用Processor Expert图形化配置生成SDK驱动配置文件


4.1 新建S32K144的S32DS应用工程并选择使用S32K14x SDK RTM2.0.0


在S32DS for ARM v2018.R1中新建一个S32K144的应用工程,选择使用同样的S32K14x SDK RTM2.0.0:


4.2 从Processor Expert的Component Library中添加SDK驱动组件


为了配置生成Keil应用工程中SDK驱动的配置文件,在S32DS应用工程中,添加相应的SDK组件--ADC、LPUART,PINS、Clock_Manager、Interrupt_Manager、eDMA和osif等:

4.3 根据S32K144-EVB硬件设计配置SDK组件


根据S32K144-EVB的以下硬件设计:


S32K144-EVB上有一颗三色RGB LED,低电平点亮,高电平熄灭:

RGB LED的S32K144 MCU引脚分配如下表:

RGB LED

S32K144 GPIO

方向

BLUE

PTD0

输出

RED

PTD15

输出

RGEEN

PTD16

输出

S32K144-EVB设计了两个下拉到地的用户机械按键作为GPIO输入,可做GPIO IRQ上升沿中断测试:

USER BUTTONS的S32K144 MCU引脚分配如下表:

USER BUTTONS

S32K144 GPIO

方向

BTN0

PTC12

输入下拉

BTN0

PTC13

输入下拉

S32K144-EVB设计了一个5K的滑动变阻器连接到S32K144 MCU的ADC0的12通道,以测试ADC模拟信号采集转换功能:

外部滑动变阻器的S32K144 MCU引脚分配如下表:

外部滑动变阻器

S32K144 GPIO

ADC通道

POTENTIOMETER

PTC14

ADC0_SE12


S32K144的LPUART连接到S32K144-EVB的板载OpenSDA虚拟串口:

LPUART1的S32K144 MCU引脚分配如下表:

LPUART1

S32K144 GPIO

方向

TXD

PTC7

输入

RXD

PTC6

输出

  • 在Pin_mux组件中配置RGB LED控制端口和Button输入中断、ADC外部滑动变阻器输入通道及LPUART1引脚复用;


  • 置RGB LED控制GPIO方向为输出(Output):

  • 配置用户按键输入GPIO方向为输入(Input):

  • 配置用户按键输入GPIO为上升沿触发中断、使能内部下拉和数字滤波器:

  • 配置LPUART的TXD和RXD引脚:

  • Clock_Manager组件中配置使能S32K144的外部晶振和PLL倍频器,输出160MHz的倍频作为系统参考时钟:

  • 配置S32K144的RUN模式CPU工作频率为80MHz,总线频率40MHz, Flash工作频率为26.67MHz:

  • ADC组件中,选择使用ADC0模块,12-bit分配率和软件触发工作模式:

  • 选择ADC通道为外部12通道(EXT12):

  • 在LPUART组件中,选择使用LPUART1,中断收发、波特率为115200,关闭奇偶校验、字符长度为8-bit/char,无停止位:

4.4 生成SDK配置代码


完成以上SDK驱动组件配置后,点击Generate Code,即可生成需要的SDK配置代码:

Tips:在S32DS IDE应用工程中,打开任意C代码源文件,在编辑窗口中,右键 -> Show In -> System Explorer,即可在Windows的资源管理器中打开其所在的文件夹目录:


4.5 将Processor Expert生成的S32K SDK配置代码拷贝添加到Keil应用工程中


在Keil应用工程工程根目录下新建ProcessorExpert_Generate_SDK_ConfigFiles和Application文件夹,并将S32DS应用工程中Processor Expert配置生成的代码和main.c拷贝到相应目录下:


并在Keil工程中,创建两个同名的group,将相应目录下的所有文件添加到Keil应用工程中:


5. 设置S32K Keil应用工程选项与在Keil中调用S32K SDK


5.1 设置Target使用MicroLIB C语言库


若在应用程序中要使用C语言标准库,比如stdio.h中的标准输入输出函数,则需要使能使用MicroLIB库,方法如下:


在Keil工程的目标选项(Options for Target)的Target一栏勾选Use MicroLIB选项如下:

  • 增加编译器识别符号定义--__ARMCC_VERSION


5.2 设置Keil C/C++编译器配置


在Keil工程的目标选项(Options for Target)的C/C++一栏设置其C/C++编译器选项如下:


  • 增加编译器识别符号定义--__ARMCC_VERSION

  • 添加搜索包含目录:.\ProcessorExpert_Generate_SDK_ConfigFiles;.\Application

  • 解除GNU工具链识别符号定义:-U__GNUC__


5.3 设置Keil汇编代码编译器配置


在Keil工程的目标选项(Options for Target)的Asm一栏设置其汇编编译器选项如下:

  • 增加编译器识别符号定义--__ARMCC_VERSION

  • 添加搜索包含目录:.\ProcessorExpert_Generate_SDK_ConfigFiles;


5.4 设置Linker的链接文件使用SDK提供的S32K144_64_flash.sct


在linker设置中,将默认的"Use Memory Layout from Target Dialog"选项去勾选,然后手动选择S32K144_64_flash.sct作为工程链接文件(Scatter File,分散加载文件):


5.5 调用S32K14x SDK驱动及添加测试应用程序


完成以上设置之后,在keil应用工程中就可以使用S32K14x SDK了,只需要在调用SDK驱动的C源代码文件中,包含Cpu.h头文件即可:


#include "Cpu.h"


针对本例测试,在main.c中添加如下代码:


①用户按键GPIO输入中断IST

5.jpg

②main()函数调用时钟初始化、GPIO引脚初始化、GPIO IRQ中断使能及ISR安装、ADC模块初始化和自校准(AutoCalibration)以及LPUART串口初始化函数


5.jpg


Tips:以上代码中使用了S32K14x SDK的中断管理器(Interrupt_Manager)组件的中断ISR安装API函数-- INT_SYS_InstallHandler(),故需要将MCU的中断向量表重映射到SRAM中,所以需要修改工程的分散加载文件--,S32K144_64_flash.sct在其开始处定义宏--__ram_vector_table__:


#define __ram_vector_table__    1


③main()函数主循环中调用ADC软件触发采样转换及转换结果读取API,并将结果通过LPUART串口阻塞发送API函数发送给PC电脑

5.jpg


5.6 编译Keil SDK应用工程


完成以上代码之后,编译即可:


6. 使下载调试和测试S32K的Keil SDK应用工程


6.1 设置编译目标为Flash,将应用程序下载到S32K Flash中进行调试,掉电程序不丢失


选择编译和调试目标为“S32K144_DebugFlash”进行编译:

编译完成后,在工程目标选项的Debug配置中,选择使用合适的硬件调试器:

然后又点击Keil菜单栏的调试进入图标,即可进入调试,并运行至默认的main()函数第一行的断点:

全速运行,或者重新复位S32K144-EVB板,即可发现测试功能工作正常:


  • 按下SW2(BIN0) 翻转(Toggle)红蓝色RGB LED,第一次按下该按键,蓝色RGB LED亮起,再次按键熄灭;

  • 按下SW3(BIN1) 翻转(Toggle)红色RGB LED,第一次按下该按键,红色RGB LED亮起,再次按键熄灭;

  • 同时,打开任意串口调试助手软件,设置通信波特率为115200,关闭奇偶校验、字符长度为8-bit/char,无停止位,连接S32K144-EVB的OpenSDA虚拟串口,即可收到ADC转换结果,改变滑动变阻器位置,可获得不同的采样结果:

Tips:Keil除了可以支持ULINK和JLINK这样的专业调试器对S32K系列MCU进行程序下载和调试器之外,还支持使用S32K144-EVB板载OpenSDA或者PEMicro的U-Multink作为调试器下载和调试S32K的Keil SDK应用工程。

具体方法和配置,请参考Keil官网通过的以下应用笔记(其中还包含了诸多Keil IDE的编译器使用和Debugger软件使用Tips,是学习Keil IDE不可多得的参考资料,强烈推荐):


  • apnt_299_v1.2.NXP S32K Cortex-M4 Tutorial for the S32K144EVB Board.pdf


6.2 设置编译目标为SRAM,将应用程序下载到S32K SRAM中进行调试,掉电后程序丢失


选择编译和调试目标为“S32K144_DebugRAM”重新编译应用工程:

然后,在工程目标选项的Debug配置中,选择使用合适的硬件调试器:

Tips:这里实现将程序加载到MCU SRAM中进行调试的关键是:在以上配置界面中,去勾选“load Application at Startup”,选择Initialization File,使用工程根目录下的Dbg_RAM.ini初始化脚本,其通过控制脚本实现了从编译结果*.axf中读取并设置CPU内核堆栈指针(SP), 程序计数器(PC)和中断向量表偏移地址(VTOR)设置,复位并加载编译器结果到MCU SRAM以及脚本命令控制运行到main()函数等工作:

5.jpg

Debug RAM的调试结果如下:

与Debug Flash一样,可以实现相同的调试功能,全速运行,测试结果与Debug Flash一致。


Tips:Debug RAM时,中断向量表和应用程序被编译到SRAM中了,不占用MCU的Flash资源,所以其不会破坏原有MCU Flash中的程序,且下载过程无需擦除和编程Flash,所以下载速度非常快,也因此,其常被用作外设/应用程序快速验证或者产品量产后做失效分析(FA--Failure Analyze)进行硬件外设模块功能验证。其掉电后,程序丢失。其实,即使下载后未掉电,SRAM中的程序不会丢失,此时复位MCU,SRAM中的程序也不会执行,因为MCU复位后默认的中断向量表在0x0000的Flash地址;


总结


本文详细介绍了ARM Keil 5.27 IDE中使用S32K SDK开发S32K应用程序的方法和步骤,以及如何将S32DS中Processor Expert图形化配置和生成的S32K SDK配置文件添加到Keil工程中使用的方法和步骤。


同样的SDK代码,在不开编译器优化的情况下:


使用Keil编译的结果如下:


  • 占用SRAM:(RW Data + ZI Data)  =  3708 (3.62kB);

  • 占用Flash:(Code + RO Data + RW Data)  = 16100 (15.72kB);


使用S32DS v2018.R1(gcc v6.3)编译的结果如下:


  • 占用SRAM:(.data + .bss)  =  3716 (3.629kB);

  • 占用Flash:(.text +.data)  = 34252 (33.45kB);

可以看到,Keil和S32DS编译的结果,占用SRAM资源相差不大,但占用的Flash(代码编译结果存储器)空间却只有S32DS编译结果的一半不到( 15.72kB  .vs 33.45kB);


代码编译效率提高了一倍多!!!


除了本文的Keil开发S32K应用程序及SDK使用之外,Keil官网也提供了以下三个应用笔记和丰富的demo工程,供大家参考学习:

为了方便大家学习,我也将以上应用笔记文档和demo工程及相关软件都下载,以及本文介绍使用的Kiel和S32DS demo工程,分享到如下百度云盘:


  • 链接: https://pan.baidu.com/s/10oYrnvA-H_E72oz9LaHaTg

  • 提取码: 1jhf