【CP AUTOSAR】Mcu Driver分析和使用


前言

本文介绍CP AUTOSAR 架构下的Mcu组件,基于S32K144芯片、NXP提供的MCAL包,使用EB Tresos工具进行配置的经验,不具体介绍芯片时钟外设等功能。
Mcu组件实现时钟的初始化、RAM初始化、复位原因获取、电源模式设置等功能。
Mcu组件位于Microcontroller Drivers层里。
在这里插入图片描述


一、原理解析

(一)、Start-up Code:
Mcu组件实现芯片的初始化、复位等功能,但BootLoader、Start-up Code是该组件之外实现的,但又有很强的依赖性,在实现MCU初始化之前,启动代码必须已经执行,每个厂商的启动代码都不相同,但AUTOSAR文档里描述了大概以下几个步骤:

1、The start-up code shall initialize the base addresses for interrupt and trap vector tables.
启动代码应该初始化中断和陷阱向量表的基址。
2、These base addresses are provided as configuration parameters or linker/locator setting.
这些基址作为配置参数或链接器/定位器设置提供。
3、The start-up code shall initialize the interrupt stack pointer if an interrupt stack is supported by the MCU.
如果MCU支持中断堆栈,启动代码将初始化中断堆栈指针。
4、The interrupt stack pointer base address and the stack size are provided as configuration parameter or linker/locator settingThe start-up code shall initialize the user stack pointer.
中断堆栈指针基址和堆栈大小作为配置参数或链接器/定位器设置提供。启动代码将初始化用户堆栈指针。
5、The user stack pointer base address and the stack size are provided as configuration parameter or linker/locator setting.
用户堆栈指针基址和堆栈大小作为配置参数或链接器/定位器设置提供。
6、If the MCU supports context save operation, the start-up code shall initialize the memory which is used for context save operation.
如果MCU支持上下文保存操作,启动代码将初始化用于上下文保存操作的内存。
7、The maximum amount of consecutive context save operations is provided as configuration parameter or linker/locator setting.
连续上下文保存操作的最大数量作为配置参数或链接器/定位器设置提供。
8、The start-up code shall ensure that the MCU internal watchdog shall not be serviced until the watchdog is initialized from the MCAL watchdog driver.
启动代码应确保MCU内部看门狗不会被服务,直到从MCAL看门狗驱动程序初始化看门狗。
9、This can be done for example by increasing the watchdog service time.
这可以通过增加看门狗服务时间来实现。
10、If the MCU supports cache memory for data and/or code, it shall be initialized and enabled in the start-up code.
如果MCU支持数据和/或代码缓存,则应在启动代码中对其进行初始化和启用。
11、The start-up code shall initialize MCU specific features with respect to internal memory as, for example, memory protection.
启动代码应初始化MCU有关内部存储器的特定功能,例如存储器保护。
12、If external memory is used, the memory shall be initialized in the start-up code.
如果使用外部存储器,则该存储器应在启动代码中初始化。
13、The start-up code shall be prepared to support different memory configurations depending on code location.
根据代码位置的不同,启动代码应准备好支持不同的内存配置。
14、Different configuration options shall be taken into account for code execution from external/internal memory.
从外部/内部存储器执行代码时,应考虑不同的配置选项。

(二)、Clock:
Mcu组件实现对时钟的初始化,并且为其他组件提供时钟参考点McuClockReferencePoint,如CAN、WDG、SPI等。每个芯片的时钟树和时钟单元都不一样,如S32K144这芯片的时钟有系统时钟、高速内部时钟、低速内部时钟、PLL、外设时钟等,都需要通Mcu来配置。

(三)、Reset:
Mcu组件提供芯片复位功能,就是调用Mcu_PerformReset()来执行芯片的复位。
如果芯片复位后能通过Mcu_GetResetReason()或Mcu_GetResetRawValue()来获取复位源是什么,每个芯片的复位源描述都会不一样。

(四)、Mcu Mode:
Mcu通过MCU芯片的模式切换,具体应用场景什么时候进入低功耗什么时候进入高速运行则由上层应用来实现,如EcuM。比如S32K144这芯片的模式有RUN、HSRUN、VLPR、VLPS、STOP1、STOP2,不同模式下最高时钟频率也不一样。

(五)、RAM初始化:
Mcu提供一段区域内执行RAM初始化的操作,但一般RAM初始化在芯片上电时在启动代码里就执行了所以一般不常用。

总的来说Mcu组件没有特别复杂的机制和概念,唯一比较复杂的是时钟配置。

二、代码架构

无。

三、主要变量和类型描述

(一)、Mcu_ResetType
复位源的类型,AUTOSAR文档里描述了有上电复位、看门狗复位、软件复位、未定义,但实际上一个芯片有很多复位源,每种芯片Mcu_ResetType的定义都会不一样。
在这里插入图片描述
(二)、Mcu_PllStatusType
来描述PLL时钟的状态,如果初始化了PLL时钟,那么就要调用Mcu_GetPllStatus()去判断是否处于MCU_PLL_LOCKED。
在这里插入图片描述

四、主要代码描述

(一)、Mcu_Init()
实现MCU模块的初始化,比如芯片的电源模块、复位控制模块、系统集成模块等。

(二)、Mcu_InitClock()
实现MCU的时钟初始化,比如PLL、外设时钟等初始化,必须要Mcu_Init()执行完后才能调用,执行完后PLL不会马上锁相,要调用Mcu_GetPllStatus()来判断PLL是否锁相。

(三)、Mcu_GetPllStatus()
用来判断PLL时钟是否稳定

(四)、Mcu_DistributePllClock()
只有当Mcu_GetPllStatus()等于MCU_PLL_LOCKED后才能调用,执行后MCU移除当前时钟比如内部时钟然后切换为PLL时钟。

(五)、Mcu_SetMode()
设置MCU的电源模式,比如让MCU进入正常状态还是休眠状态。必须在Mcu_Init()执行后才能调用。

(六)、Mcu_InitRamSection()
实现MCU某段RAM区域的初始化,初始化值能通过配置指定。

(七)、Mcu_GetResetReason()
获取MCU的复位源,返回值是Mcu_ResetType类型的成员。

(八)、Mcu_GetResetRawValue()
获取MCU的复位源,返回值是从芯片寄存器里读出来的原始值。

(九)、Mcu_PerformReset()
触发MCU的软件复位。必须在Mcu_Init()执行后才能调用。

在这里插入图片描述
上图中的Mcu_InitRamSection()不一定要执行。

五、EBTresos配置

本次用的是NXP的S32K144的MCAL,EB配置,主要配置如下:
在这里插入图片描述以上是S32K144的时钟树,通过芯片手册的时钟树能更好的配置Mcu组件。

在这里插入图片描述
在这里插入图片描述
Mcu Number of Mode Settings:
用来定义操作Mcu Mode的数量。

Mcu Number of RAM Sectors:
用来定义操作RAM区域的数量。

32 kHz clock source select:
选择LDO32K_CLK的时钟源。

LPO clock source select:
选择LPO_CLK的时钟源。

在这里插入图片描述
在这里插入图片描述上图为MCU在RUN模式下的时钟配置。

Run Core Clock Frequency:
CORE_CLK的时钟频率。

Run System Clock Frequency:
SYS_CLK的时钟频率。

Run Bus Clock Frequency:
BUS_CLK的时钟频率。

Run Flash Clock Frequency:
FLASH_CLK的时钟频率。

Run System Clock Select:
SYS_CLK时钟源选择,有SPLL、SOSC、SIRC、FIRC。

在这里插入图片描述上图为MCU在VLPR模式下的时钟配置。

在这里插入图片描述上图为MCU在HSRUN模式下的时钟配置。

在这里插入图片描述SOSC Frequency:
SOSC_CLK的时钟频率。

SOSC Div2 Frequency:
SOSCDIV2_CLK的时钟频率。

SOSC Div1 Frequency:
SOSCDIV1_CLK的时钟频率。

在这里插入图片描述SIRC Frequency:
SIRC_CLK的时钟频率。

SIRC Div2 Frequency:
SIRCDIV2_CLK的时钟频率。

SIRC Div1 Frequency:
SIRCDIV1_CLK的时钟频率。

在这里插入图片描述FIRC Frequency:
FIRC_CLK的时钟频率。

FIRC Div2 Frequency:
FIRCDIV2_CLK的时钟频率。

FIRC Div1 Frequency:
FIRCDIV1_CLK的时钟频率。

在这里插入图片描述System PLL Frequency:
SPLL_CLK的时钟频率。

System PLL Div2 Frequency:
SPLLDIV2_CLK的时钟频率。

System PLL Div1 Frequency:
SPLLDIV1_CLK的时钟频率。

System PLL Input Frequency:
PLL的输入源的时钟频率,也就是SOSC_CLK的时钟频率。

在这里插入图片描述
上图为MCU的外设时钟配置,可以给外设选择时钟源、开关时钟源,在使用其他MCAL组件时,注意这里要配置。具体每个外设时钟源选择可以参考S32K144数据手册的Clock Distribution这章。
在这里插入图片描述
如上图设置其他组件的时钟参考点,其他组件在配置时会用到Mcu组件里设置的时钟参考点,所以在Mcu组件这里就要先配置好。具体每个外设时钟源选择可以参考S32K144数据手册的Clock Distribution这章。
在这里插入图片描述
这里定义MCU的MODE列表。用于在调用Mcu_SetMode()切换MCU MODE用,可以配置RUN、HSRUN、VLPR、VLPS、STOP1、STOP2。
在这里插入图片描述用来配置RAM初始化的起始地址、大小、初始值等。
在这里插入图片描述
用来配置有些中断是否开启。
在这里插入图片描述
用来配置是否低压复位、是否低压中断等。

六、使用范例

时钟初始化:

/**忽略其他配置**/
	Mcu_Init(&McuModuleConfiguration);
	Mcu_InitClock(McuClockSettingConfig_80);
	while ( MCU_PLL_LOCKED != Mcu_GetPllStatus() )
	{
		/* wait until all enabled PLLs are locked */
	}
	Mcu_DistributePllClock();
	Mcu_SetMode(McuModeSettingConf_RUN);

七、参考资料

https://www.autosar.org/fileadmin/standards/R23-11/CP/AUTOSAR_CP_SRS_MCUDriver.pdf
https://www.autosar.org/fileadmin/standards/R23-11/CP/AUTOSAR_CP_SWS_MCUDriver.pdf
https://www.autosar.org/fileadmin/standards/R23-11/CP/AUTOSAR_CP_EXP_LayeredSoftwareArchitecture.pdf


总结

Mcu组件复杂点的还是时钟的配置,时钟这块一定要第一个配好,因为有些其他组件会和Mcu组件里配置的时钟有相关联,比如组件参考时钟、外设时钟等。

  • 14
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值