• 300查看
  • 0回复

[芯片硬件] 浅谈嵌入式MCU软件开发之S32K1xx系列MCU的启动过程和启动时间优化方法详细

[复制链接]


该用户从未签到

发表于 9-3-2024 22:15:03 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


内容提要

引言

1. S32K1xx系列MCU的启动过程详解

1.1 S32K1xx系列MCU的启动过程的硬件启动序列(boot squence)

1.2 S32K1xx系列MCU的启动过程的软件启动程序(startup)

2. S32K1xx系列MCU的启动时间优化方法详解

2.1 设置startup和clock初始化部分的SDK代码的优化等级(Assembler/C compiler optimization level)为-O1

2.2 使用串行(Sequential) Secure boot而不是并行(Parallel) Secure boot

2.3  配置Flash选项字节(0x40D@P-Flash)保证复位后CPU内核和系统时钟分配系数最小,运行频率为硬件允许的最快频率

2.4  减少.data段数据

2.5 配置使能S32K14x系列MCU的内核硬件FPU

2.6 配置使能S32K14x系列MCU的内核Cache

2.7 优化bootloader,尽早跳转到APP应用程序

2.8 选择频率更高的外部晶振并配置合适的增益模式

总结

引言
一些功能安全要求较高的汽车ECU应用,比如电子助力转向(EPS)、电子档位控制(gear control)等,对于ECU的启动时间(startup/boot time)有严格的要求, 希望ECU使用的MCU能够尽快完成系统启动初始化,执行功能程序。此外,一些整车的网络管理也要求ECU在低功耗模式唤醒后,能够尽快响应CAN/LIN总线报文,也要求MCU的启动时间要足够快。
针对这一需求,汽车ECU软件的开发工程师必须对其使用的MCU启动过程(包括硬件boot和软件startup)十分了解,才能够有针对性的对其进行优化,从而满足ECU系统对启动时间的要求。
接下来,本文就以NXP的通用汽车MCU--S32K1xx系列MCU为例,介绍其启动过程和启动时间的优化方法,希望对大家有所帮助和启发。

1. S32K1xx系列MCU的启动过程详解
如上文所讲,在开始对S32K1xx系列MCU的启动时间进行优化之前,我们必须首先了解其启动过程。
S32K1xx系列MCU从复位到这些用户应用程序(main()函数)的启动过程包括硬件的boot过程和软件的startup两部分。
1.1 S32K1xx系列MCU的启动过程的硬件启动序列(boot squence)
S32K1xx序列MCU上电后,内部的电源管理器(regulator)将系统置于POR复位状态,直到VDD电压上升到超过POR复位门限电平,然后低电压检测模块会接管系统复位,直到VDD电压上升超过其LVR复位门限电平。在完成POR和LVR复位后,MCU系统的电源系统已经能够为内部时钟(FIRC、SIRC和LPO等)和存储器(NVM)模块以及CPU内核提供稳定的工作电压了,接下来,硬件将使能MCU boot所需的时钟(比如core clock, system clock, flash clock和 busclocks等)并根据用户的配置(FOPT @ 0x40D)内核和系统时钟分频器, 然后,启动Flash控制器初始化,等待其完成初始化后,才会释放RESET_B的外部复位引脚,系统退出复位,CPU从默认中断向量(0x0000地址开始的P-Flash存储器)中加载内核主堆栈(MSP @0x0000)和PC的初始化值(Reset_Handler @ 0x0004),并将LR寄存器设置为0xFFFF_FFFF,从而MCU就可以开始运行用户可控的Startup软件代码了,与此同时,若用户使能了EEE数据自动拷贝功能(在调用FlexNVM partition命令时,设置FCCOB3 = 1),备份在FlexNVM中的EEE数据将被自动拷贝到FlexRAM中:
浅谈嵌入式MCU软件开发之S32K1xx系列MCU的启动过程和启动时间优化方法详细w1.jpg

1.2 S32K1xx系列MCU的启动过程的软件启动程序(startup)
关于S32K1xx系列MCU的startup过程,请参考如下公众号文章(点击文章标题即可直接跳转阅读):
《浅谈嵌入式MCU软件开发之S32K1xx系列MCU启动过程及重映射代码到RAM中运行方法详解》;
本文不再赘述。
2. S32K1xx系列MCU的启动时间优化方法详解
基于以上介绍,下面我们就一起来看看S32K1xx系列MCU的启动时间优化具体方法和步骤。
2.1 设置startup和clock初始化部分的SDK代码的优化等级(Assembler/C compiler optimization level)为-O1
将startup和clock初始化部分的SDK代码设置优化等级(Assembler/C compiler optimization level)为-O1,通过编译器优化,减少执行这部分功能时的CPU指令,从而加快startup代码和clock初始化代码的执行。
具体方法可以参考如下公众号文章(点击文章标题即可直接跳转阅读):
《S32DS GNU GCC编译优化选项与配置方法详解及S32 SDK代码编译优化选项设置建议》;

2.2 使用串行(Sequential) Secure boot而不是并行(Parallel) Secure boot
根据1.1小节的介绍,若在应用中使用了S32K1xx系列MCU的硬件加密模块CSEc的安全启动(Secure boot)功能,建议使用串行(Sequential) Secure boot而不是并行(Parallel) Secure boot, 因为后者工作时CSEc和CPU内核都会访问P-Flash,从而导致CPU内核从P-Flash取指令的速度变慢,从而拉长Startup运行时间,而且Secure boot运行完之前不允许修改系统时钟配置(尤其是Flash的工作时钟FLASH_CLK):
浅谈嵌入式MCU软件开发之S32K1xx系列MCU的启动过程和启动时间优化方法详细w2.jpg

Tips: 关于S32K1xx系列MCU的Secure boot配置,请参考以下应用笔记(点击文章标题即可直接跳转阅读):
AN5401, Getting Started with CSEc Security Module (REV 1) :  AN5401SW.zip         2.3  配置Flash选项字节(0x40D@P-Flash)保证复位后CPU内核和系统时钟分配系数最小,运行频率为硬件允许的最快频率
根据1.1小节的介绍,要获得最短的S32K1xx系列MCU复位序列(reset sequence)和启动时间(boot time),用户需要检查确认为其地址0x40D的Flash选项配置字节的最低位(FTFC->LPBOOT)是否为1(默认Flash擦除状态),以确保复位和启动过程中使用硬件运行的最快频率--48MHz(FIRC时钟,S32K1xx系列MCU复位后默认的系统参考时钟):
浅谈嵌入式MCU软件开发之S32K1xx系列MCU的启动过程和启动时间优化方法详细w3.jpg

Tips: 配置Flash选项配置字节的最低位(FTFC->LPBOOT)为0,则将复位过程中内核和系统时钟分频系数为2(将48MHz FIRC二分频),使用24MHz的core clock和system clock,可以降低复位和启动过程的平均功耗。
Tips: S32K1xx系列MCU的P-Flash地址0x400~0x40F的16个字节为Flash配置区域(Flash configuration filed),其中包括8字节的Flash加密解密验证后门秘钥(unsecure verify key),P-Flash和D-Flash以及EEE存储器的保护(protection)配置字节、Flash选项配置(FOPT)字节以及Flash加密(FSEC)配置字节等:
浅谈嵌入式MCU软件开发之S32K1xx系列MCU的启动过程和启动时间优化方法详细w4.jpg

Tips: 关于S32K1xx系列MCU的Flash配置区域(Flash configuration filed)定义和配置方法,请参考如下公众号文章(点击文章标题即可直接跳转阅读):
《S32K1xx系列MCU应用指南之芯片锁死(lockup)复位原因分析与恢复方法详解》;
2.4  减少.data段数据
减少.data段数据,包括用户定义使用的带初始化值的全局变量和Processor Expert生成的SDK外设驱动初始化配置结构体(double check所有的SDK外设驱动和中间件组件配置的Read only选项勾选,如下为CAN_PAL组件的SDK配置,默认都是勾线的,除非用户需要在驱动和中间件运行时改变其配置(重新初始化)。
Tips:  若不可避免的需要这样使用,也可以选择多生成一个配置(configuration),运行时调用不同的初始化配置即可):
浅谈嵌入式MCU软件开发之S32K1xx系列MCU的启动过程和启动时间优化方法详细w5.jpg

2.5 配置使能S32K14x系列MCU的内核硬件FPU
在startup代码和时钟配置时会用到一些除法计算,配置使能S32K14x系列MCU的内核硬件FPU,能够缩短计算时间。具体方法可以参考如下公众号文章(点击文章标题即可直接跳转阅读):‘
《浅谈嵌入式MCU软件开发之S32K1xx系列MCU CPU内核性能优化方法详解》;
2.6 配置使能S32K14x系列MCU的内核Cache
配置使能S32K14x系列MCU的内核Cache,能够加速CPU内核的取指(Fetch Instruction),从而缩短starup代码的执行时间。具体方法可以参考如下公众号文章(点击文章标题即可直接跳转阅读):
《浅谈嵌入式MCU软件开发之S32K1xx系列MCU CPU内核性能优化方法详解》;
  2.7 优化bootloader,尽早跳转到APP应用程序
对于带有bootloader功能的ECU应用程序,由于每次MCU复位(无论是POR复位还是看门狗溢出复位或者RESET外部引脚复位、时钟丢失复位,内核lockup复位以及低功耗外设确认终止复位等)后,CPU内核都将首先运行bootloader代码,所以其实现用户ECU功能的应用程序的真实starup启动时间(APP actual startup time)是包含bootloader执行时间的(如下图所示)。
因此,在bootloader实现时,将跳转到用户应用程序(APP)尽量提前,比如放到系统时钟和外设的初始化,甚至是bootloader的reset_handler最开始进行ECC初始化之前就判断APP是否ready和valid(如下图所示),从而进行快速跳转,这样的bootloader设计不但可以避免bootloader中初始化时钟和外设对APP的影响还可以大大提高此类应用的startup启动时间。
浅谈嵌入式MCU软件开发之S32K1xx系列MCU的启动过程和启动时间优化方法详细w6.jpg

2.8 选择频率更高的外部晶振并配置合适的增益模式
另外,若使用了外部无源石英晶振(Crystal)作为S32K1xx系列MCU的参考时钟,则选择不同的晶振频率和XOSC模块的增益配置都会影响其启动时间,晶振频率越高,所以的启动越快,配置High-gain模式,时钟的稳定工作时的信号幅值越大,抗干扰能力越强,但是所需的启动时间也越长:
浅谈嵌入式MCU软件开发之S32K1xx系列MCU的启动过程和启动时间优化方法详细w7.jpg

Tips: 对S32K14x系列MCU,其内部集成了SPLL倍频模块,其要求≥8MHz的时钟(High Range Mode)输入作为为参考时钟:
浅谈嵌入式MCU软件开发之S32K1xx系列MCU的启动过程和启动时间优化方法详细w8.jpg

Tips: 若配置使能外部晶振且配置使用high-gain模式时,硬件设计必须外接1MΩ的反馈电阻(RF),而使能low-gain模式时,则不需RF:
浅谈嵌入式MCU软件开发之S32K1xx系列MCU的启动过程和启动时间优化方法详细w9.jpg

浅谈嵌入式MCU软件开发之S32K1xx系列MCU的启动过程和启动时间优化方法详细w10.jpg

Tips: Freescale S12G系列汽车MCU的外部晶振时钟起振时间如下,作为参考,也是频率越高,启动越快(start-up时间越短):
浅谈嵌入式MCU软件开发之S32K1xx系列MCU的启动过程和启动时间优化方法详细w11.jpg

总结
本文详细介绍了S32K1xx系列通用汽车MCU的启动过程(硬件boot + 软件Startup)和从复位到用户应用功能程序真正开始执行的启动时间优化原理及具体实现方法。当然,除了以上2. S32K1xx系列MCU的启动时间优化方法详解介绍的优化选项外,若不考虑用户软件与S32K1xx SDK的兼容性,缩短软件Startup代码执行的最好办法是在复位函数(Reset_Handler)中尽早初始化SPLL(可在系统初始化函数SystemInit()中调用SDK的时钟初始化API函数,甚至是在关闭CPU全局中断之后就用汇编代码配置系统时钟,这样ECC初始化也将加快),提高CPU内核和系统总线频率:
浅谈嵌入式MCU软件开发之S32K1xx系列MCU的启动过程和启动时间优化方法详细w12.jpg

以上就是今天要跟大家分享的内容,虽然是基于S32K1xx系列MCU进行介绍的,但是对于其他嵌入式MCU,比如Qorivva MPC56/57xx系列MCU的启动时间优化也是有参考价值的。希望本文对大家有所帮助和启发。

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 1-2-2025 07:46 , Processed in 0.181693 second(s), 32 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.