外设使用Tips之MPC56xx/57xx系列MCU的模式控制与切换(片上外设资源使能与功耗控制)
0赞外设使用Tips之Qorivva MPC56xx/57xx系列MCU的模式控制与切换(片上外设资源使能与功耗控制)
内容提要
一、引言
二、Qorivva MPC56xx/57xx系列MCU的MC_ME模块详解
2.1. 配置寄存器ME_ME
2.2. 配置寄存器ME_<mode>_MC
2.3. 外设运行模式配置寄存器ME_RUN_PC0..7
2.4. 外设低功耗配置寄存器ME_LP_PC0..7
2.5. 外设控制寄存器ME_PCTL0..143
2.6. 模式控制寄存器ME_MCTL
2.7. 全局状态寄存器ME_GS
三、配置模式控制模块使能片上外设
四、结论与具体实例工程
一、引言
对于很多第一次接触QorivvaMPC56xx/57xx系列32位汽车级MCU的工程师来说,如何配置一个外设让其能够正常工作似乎有点复杂,令人头疼。其原因在于其相对于之前的S08和S12(X)系列MCU来说,在其内核CPU的工作模式(normal、wait and stop mode)之外,还专门设计了一个模式控制(MC—ModeControl)相关模块,包括MC_ME—Mode Entry、MC_RGM--Reset Generation Module、MC_CGM—Clock Generation Module和MC_PCM—Power Control Unit四个不同的功能模块来管理整个MCU的复位、时钟和电源工作模式,以实现功能安全和功耗管理。
下表中列出了常用的MPC56xx/57xx各MCU系列的模式管理,除了用于动力总成的MPC563XM、MPC564xA和MPC577xM系列之外,都有MC模块:
二、QorivvaMPC56xx/57xx系列MCU的MC_ME模块详解
以下以MPC560xS系列为例,介绍MC_ME的控制原理。
各种模式功能描述、进入退出条件对比如下表:
其中,RESET、SAFE、DRUN和TEST模式属于系统模式(SYSTEM MODE);RUN0~3属于用户模式(USER MODE);而HALT、STOP和STANDBY模式属于低功耗模式(LOW-POWER MODE)。Qorivva MPC56xx/57xx系列MCU的各种模式的相互转换状态机如下:
2.1. 配置寄存器ME_ME
配置寄存器ME_ME使能目标模式(默认ME_ME=0x1F,值使能了系统模式和RUN0用户模式):若要使能其他用户模式和低功耗模式,则需要将相应位置一,比如:
ME.ME.R =0x043F;/*enable RUN0~1 and STOP low power mode*/
2.2. 配置寄存器ME_<mode>_MC
通过模式配置寄存器ME_<mode>_MC配置目标模式的系统时钟源、参考时钟、PLL、Flash、主电源和IO管脚输出下电控制,比如:
ME.RUN1.MC.R= 0x001F00F4;
/*enable PLL0and PLL1 and configure PLL0 output as system clock in RUN1 mode*/
各模式配置寄存器ME_<mode>_MC复位默认值及主电源、时钟、Flash资源使能以及IO管脚输出下电控制情况如下表:
从上表中可以看到,16MHz的内部参考时钟FIRC都是使能的,且作为系统时钟工作(只有STANDBY模式除外),主电源也是如下,除STANDBY模式外,都是开启的,这样才能保证MCU内核和外设的功能正常,Flash在低功耗模式下,则处于低功耗或者掉电模式,以节省系统功耗。IO输出下电控制默认仅在SAFE模式和STANDBY模式使能。
注意:具体每一种模式下,各种时钟资源和主电源以及Flash和IO下电控制的配置有所不同,需要具体参考手册进行配置,比如为了实现系统最低功耗,ME_STANDBY_MC寄存器中,只有FXOSCON和FIRCON位可以配置,其余控制位都是只读的,不可配置:
2.3. 外设运行模式配置寄存器ME_RUN_PC0..7
通过外设运行模式配置寄存器ME_RUN_PC0..7使能8种不同外设运行状态配置下各种模式外设时钟是激活(Active)还是冻结(Frozen)。默认各种运行模式下,外设时钟都是冻结的,也就是不允许其正常工作。所以为了让外设在目标运行模式下正常工作,必须将其相应的位设置为1(Active),比如:
ME.RUN.PC0.R = 0x30; /*enable peripherals in RUN0 andRUN1 with RUN_PC0 configuration */
ME.RUN.PC1.R = 0x18; /*enable peripherals in RUN0 andDRUN with RUN_PC1 configuration */
2.4. 外设低功耗配置寄存器ME_LP_PC0..7
通过外设低功耗配置寄存器ME_LP_PC0..7使能8种不同外设运行状态配置下各种模式外设时钟是激活(Active)还是冻结(Frozen)。默认各种低功耗模式下,外设时钟都是冻结的,也就是不允许其正常工作。所以为了让外设在目标低功耗模式下正常工作,必须将其相应的位设置为1(Active),比如:
ME.LP.PC0.R = 0x0400; /*enable peripherals in STOPmode with LP_PC0 configuration */
ME.LP.PC1.R = 0x2400; /*enable peripherals in STANDBYand STOP mode with LP_PC1 configuration */
2.5. 外设控制寄存器ME_PCTL0..143
配置外设控制寄存器ME_PCTL0..143选择相应的外设的运行模式和低功耗模式配置以及在debug状态下工作情况,其值复位后的默认为0x00,即默认每个外设的选择都是允许模式配置为ME_RUN_PC0,而低功耗模式配置为ME_LP_PC0:
不同的part,其片上外设种类及数量不同,需要查看相应的数据手册确定对于的外设控制寄存器号以完成相应外设的配置,如果想要某一外设在相应的目标模式下能够正常工作,就必须保证其选择的外设运行模式配置寄存器ME_RUN_PC0..7和外设低功耗模式配置寄存器ME_LP_PC0..7配置中该模式外设时钟使能。比如:
ME.PCTL4.R = 0x01;
/* DSPI0 debug mode frozen, low power mode withME_LP_PC0 configuration and run modewith ME_RUN_PC1 configuration*/
以下为MPC5606S的外设控制寄存器:
PS:用户可以通过MC_ME模块的外设状态寄存器Peripheral Status Register(ME_PS0..3)判断某一片上外设是否处于激活(active)状态,只有该外设处于active状态,才可以正确配置该外设寄存器并使用:
2.6. 模式控制寄存器ME_MCTL
向模式控制寄存器ME_MCTL中写入要进入的目标模式代码和控制密钥(0x5AF0)及逆密钥(0xA50F)完成目标模式的切换,比如:
ME.MCTL.R = 0xA0005AF0;/*request to enter STOP(0xA)mode with control key(0x5AF0)*/
ME.MCTL.R = 0xA000A50F;/*request to enter STOP(0xA)mode with control inverted key(0x5AF0)*/
2.7. 全局状态寄存器ME_GS
查询全局状态寄存器ME_GS,以确认正确进入目标模式且系统时钟切换完成:
while(ME.GS..B.S_CURRENTMODE != 0x4); /*wait MCU totransmit to RUN0 mode*/
注意:以上语句对于STOP和STANDBY低功耗模式不适用,因为,在STOP和STANDBY模式下,Flash处于掉电模式(power-downmode),不能正常工作,所以不能运行放置在Flash的上述查询代码。
PS: 对于某一片上外设资源和时钟模块在模式切换中,是否完成切换,用户可以通过查看调试模式切换状态寄存器Debug Mode Transition Status Register (ME_DMTS)相应的外设位来判断:
三、配置模式控制模块使能片上外设
综上所述,要让具有模式控制功能的QorivvaMPC56xx/57xx系列MCU的片上外设工作需要配置上述MC_ME模块相关寄存器,推荐流程如下:、
1. 配置寄存器ME_ME使能目标模式;
2. 配置模式配置寄存器ME_<mode>_MC使能目标模式的系统时钟源、参考时钟、PLL、Flash、主电源和IO管脚输出下电控制;
3. 配置外设运行模式配置寄存器ME_RUN_PC0..7使能相应外设运行外设配置下各种模式下的外设时钟;
4. 配置外设低功耗模式配置寄存器ME_RUN_PC0..7使能相应外设低功耗外设控制配置下各种模式下的外设时钟;
5. 配置外设控制寄存器ME_PCTL0..143选择相应的外设的运行模式和低功耗模式配置
6. 向模式控制寄存器ME_MCTL中写入要进入的目标模式代码和控制密钥(0x5AF0)及逆密钥(0xA50F) ;
7. 查询全局状态寄存器ME_GS,以确认正确进入目标模式且系统时钟切换完成;
四、结论与具体实例工程
从以上介绍可以看到:Qorivva MPC56xx/57xx系列MCU通过模式控制(MC)模块,实现了对MCU系统安全的配置(SAFE模式)、通过对片上外设/时钟资源功耗的精确控制,可以灵活实现不同的性能与功耗模式配置和切换,满足不同的系统需求。
当然,上述对MC_ME模块的配置流程显得十分繁琐,我们其实可以通过非常简短的配置就能够让QorivvaMPC56xx/57xx系列MCU的片上外设工作,分析如下:
由于模式使能寄存器ME_ME复位默认值为0x1F,已经使能了系统模式(包括DRUM模式)和RUN0用户模式,而MCU系统复位完成后会自动退出RESET模式进入到DRUN模式,而DRUN模式配置寄存器ME_DRUN_MC = 0x001F0010à使能主电源,CFLASH和DFLASH处于正常模式,16MHzFIRC使能并作为系统时钟源,所以整个MCU可以基于内部FIRC工作。而外设控制寄存器ME_PCTL0..143默认选择(ME_PCTL0..143=0x00)的ME_RUN_PC0=0x00(即关闭各种允许模式下的外设时钟)。所以,我们只需要配置ME_RUN_PC0使能所有模式下的外设时钟即可。因此,最简单的让所有片上外设都工作(工作在DRUN/RUN0模式,使用内部16MHz FIRC作为系统时钟源,PLL关闭,主电源、Flash都正常工作)的配置代码如下:
ME_RUNPC[0].R=0xFE;/*peripherals active in all RUN modes including DRUN mode*/
ME.MCTL.R =0x30005AF0;/*request to enter DRUN(0x3) mode with control key(0x5AF0)*/
ME.MCTL.R =0x3000A50F;/*request to enter DRUN(0x3) mode with control inverted key(0xA50F)*/
while(ME.GS.B.S_CURRENTMODE != 0x3); /*wait MCU totransmit to DRUN mode*/
以下为以MPC5606SEVB为例,输出GPIO管脚控制板载LED的代码和工程(基于CodeWarrior 10.6.4 IDE)。
MPC5606SEVB的4颗板载LED电路连接如下:
上述控制LED的GPIO管脚对应的SIU模块控制寄存器(SIU_PCR)如下:
Qorivva MPC5606S的GPIO输出控制寄存器SIU_GPDO定义如下:
基于以上,新建一个MPC5606S的空工程,在main.c中添加如下简单代码即可完成对4颗板载LED的跑马灯控制:
完整的工程我将其通过以下百度云盘分享给大家参考:
链接: https://pan.baidu.com/s/1eSELtv0
密码: dmj9