1. 基本概念
描述了MCU(Microcontroller Unit) 驱动程序的功能和 API。 MCU 驱动程序为其他 MCAL 软件模块所需的基本微控制器初始化、断电功能、复位和微控制器特定功能提供服务。除了启动代码(见下图)之外,初始化服务还允许灵活的和应用程序相关的 MCU 初始化。启动代码非常特定于 MCU。本文档中提供的启动代码描述用于指导在标准化 MCU 初始化能够启动之前必须考虑的功能。
MCU 驱动程序直接访问微控制器硬件,位于微控制器抽象层 (MCAL) 中。
MCU驱动的功能特点:
1.MCU 时钟、PLL、时钟预分频器和 MCU 时钟分配的初始化
2.RAM 部分的初始化
3.进入MCU低功耗模式
4.触发MCU复位
5.提供从硬件获取复位原因的服务
2. 模块依赖
MCU模块有个依赖,即start-up code
在MCU驱动程序可以初始化之前,必须执行一个基本的MCU初始化。这个MCU特定的初始化通常在start-up code中执行。
上电和任何类型的MCU复位后,都要执行MCU的启动代码。它启动初始化,并应保持简短,也应涵盖MCU特定的初始化,不包含其他MCU服务或其他MCAL驱动程序的一部分。下面的描述总结了start-up code中包含的基本功能要求:
1.初始化interrupt和 trap vector tables的基地址;
2.初始化interrupt stack pointer(如果MCU支持);
3.初始化user stack pointer;
4.初始化context save operation用的Memory(如果MCU支持context save operation);
5.在初始化MCAL watchdog之前,保证MCU内部watchdog不要被触发,这个可以通过增加watchdog时间来做;
6.初始化并使能data/code cache memory(如果MCU支持cache memory);
7.初始化MCU内部关于内部memory的特定功能,例如memory protection;
8.如果用了External Memory,也要对其做初始化,并且还要做好区域划分;
9.不同的Memory划分配置,需要以参数的形式提供给start-up code;
10.需要默认初始化时钟,并包括全局时钟分频器;
11.需要使能特殊功能寄存器(SFR's)的保护机制(如果MCU支持);
12.初始化一次写入的寄存器或者多Driver公用的一次写入寄存器,而不是多次重复写入;
13.初始化最小量的RAM以供Driver service使用。
3. 应用时序
1)初始化
对MCU模块的一系列初始化动作。
2)唤醒
在睡眠之前,先调用Mcu_SetMode,然后在睡眠状态被唤醒,可以获得Wake-up Reason。
3)复位原因
通过调用Mcu_GetResetReason或Mcu_GetResetRawValue可以获得复位原因。
4)执行复位
这个比较简单,调用Mcu_PerformReset函数可以让MCU复位
4. 参数配置
MCU模块表面上用到的功能不多,但是配置并不简单,特别是时钟配置,需要熟悉MCU内部时钟参数和要求。
这里有几个配置要特别注意的:
1. McuClockSettingConfig
(1) 8Mhz Ring Stop Request Mask
此参数启用或禁用 8MHz 环形振荡器的停止请求掩码。
false: stand-by mode下停止运行.
true: stand-by mode下可继续运行.
(2) Clk Mode Select
该参数是用于选择clock setting mode的。
MCU_EMCLK_ID_1: CPU clock as 8MHz Ring oscillator. If 8MHz ring oscillator is not working then 240KHz will be automatically supplied to the CPU.
MCU_MAIN_OSC_ID_2: CPU clock as Main oscillator fX.
MCU_CPLLCLK_ID_3: CPU clock from PLL.
这个参数最好配合参考Spec来选择
(3) Cpu Clock Divider
这参数用于Cpu Clock分频。
DIVBY_1_ID_1: CPUCLKSOURCE/1 is selected as clock divider.
DIVBY_2_ID_2: CPUCLKSOURCE/2 is selected as clock divider.
DIVBY_4_ID_3: CPUCLKSOURCE/4 is selected as clock divider.
DIVBY_8_ID_4: CPUCLKSOURCE/8 is selected as clock divider.
注:该参数包含 CPU 主系统时钟频率。这不会影响 MCU 驱动程序的行为,除非所选模式(即参数 McuClkModeSelect)为 MCU_CPLLCLK_ID_3。这是一个可供其他模块参考的频率。
2. 模块时钟配置
在McuClockSettingConfig Container上右键,Create Sub Container,可以有很多模块时钟配置选择,如上图。
以下以McuAwoAdc0模块为例讲解。
(1) Div Clock Sel
该参数是C_AWO_ADCA 源时钟分频器选择用的。
DIVBY_1_ID_1: Divider selection for source clock of C_AWO_ADCA.
DIVBY_2_ID_2: Divider selection for source clock of C_AWO_ADCA.
(2) Src Clock Sel
这参数是给C_AWO_ADCA时钟源选择。
DISABLE_ID_0: Disable the Source clock for C_AWO_ADCA.
FRH_ID_1: Source clock selection for C_AWO_ADCA from High Ring Oscillator.
FX_ID_2: Source clock selection for C_AWO_ADCA from Main Oscillator.
PPLLCLK_DIVBY_2_ID_3: Selects PPLLCLK2 as Source clock selection for C_AWO_ADCA.
(3) Stop Request Mask
此参数启用或禁用停止请求屏蔽寄存器。
false: Stops the operation in Stand-by mode.
true: Continues the operation in stand-by mode.
3. McuModeSettingConfig
这里有个MCU模数的参数配置,例如配置MCU运行或者睡眠的模数,以下配置xxx_OFF Container表示MCU 睡眠模式,xxx_ON Container表示MCU 运行模式。
(1) Main Osc Operation
此参数启用或禁用主振荡器及其相关功能在Stand-By模式下的操作。
true: enables the operation of Main Oscillator.
false: disables the operation of Main Oscillator.
(2) Mode Transition Req
此参数启用或禁用从 Mcu_SetMode API 内部实际转换到低功耗模式。
true: enables transition required to the low power mode.
false: disables transition required to the low power mode.
(3) Mode Type
该参数包含省电模式类型,有以下几种。
RUN_MODE: Both two areas (AWO and ISO) are under power and running.
STOP_MODE: Clock supplies to the Always-On area and isolated area is stopped.
DEEPSTOP_MODE: Power supply of the Isolated-Area can be switched off.
HALT_MODE: HALT assembler instruction just pauses the CPU by stopping the operation of the CPU's pipeline.
CYCLIC_RUN_MODE: Cyclic RUN mode is entered when the wake-up factors 2 are generated.
CYCLIC_STOP_MODE: Stops the CPU in Cyclic RUN mode.
这个参数的真正含义,请参考MCU Spec Standby章节
4. EcuM的Sleep Mode配置
额外提一点,这个是EcuM的配置,里面有个Sleep Mode的选择,选择的就是上面配置的MCU Mode,这个非常简单,选择已配置好的MCU Mode即可,见下图。
|