二、QorivvaMPC56xx/57xx系列MCU的MC_ME模块详解
2.1.配置寄存器ME_ME
2.2.配置寄存器ME_
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
三、配置模式控制模块使能片上外设
四、结论与具体实例工程
下表中列出了常用的MPC56xx/57xx各MCU系列的模式管理,除了用于动力总成的MPC563XM、MPC564xA和MPC577xM系列之外,都有MC模块:
以下以MPC560xS系列为例,介绍MC_ME的控制原理。
其中,RESET、SAFE、DRUN和TEST模式属于系统模式(SYSTEMMODE);RUN0~3属于用户模式(USERMODE);而HALT、STOP和STANDBY模式属于低功耗模式(LOW-POWERMODE)。QorivvaMPC56xx/57xx系列MCU的各种模式的相互转换状态机如下:
配置寄存器ME_ME使能目标模式(默认ME_ME=0x1F,值使能了系统模式和RUN0用户模式):若要使能其他用户模式和低功耗模式,则需要将相应位置一,比如:
ME.ME.R=0x043F;/*enableRUN0~1andSTOPlowpowermode*/
通过模式配置寄存器ME_
ME.RUN1.MC.R=0x001F00F4;
/*enablePLL0andPLL1andconfigurePLL0outputassystemclockinRUN1mode*/
各模式配置寄存器ME_
从上表中可以看到,16MHz的内部参考时钟FIRC都是使能的,且作为系统时钟工作(只有STANDBY模式除外),主电源也是如下,除STANDBY模式外,都是开启的,这样才能保证MCU内核和外设的功能正常,Flash在低功耗模式下,则处于低功耗或者掉电模式,以节省系统功耗。IO输出下电控制默认仅在SAFE模式和STANDBY模式使能。
注意:具体每一种模式下,各种时钟资源和主电源以及Flash和IO下电控制的配置有所不同,需要具体参考手册进行配置,比如为了实现系统最低功耗,ME_STANDBY_MC寄存器中,只有FXOSCON和FIRCON位可以配置,其余控制位都是只读的,不可配置:
通过外设运行模式配置寄存器ME_RUN_PC0..7使能8种不同外设运行状态配置下各种模式外设时钟是激活(Active)还是冻结(Frozen)。默认各种运行模式下,外设时钟都是冻结的,也就是不允许其正常工作。所以为了让外设在目标运行模式下正常工作,必须将其相应的位设置为1(Active),比如:
ME.RUN.PC0.R=0x30;/*enableperipheralsinRUN0andRUN1withRUN_PC0configuration*/
ME.RUN.PC1.R=0x18;/*enableperipheralsinRUN0andDRUNwithRUN_PC1configuration*/
通过外设低功耗配置寄存器ME_LP_PC0..7使能8种不同外设运行状态配置下各种模式外设时钟是激活(Active)还是冻结(Frozen)。默认各种低功耗模式下,外设时钟都是冻结的,也就是不允许其正常工作。所以为了让外设在目标低功耗模式下正常工作,必须将其相应的位设置为1(Active),比如:
ME.LP.PC0.R=0x0400;/*enableperipheralsinSTOPmodewithLP_PC0configuration*/
ME.LP.PC1.R=0x2400;/*enableperipheralsinSTANDBYandSTOPmodewithLP_PC1configuration*/
配置外设控制寄存器ME_PCTL0..143选择相应的外设的运行模式和低功耗模式配置以及在debug状态下工作情况,其值复位后的默认为0x00,即默认每个外设的选择都是允许模式配置为ME_RUN_PC0,而低功耗模式配置为ME_LP_PC0:
不同的part,其片上外设种类及数量不同,需要查看相应的数据手册确定对于的外设控制寄存器号以完成相应外设的配置,如果想要某一外设在相应的目标模式下能够正常工作,就必须保证其选择的外设运行模式配置寄存器ME_RUN_PC0..7和外设低功耗模式配置寄存器ME_LP_PC0..7配置中该模式外设时钟使能。比如:
ME.PCTL4.R=0x01;
/*DSPI0debugmodefrozen,lowpowermodewithME_LP_PC0configurationandrunmodewithME_RUN_PC1configuration*/
以下为MPC5606S的外设控制寄存器:
向模式控制寄存器ME_MCTL中写入要进入的目标模式代码和控制密钥(0x5AF0)及逆密钥(0xA50F)完成目标模式的切换,比如:
ME.MCTL.R=0xA0005AF0;/*requesttoenterSTOP(0xA)modewithcontrolkey(0x5AF0)*/
ME.MCTL.R=0xA000A50F;/*requesttoenterSTOP(0xA)modewithcontrolinvertedkey(0x5AF0)*/
查询全局状态寄存器ME_GS,以确认正确进入目标模式且系统时钟切换完成:
while(ME.GS..B.S_CURRENTMODE!=0x4);/*waitMCUtotransmittoRUN0mode*/
注意:以上语句对于STOP和STANDBY低功耗模式不适用,因为,在STOP和STANDBY模式下,Flash处于掉电模式(power-downmode),不能正常工作,所以不能运行放置在Flash的上述查询代码。
PS:对于某一片上外设资源和时钟模块在模式切换中,是否完成切换,用户可以通过查看调试模式切换状态寄存器DebugModeTransitionStatusRegister(ME_DMTS)相应的外设位来判断:
1.配置寄存器ME_ME使能目标模式;
2.配置模式配置寄存器ME_
3.配置外设运行模式配置寄存器ME_RUN_PC0..7使能相应外设运行外设配置下各种模式下的外设时钟;
4.配置外设低功耗模式配置寄存器ME_RUN_PC0..7使能相应外设低功耗外设控制配置下各种模式下的外设时钟;
5.配置外设控制寄存器ME_PCTL0..143选择相应的外设的运行模式和低功耗模式配置
6.向模式控制寄存器ME_MCTL中写入要进入的目标模式代码和控制密钥(0x5AF0)及逆密钥(0xA50F);
7.查询全局状态寄存器ME_GS,以确认正确进入目标模式且系统时钟切换完成;
从以上介绍可以看到:QorivvaMPC56xx/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模式,使用内部16MHzFIRC作为系统时钟源,PLL关闭,主电源、Flash都正常工作)的配置代码如下:
ME_RUNPC[0].R=0xFE;/*peripheralsactiveinallRUNmodesincludingDRUNmode*/
ME.MCTL.R=0x30005AF0;/*requesttoenterDRUN(0x3)modewithcontrolkey(0x5AF0)*/
ME.MCTL.R=0x3000A50F;/*requesttoenterDRUN(0x3)modewithcontrolinvertedkey(0xA50F)*/
while(ME.GS.B.S_CURRENTMODE!=0x3);/*waitMCUtotransmittoDRUNmode*/
以下为以MPC5606SEVB为例,输出GPIO管脚控制板载LED的代码和工程(基于CodeWarrior10.6.4IDE)。
MPC5606SEVB的4颗板载LED电路连接如下:
上述控制LED的GPIO管脚对应的SIU模块控制寄存器(SIU_PCR)如下:
QorivvaMPC5606S的GPIO输出控制寄存器SIU_GPDO定义如下:
基于以上,新建一个MPC5606S的空工程,在main.c中添加如下简单代码即可完成对4颗板载LED的跑马灯控制: