作者:Stephen Du

免责声明: 本文为个人学习笔记及总结,仅代表个人观点,尽可能保证内容准确性。复制/转发请注明来源/作者。

欢迎添加微信交流学习。


AUTOSAR MCAL MCU模块解析

1. 简介

MCU驱动程序提供微控制器初始化,掉电功能,复位和微控制器其他MCAL软件模块所需的特定功能的服务(这里主要指那些公共寄存器的设置)。需要注意的是,启动代码和用于升级的Bootloader是不在AUTOSAR负责范围内的,启动代码是特定于MCU的(不同MCU的启动代码都不一样,见下章节),如下图所示。

MCU驱动程序直接访问微控制器硬件,位于微控制器抽象层(MCAL)中。
MCU驱动包含如下功能:

  • 初始化MCU时钟,PLL,时钟预分频器和MCU时钟分配。
  • RAM初始化。
  • 低功耗模式激活。
  • MCU复位。
  • 提供从硬件获取复位原因的服务/API。

通常,在AUTOSAR标准中,不强制激活和配置MCU低功耗模式。
启用/禁用ECU/MCU电源也不是MCU驱动程序的任务。这将由上层管理模块来处理。

配置内容如下图所示:

2. 启动代码

MCU初始化函数执行前,必须先执行一些MCU的基本初始化。通常这些特殊的初始化代码我们叫启动代码。

MCU的启动代码应该在上电以及任何单片机复位源复位以后执行。它通常只执行那些非常基本的和微控制器的一些特殊要求的初始化代码,并且应保持简短,因为这个时候MCU时钟和PLL尚未初始化。

如果执行太臃肿的代码肯定会影响效率,而汽车里面对系统启动时间有比较高的要求。

通常启动代码应涵盖那些没有在MCU模块服务以及其他MCAL驱动里面包含的功能。以下总结了启动代码中将包含的基本功能。该列表仅做参考,因为某些功能可能并非在所有MCU中都支持,或者某些特殊功能未涵盖。

  • 启动代码应初始化中断和陷阱向量表的基地址。这些基地址可通过配置参数或链接器/定位器的设置提供。
  • 启动代码将初始化用户堆栈指针。用户堆栈指针基地址和堆栈大小。同上,这些信息可通过配置参数或链接器/定位器设置提供。
  • 如果MCU支持上下文保存操作,则启动代码应初始化用于上下文保存操作的内存。连续上下文保存操作的最大数量/大小通过配置参数或链接器/定位器设置提供。
  • 启动代码应确保在MCAL看门狗驱动程序初始化之前看门狗不溢出。例如,你可以通过增加看门狗服务时间或直接关闭看门狗(如果可以的话)来完成。
  • 如果MCU支持用于数据和/或代码的高速缓存,则应在启动代码中对其进行初始化和启用。
  • 启动代码应针对内部存储器初始化MCU的特定功能,例如,存储器/内存保护。
  • 如果使用外部存储器,则应在启动代码中初始化相应存储器。启动代码应准备好根据代码位置的不同支持不同的内存配置。从外部/内部存储器执行代码时,应考虑不同的配置选项。不同存储器的设置应作为配置参数提供给启动代码。
  • 在启动代码中,应执行MCU时钟系统的默认初始化,包括全局时钟预分频器。
  • 如果MCU支持,启动代码应启用特殊功能寄存器(SFR)的保护机制。
  • 启动代码将初始化所有必要的一次性写入类型寄存器。如果某些寄存器被多个驱动程序共有,并且这些寄存器我们只希望写入一次,而不是每个驱动程序初始化的时候都去写一次,这种情况下也非常推荐将这些寄存器放在启动代码里执行。
  • 启动代码应初始化最小数量的RAM,以便正确执行MCU驱动程序服务和这些服务的调用方。
  • 如果支持及需要使用,你还应该初始化好安全校验模块,比如CRC校验,以免发生位错误。

注意:启动代码取决于ECU和MCU。 规范的详细信息将在MCU的设计规范中进行描述

3. 重要概念及API详解

3.1 复位

MCU驱动提供软件触发硬件复位的服务,但不是任何用户都可以使用该服务,只有那些经过授权的用户才能调用该复位服务。

在一个ECU中,可能会有多种原因导致复位,在不同的应用场景中,每次MCU重新初始化后可能需要知道具体的复位原因,如果硬件支持复位源查询功能,则MCU驱动也提供获取上一次复位原因的服务。

3.2 时钟

MCU驱动提供使能及设置MCU时钟的服务。比如:CPU时钟,外设时钟,时钟分频器,时钟倍频器等相关设置。MCU模块还为其他BSW模块提供必备的时钟参考点(McuClockReferencePoint)。需要在MCU里面激活并配置好相关模块的时钟参考源。

3.3 模式

MCU驱动提供激活MCU节能模式的服务,也就是我们平时说的低功耗模式。这些服务通常是直接访问并操作MCU硬件寄存器。现在很多芯片对节能模式还划分了很多等级,支持多个不同等级模式,那么需要根据你的项目需求在MCU模块里面配置好你需要使用的模式。

在典型运用中,ECU运行期间,MCU低功耗模式的进入或退出可能会频繁切换,在这种情况下,任何一个MCAL模块的激活唤醒都会执行唤醒动作。

  • 配置节能模式通常会影响到PLL,内部晶振,CPU时钟,外设时钟,内核时钟等。

  • MCU的正常模式激活或电源切断由上层负责。

  • 某些MCU唤醒只能通过硬件复位来实现。

3.4 Mcu_Init

在Mcu_Init函数执行后,那些配置数据才允许被相关函数访问和使用,比如Mcu_InitRamSection。总的来说,MCU初始化函数对寄存器的操作需符合以下条款:

  • 对于某些寄存器硬件只允许使用一种场景,那些这些寄存器由实现相关功能的模块负责。这里标准原文不大好理解,简单解释就是,比如那些外设控制寄存器(SPI,ADC等等),通常这种寄存器只属于该外设(与其他模块没任何关系),那么很显然这些寄存器有相关外设来负责(SPI,ADC…)。
  • 假如某个寄存器会影响多个硬件模块,并且该寄存器不属于I/O寄存器,则MCU模块负责(如果属于I/O模块,由PORT模块负责)。
  • 对于某些寄存器只能写一次,这种寄存器由启动代码负责(在前文相关章节已经提及)。
  • 所有其他在前面未被提及类型的寄存器都由启动代码负责。

3.5 Mcu_InitRamSection

该函数负责从指定起始地址开始写入指定总长度的指定默认值,每次写入长度也是配置指定的。共涉及下列配置信息:

  • McuRamSectionBaseAddress :指定起始地址
  • McuRamSectionSize :指定写入总长度
  • McuRamDefaultValue :指定写入默认值
  • McuRamSectionWriteSize :指定每次写入长度

该函数必须在Mcu_Init函数执行后才能被调用。

3.6 Mcu_InitClock

该函数负责初始化PLL及其他配置的外设时钟等。该函数执行完后立马退出,不会等PLL锁相/稳定(Locked)再退出,所以通常在该函数调用后需要用户自行调用Mcu_GetPllStatus接口判断时钟是否已锁相/稳定。必须在Mcu_Init函数后调用。该函数是否有效受McuInitClock开关管控。

3.7 Mcu_DistributePllClock

该函数只有在McuNoPll设置为FALSE时才有效。该函数负责分发PLL时钟,并释放当前的时钟源(通常为内部晶振)。

MCU从上电到时钟初始化这段时间会使用默认时钟(芯片内部自带),所以当新的时钟PLL锁相/稳定后,需要释放这个默认时钟。

只有在调用Mcu_GetPllStatus函数判断PLL时钟锁相/稳定后(Locked)才能调用该函数。如果PLL没有锁相/稳定就调用,它会立即返回错误。

3.8 Mcu_GetResetReason

如果硬件支持查询获取复位原因,则该函数返回实际复位原因;如果硬件不支持,则返回值固定为上电复位(MCU_POWER_ON_RESET)。如果该函数在Mcu_Init函数之前调用,则返回未定义复位源(MCU_RESET_UNDEFINED)。

当复位原因被读出后,用户需要保证复位源被清除掉,以防止获取到多个复位原因。当多次调用该函数,每次返回结果应该是一样的。这意味着什么呢?也就是说软件层面有一个管理机制,在保证多次调用返回相同结果的同时又得清理掉相应的硬件复位源标记。

3.9 Mcu_SetMode

该函数假定在调用它之前已经禁用了所有中断。它会保证不会丢掉唤醒中断事件,通常通过后述方式来实现的,在真正设置掉电模式之前去检查有没有相关唤醒中断处于pending状态,以此来保证不会丢掉唤醒中断。

AUTOSAR MCAL解析:MCU相关推荐

  1. AUTOSAR MCAL解析: ADC

    作者:Stephen Du 免责声明: 本文为个人学习笔记及总结,仅代表个人观点,尽可能保证内容准确性. 所有文字均是自己码出来的,所有图片均为自己勾画(除部分来源于原始标准). 复制/转发请注明来源 ...

  2. AUTOSAR MCAL解析:Wdg

    作者:Stephen Du 免责声明: 本文为个人学习笔记及总结,仅代表个人观点,尽可能保证内容准确性.复制/转发请注明来源/作者. 欢迎添加微信交流学习. 模块简介 看门狗/Wdg模块是一个独立的定 ...

  3. Autosar MCAL MCU配置时钟-基于cfg

    文章目录 前言 MCU时钟配置 cfg配置外部晶振 CCU 时钟源的选择 OSC(Oscillator Circuit) OSC的模式: 外部输入时钟模式: 外部晶体/陶瓷谐振模式 Back up时钟 ...

  4. AUTOSAR MCAL PWM

    AUTOSAR MCAL PWM 特征 控制时序 代码调用 深入探讨使用 对称PWM输出 延时触发PWM 特征 Phase shift Reference channel for phase shif ...

  5. AUTOSAR MCAL详解: SPI (2)

    作者:Stephen Du 免责声明: 本文为个人学习笔记及总结,仅代表个人观点,尽可能保证内容准确性. 所有文字均是自己码出来的,所有图片均为自己勾画(除部分来源于原始标准). 复制/转发请注明来源 ...

  6. AUTOSAR MCAL SPI配置

    AUTOSAR MCAL SPI AUTOSAT SPI SPI物理层介绍 SPI 在AUTOSAR的配置主要参数 SPI EB配置参数 AUTOSAT SPI 以下内容基于标准AUTOSAR文档以及 ...

  7. Autosar MCAL开发必知的“术语”+“缩写”概念

    如何使用该博文? ==>您可以将该篇博文当做"字典",遇到疑惑的Autosar"关键字",使用组合键Ctrl+F,快速查找该关键字. 推荐Autosar培 ...

  8. AUTOSAR MCAL详解:FLS

    作者:Stephen Du 免责声明: 本文为个人学习笔记及总结,仅代表个人观点,尽可能保证内容准确性. 所有文字均是自己码出来的,所有图片均为自己勾画(除部分来源于原始标准). 复制/转发请注明来源 ...

  9. AUTOSAR MCAL CAN Driver 接口函数

    1. 单控制器服务接口函数 (1) Can_Init void Can_Init(const Can_ConfigType* Config) 初始化函数,输入为CAN模块配置结构体指针,在MCU启动时 ...

最新文章

  1. 在内地城区经济发展中冒头,长沙雨花是如何做到的?
  2. lodash 核心源码学习(基于4.17.11版本)
  3. android调用web service(cxf)实例
  4. java 以什么开头_判断字符串以什么开头
  5. jfinal mysql date,jfinal与mysql数据类型拾掇大全
  6. 用Java和Java 8创建内部DSL,采用Martin Fowler的方法
  7. 正则表达式的环视实际应用案例
  8. python loadtxt_Python 数据科学入门2:Matplotlib
  9. 23种设计模式之门面模式
  10. js室内地图开发_GIS开发_OpenLayers
  11. 神马专车喊话特斯拉:修不修、赔不赔、认不认?
  12. Genymotion下载及安装(安卓虚拟机)
  13. 判断一个整数的奇偶性php,【算法】- 判断一个整数是否是奇数
  14. Kali-linux:nmap命令
  15. WPF实现选项卡效果(3)——自定义动态添加的AvalonDock选项卡内容
  16. 珠宝行业电子秤串口程序开发
  17. 浅谈市场降温后的区块链发展前景
  18. 运维体系建设(第二章)
  19. 个人理财小助手 —— 数据库(二)
  20. ARM基础与简单汇编

热门文章

  1. java 组合实现汽车类 问题描述:一辆Car有(has)四个轮子(Wheels)和一个发动机(Engine)。现在要求用组合方法设计类Car、类Wheel和类Engine。
  2. 在HTML中marquee有什么作用,【HTML】HTML之marquee详解
  3. Excel 2010 VBA 入门 028 向单元格输入公式
  4. proteus各个版本下载
  5. 汉诺塔python非递归实现,[Python3 练习] 006 汉诺塔2 非递归解法
  6. 杭电oj题目题型分类(转)
  7. 几种下载慢的解决办法
  8. 小白css基础学习记之精灵图
  9. 90后,第一批接棒白酒的“年轻人”
  10. google v8 实战 -- 构建v8