飞思卡尔S12系列(基于MC9S12XET256MAA和/MC9S12XEP100)锁存器资料总结和分享

        最近在公司做项目,用到飞思卡尔S12系列芯片,为了让自己养成良好习惯,以后每做一部分,都会总结出来,方便自己和他人。

        今天讲讲飞思卡尔锁存器部分。

        CRG时钟合成寄存器(SYNR

 

读:任何时刻;写:除CLKSEL 寄存器中的PLLSEL=1时的任何时刻。

        VCOFRQ1VCOFRQ0: 这2位用于确定压控振荡器VCO的增益以获得频率最佳稳定性并锁定。为了IPLL正常工作,必须根据表2-7中的实际VCO时钟频率配置这2位值。

PLL时钟频率以及由PLL产生的MCU总线时钟频率由下列公式计算:

式中,SYNDIV的值由SYNR寄存器中的BIT5BIT0确定,REFDIV值由REFDV寄存器中的BIT5BIT0确定,POSTDIV值由POSTDIV寄存器中的BIT4BIT0确定。

2.6.2  CRG时钟参考分频寄存器(REFDV

读:任何时刻;写:除CLKSEL 寄存器中的PLLSEL=1时的任何时刻。

REFFRQ1REFFRQ0:这2位用于配置PLL内部滤波器以获得频率最佳稳定性并锁定。为了IPLL正常工作,必须根据表2-8中的实际REF时钟频率设置这2位值。

REFDV5REFDV0:这6位用于确定前述公式中的REFDV值。

2.6.3  CRG时钟后分频寄存器(POSTDIV

读:任何时刻;写:除CLKSEL寄存器中的PLLSEL=1时的任何时刻。

        如果POSTDIV=0x00,则fPLL= fVCO。如果POSTDIV≠0,则PLLCLK频率fPLLVCOCLK频率fVCO之间关系由下列公式计算:

                                fPLL = fVCO/(2×POSTDIV)

        POSTDIV4POSTDIV0:这5位用于确定公式中的POSTDIV值。

2.6.4  CRG标志寄存器(CRGFLG

        读:任何时刻;写:参考每位各自的写条件。       

        RTIF:实时中断标志位。在实时时钟周期最后,置位RTIF。该位通过写1清除,写0无效。如果CRGINT寄存器中的实时中断使能(RTIE=1),则RTIF置位将产生中断请求。

        •  0表示未发生RTI超时;

        •  1表示已发生RTI超时。

PORF:上电复位标志位。当上电复位发生时, 置位PORF。该位通过写1清除,写0无效。

        •  0表示上电复位未发生;

        •  1表示上电复位已发生。

 

2.6.5  CRG时钟选择寄存器(CLKSEL

读:任何时刻;写:参考每位各自的写条件。

        以下仅介绍和PLL相关位,其他位请读者参考MC9S12XS128数据手册。

        PLLSELPLL选择位。任何时刻可写。当LOCK=0时,该位写1无效,这能够防止选择不稳定的PLLCLK作为系统时钟。当MCU进入自时钟模式、停止模式或者PLLWAI置位且进入等待模式时,则PLLSEL位清除。

        •  0表示系统时钟由OSCCLK分频(fBUS = fOSC/2);

        •  1表示系统时钟由PLLCLK分频(fBUS = fPLL/2)。

        PLLWAI:等待模式下PLL停止控制位。任何时刻可写。如果PLLWAI置位,进入等待模式前,CRG将清除PLLSEL位;在等待模式期间,PLLON位保持置位,但IPLL模块断电。退出等待模式,如果使用PLL时钟,需要软件置位PLLSEL

        •  0表示等待模式下IPLL继续工作;

        •  1表示等待模式下IPLL停止工作。

2.6.6  CRG IPLL控制寄存器(PLLCTL

读:任何时刻;写:参考每位各自的写条件。

        以下仅介绍和PLL相关位,其他位请读者参考MC9S12XS128数据手册。

        CME:时钟监控使能位。除SCM=1时的任何时刻可写。

         •  0表示禁止时钟监控功能;

         •  1表示允许时钟监控功能。时钟变慢或停止将引起时钟监控复位或自时钟模式。

        PLLON:锁相环启动位。除PLLSEL=1时的任何时刻可写。PLLON置位启动IPLL电路。自时钟模式下,启动IPLL,读取PLLON位为最近一次写入值。

         •  0表示关闭IPLL

         •  1表示启动IPLL

        FM1FM0IPLL频率调制使能位。除PLLSEL=1时的任何时刻可写。这2位允许选择VCOCLK的附加频率调制模块以降低VCO噪声。调制频率是fREF除以16。表2-9列出频率调制幅值选择。

SCME:自时钟模式使能位。正常模式下可以写一次,特殊模式下任何时刻可写。当工作在自时钟模式下(SCM=1)时,SCME不能被清除。

         •  0表示检测到晶振时钟失效 ,引起时钟监控复位;

         •  1表示检测到晶振时钟失效,MCU进入自时钟模式。

2.6.7  CRG中断使能寄存器(CRGINT

        读:任何时刻;写:任何时刻。

        RTIE:实时中断(RTI)使能位。该位使能允许RTIF产生中断请求。

         •  0表示禁止RTI中断请求;

         •  1表示允许RTIF中断请求。

        LOCKIE:锁定中断(LOCKI)使能位。该位使能允许LOCKIF产生中断请求。

         •  0表示禁止LOCKI中断请求;

         •  1表示允许LOCKIF中断请求。

        SCMIE:自时钟模式中断(SCMI)使能位。该位使能允许SCMIF产生中断请求。

         •  0表示禁止SCMI中断请求;

         •  1表示允许SCMIF中断请求。

 

在程序中配置锁相环的步骤如下:
1、禁止总中断;
2、寄存器CLKSEL的第七位置0,即CLKSEL_PLLSEL=0。选择时钟源为外部晶振OSCCLK,在PLL程序执行前,内部总线频率为OSCCLK/2.
   CLKSEL_PLLSEL=0时,系统时钟由外部晶振直接提供,系统内部总线频率=OSCCLK/2(OSCCLK为外部晶振频率)。
   CLKSEL_PLLSEL=1时,系统时钟由锁相环提供,此时系统内部总线频率=PLLCLK/2 (PLLCLK为锁相环倍频后的频率)。                
3、禁止锁相环PLL,即PLLCTL_PLLON=0。当PLLCTL_PLLON=0时,关闭PLL电路。当PLLCTL_PLLON=1时,打开PLL电路。                 
4、根据想要的时钟频率设置SYNR和REFDV两个寄存器。SYNR和REFDV两个寄存器专用于锁相环时钟PLLCLK的频率计算
   计算公式是: PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)  
   其中,PLLCLK为PLL模块输出的时钟频率;OSCCLK为晶振频率;SYNR、REFDV分别为寄存器SYNR、REFDV中的值。
   这两个寄存器只有在PLLSEL=0时才能够写入(这里就是第二步的设置原因所在了)。 
5、打开PLL,即PLLCTL_PLLON=1。                 
6、CRGFLG_LOCK位,确定PLL是否稳定。
   当锁相环PLL电路输出的频率达到目标频率的足够小的误差范围内时,LOCK位置1,此时说明PLLCLK已经稳定,可以作为系统的时钟了。该位在正常情况下为只读位。
7、PLLCLK稳定后,允许锁相环时钟源PLLCLK为系统提供时钟,即CLKSEL_PLLSEL=1。

/*
********************************************************************************
* File:    mcu.c
* By  :    Clark
* Version:   V1.0  
* Date:     2018.10.17
* History: 2018.10.17  V1.0      1.the base version         初始版本  
********************************************************************************
* 软件版本: CodeWarrior IDE version 5.9.0
* 芯片: MC9S12XET256Maa
* 晶振:  8MHZ
* 锁相环时钟: 16MHZ
* 总线时钟:8.000MHz
* 备注: fbus是总线频率,fpll是锁相环频率,fvco是压控振荡器频率,fosc是晶振频率
                 if(PLLSEL==0) fbus=fosc/2;
                 if(PLLSEL==1) fbus=fpll/2;    
                 fpll=fosc* (SYNDIV+1)/(POSTDIV*(REFDIV+1));
                 fpll=fvco/(2*POSTDIV);
                 fvco=2*fosc* (SYNDIV+1)/(REFDIV+1);
                 若POSTDIV=0,fpll=fvco,若POSTDIV!=0, fpll=fvco/(2*POSTDIV);
                 从板晶振为8M,即fosc=8M,设置总线时钟频率fbus=8M, fpll=16M,fvco=32M,fref=8M
********************************************************************************
*/

#include "derivative.h" /*包括外围声明 */
#include "mcu.h"  //包含除锁相环之外的其他函数声明等,与本函数无关

/*
********************************************************************************
*                                                        MCU_BusClock_Init
* 输入:无
* 输出:无
* 时钟源:外部晶振8MHz
* 备注: fbus是总线频率,fpll是锁相环频率,fvco是压控振荡器频率,fosc是晶振频率
                 if(PLLSEL==0) fbus=fosc/2;
                 if(PLLSEL==1) fbus=fpll/2;    
                 fpll=fosc* (SYNDIV+1)/(POSTDIV*(REFDIV+1));
                 fpll=fvco/(2*POSTDIV);
                 fvco=2*fosc* (SYNDIV+1)/(REFDIV+1);
                 若POSTDIV=0,fpll=fvco,若POSTDIV!=0, fpll=fvco/(2*POSTDIV);
                 从板晶振为8M,即fosc=8M,设置总线时钟频率fbus=8M, fpll=16M,fvco=32M,fref=8M
********************************************************************************
*/
void MCU_BusClock_Init(void) 
{  

      CLKSEL=0x00;          //关锁相环
      PLLCTL_PLLON=1;       //开启锁相环

      // 配置#1 fosc:8MHz  fref:8MHz  fvco:32MHz fpll:16MHz fbus = 8MHz;
      SYNR = 0x01;         //SYNDIV=1
      REFDV = 0x80;         //fref=8MHZ,REFDIV=0,
      POSTDIV = 0x01;        //POSTDIV=1;
      
      // 间隔两个时钟周期,等待PLL稳定
      _asm(nop);       //空指令,等待PLL稳定
      _asm(nop);
      // 开启PLL
      while( CRGFLG_LOCK ==0 ) ;   	// 等待锁相环稳定
        CLKSEL_PLLSEL=1;        //PLL启用

}

 

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: mc9s12g128芯片是一种高端的32位微控制,具有高度的可靠性和稳定性,在汽车电子领域广泛应用。UDS即Unified Diagnostics Services(统一诊断服务),是针对汽车电子控制单元(ECU)的一种标准化的诊断协议。针对mc9s12g128芯片的UDS诊断代码,需要实现以下功能: 1. 支持与汽车诊断仪的通信。要求实现UDS协议的CAN总线通信,支持UDS协议的各种命令。 2. 支持读取ECU的各种信息。要求能够读取诊断仪请求的ECU信息,包括诊断编码、ECU序列号、厂商信息、故障码等。 3. 支持与ECU进行诊断。要求实现UDS协议的各种诊断功能,包括清除故障码、读取故障码、读取数据流等。 4. 具有高度的可靠性和稳定性。由于UDS诊断是涉及到汽车的安全问题,因此诊断代码需要具有高度的可靠性和稳定性,确保诊断过程能够真正帮助解决问题,而不是造成新的问题。 针对这些功能需求,需要编写相应的UDS诊断代码,并在硬件平台上进行测试和验证,确保代码满足要求。同时,为了提高诊断效率和准确性,可以对诊断代码进行优化,采用一些高级算法或者技术,提高代码的响应速度和诊断准确性。 ### 回答2: 基于mc9s12g128芯片的uds诊断代码主要用于汽车电子控制系统的诊断和维护。UDS诊断协议是汽车行业内通用的诊断协议,用于识别和解决汽车电子控制系统中的故障。 这个基于mc9s12g128芯片的UDS诊断代码可以用来进行汽车电子控制系统的各种诊断操作。它可以监测并收集电子控制单元(ECU)的运行信息,比如故障码、传感数据等,并发送控制命令以调整系统的运行状态。同时,它还可以进行ECU的编程和校准,对系统进行设置和参数调整。 由于汽车电子控制系统的复杂性,UDS诊断代码需要包含许多不同的功能。这些功能包括:故障诊断和排查、诊断数据采集和记录、测试功能以及EOL测试。此外,UDS诊断代码还需要支持多种通信协议,例如CAN、KWP、LIN等。 总之,基于mc9s12g128芯片的UDS诊断代码是一种必要的工具,可以帮助汽车行业的技术人员更好地排查和解决汽车电子控制系统中的故障。其有效性和可靠性对于确保汽车安全和稳定性至关重要。 ### 回答3: mc9s12g128芯片是一款用于汽车电子控制单元(ECU)的控制芯片。基于这款芯片,可以实现车辆诊断的通信协议标准——UDS诊断。 UDS诊断作为一种能够对ECU进行通讯、诊断和编程的标准通讯协议,需要实现在控制单元中的UDS服务,才能实现诊断功能。 具体的实现方式,可以分为三个步骤: 第一步,需要建立与诊断仪之间的通信连接,使用主机地址向件发送一个初始化请求,然后等待件的响应。 第二步,建立通信连接后,将发送UDS服务请求,包括功能码、数据和校验和等。该请求将转发到控制单元中,并等待件的响应。 第三步,控制单元根据UDS服务请求的不同,执行不同的操作。完成后,控制单元将发送响应消息,告诉诊断仪执行结果,完成一次UDS诊断操作。 上述过程中,需要在控制单元中实现相关UDS服务,包括SEED&KEY安全访问控制、数据Dump、清除故障码、读取码流等。 总之,基于mc9s12g128芯片的UDS诊断代码,可以实现从诊断仪向控制单元发送服务请求和接收服务数据的功能,从而实现诊断操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值