新闻  |   论坛  |   博客  |   在线研讨会
S08和S16的时钟详细探讨(一) (ZT)
moran | 2008-07-31 16:37:53    阅读:3036   发布文章

S08单片机的时钟较S16复杂.

主要有两点:

1、  时钟初始化寄存器相当多
2、  时钟太多,容易混淆
3、  用内部时钟有0。2%-----的误差,需要校正
4、  当用到某一模块时,参考时钟需要选择
5、  工作模式较多,如ICS就有7种
如QG的ICS,AW的ICG 、DZ的MCG等等,工作模式较多,不过一般只用两三种,看程序的需要了,模式的切换设置也有规定,在这里不是重点。具体的可以去看文档。
这里个人提一下,QG8的内部时钟规范初始化,是需要校正的,通过P&E编程器(而不能用BDM)自动完成,它的过程是P&E返回一个校正值给(FFAF)寄存器,在MCU上电之后需要在程序里把(FFAF)寄存器值赋给ICSTRM.而BDM的话需要自己给定一个值,不断地调试.
注意: 在FEI , FBI , FBILP 模式下TRIM的值会影响ICSOUT的频率值,并且是一次写入终生有效. TRIM值越大,结果频率就越小.提醒一下,在默认情况下,QG8是ICS的FEI模式,即IREFS=1; CLKS=0;所以不用外部晶振的话,最好要调节ICSTRM的值.至于怎么调,可以用示波器,也可以用BDM仿真看COMMAND窗口的频率值.但建议用前一种.
 
举个例子:设定准确的8M,用P&E编程器!若用BDM则ICSTRM的值要试!
Volatile  byte  NVICSTRM @0x0000FFAF;
void init_ICS(void)
byte i;
  if (NVICSTRM != 0xFF)
{
ICSTRM = NVICSTRM;                          
}
 ICSC1 = 0X04;
  for (i=5;i>0;i--)
    {
    SRS = 1;
        if (SPMSC1_LVDF == 1)
      {
         SPMSC1_LVDACK = 1;    // clear LVDF
      }
    }
   
  ICSC2 = 0X00;                                                                       //set busclk 8M         
  while (ICSC1_CLKS != ICSSC_CLKST) {}  // wait for clk state to match clk select
}
 
 
以下,是从阿南的博客上转过来的,原文地址: http://www.myhcs08.com/blog/info/article_detail.aspx?id=125
非常具体的讲了ICS时钟的常规配置及分析方法.建议在看之前先看一下两个图.即DS上的1-2和10-2.  POW(N,M)=N^M
 
首先应先理解什么是ICS模块(“Internal Clock Source Module-AN3041-Chinese.pdf”有详细介绍),再参考Datasheet的第10章(内部时钟源),最后再分析Datasheet中的具体外设。参考Datasheet的图1-2,由该图可知,系统(CPU)时钟由ICSOUT提供,外围设备是由总线时钟(BUSCLK=ICSOUT/2)提供,另外TPM、MTIM还可以由固定频率时钟(XCLK=ICSFFCLK/2)和外部的TCLK提供。参考Datasheet的图10-2,由该图可知,ICSFFCLK由内部时钟或外部时钟(由IREFS选择)经分频(由RDIV确定)得到(即RDIV_CLK),同时作为FLL参考时钟。FLL的输出DCOOUT、内部时钟和外部时钟三者之一(由CLKS选择)分频(由BDIV确定)作为ICS模块的输出ICSOUT。
一.各时钟频率计算
1. XCLK
1> 当ICSC1寄存器的IREFS位为“0”,选择外部参考时钟时,XCLK频率:
. fxclk = ficsffclk÷2 = (feclk÷pow(2,n))÷2
n为ICSC1寄存器的RDIV值,feclk为外部参考时钟的频率
2> 当ICSC1寄存器的IREFS位为“1”,选择内部参考时钟时,XCLK频率:
fxclk = ficsffclk÷2 = (ficlk÷pow(2,n)) ÷2
n为ICSC1寄存器的RDIV值,ficlk为内部参考时钟的频率,QG8里是32K.
 
2. ICSOUT
1> 当ICSC1寄存器的CLKS为“00”,选择FLL输出为时钟源时,ICSOUT频率:
ficsout = ficsffclk×512÷pow(2,m)
m为ICSC2寄存器的BDIV值,ficsffclk参考上式子
2> 当ICSC1寄存器的CLKS为“01”,选择内部时钟为时钟源时,ICSOUT频率:
. ficsout = ficlk÷pow(2,m)
3> 当ICSC1寄存器的CLKS为“10”,选择外部时钟为时钟源时,ICSOUT频率:
. ficsout = feclk÷pow(2,m)           
3. BUSCLK
. fbusclk = ficsout÷2
 
上述公式根据ICSC1寄存器中的IREFS和CLKS的不同值,由内部时钟或外部分时钟源计算得到“系统时钟分配图”中的XCLK(固定频率时钟)、ICSOUT(CPU时钟)、BUSCLK(总线时钟)三种外设所需的时钟。下面以具体的外设为例,计算并测试验证其正确性。
二.PWM输出波形的周期测试
参考Datasheet的图1-2,由该图可知,TPMSC寄存器的CLKS[B:A]选择时钟源,再由PS[2:0]值确定分频输出作为16位计数器的基准时钟。此时,分频后的时钟频率等于计数器的计数频率。以边沿排列PWM模式为例(参考datasheet的16.4.2.3),当计数器递增至模寄存器(TPMMODH:TPMMODL)设定值时,PWM的一周期结束,所以PWM输出频率应等于计数器的基准时钟再分频(由模寄存器值确定)后的频率。
1> 当TPMSC寄存器的CLKS[B:A]为“10”,选择XCLK为时钟源时,PWM频率:
 fpwm = fxclk÷2x÷(TPMMODH:TPMMODL+1)
x为TPMSC寄存器的PS[2:0]值
2> 当TPMSC寄存器的CLKS[B:A]为“10”,选择XCLK为时钟源时,PWM频率:
 fpwm = fbusclk÷2x÷(TPMMODH:TPMMODL+1)
 
实验一:
时钟部分,IREFS为“0”选择外部32.768kHz晶体,RDIV值为“00”;
TPM部分,CLKS[B:A]为“10”选择XCLK时钟,且PS[2:0]为“010”四分频,则:
. fpwm = fxclk÷2x÷(TPMMODH:TPMMODL+1)
. =[(feclk÷pow(2,n))÷2]÷2x÷(TPMMODH:TPMMODL+1)
.. =[(32768÷20)÷2]÷22÷(TPMMODH:TPMMODL+1)
. =4096÷(TPMMODH:TPMMODL+1)
 当(TPMMODH:TPMMODL)=99时,fpwm =40.96Hz
. 当(TPMMODH:TPMMODL)=4095时,fpwm =1Hz
 
源代码:
void main(void){
ICSC1 = 0x00; //外部时钟,1分频=32.768kHz
ICSC2 = 0x04; //使能外部参考时钟
TPMSC = 0x12; //固定时钟XCLK, 4分频
TPMMOD = 99;
TPMC0V = 50; //初始化设置PWM占空比50%
TPMC0SC=0x28; //边沿排列PWM模式,高为真脉冲
while (1){
__RESET_WATCHDOG(); /* feeds the dog */
TPMC0V = 50;
}
}
下载运行,用示波器测试TPMCH0的输出波频率为40.98Hz;将上述程序的TPMMOD、TPMC0V分别修改为4096和2048测试结果为0.9901Hz;分别设成9和5时结果为406.5Hz;将XCLK输出后4分频修改为1分频(TPMSC = 0x10;),测试结果基本为上述值的4倍。此时将ICSC1更改为“0x07”(选择内部参考时钟)时,所测结果有一点点偏差,那是由于内部参考时钟误差引起。可用示波器测量外部晶振管脚是否有32.768kHz波形,来判断外部时钟是否工作。
 
实验二:
 
时钟部分,IREFS为“1”选择内部32.768kHz晶体,RDIV值为“00”, CLKS为“00”,选择FLL输出为系统时钟源,BDIV值为“01”
TPM部分,CLKS[B:A]为“01”选择BUSCLK时钟,且PS[2:0]为“010”四分频,则:
. fpwm = fbusclk÷2x÷(TPMMOD+1)
.. = (ficsout÷2)÷2x÷(TPMMOD+1)
. . = ((ficsffclk×512÷pow(2,m))÷2)÷2x÷(TPMMOD+1)
... = ((((ficlk÷pow(2,n)))×512÷pow(2,m))÷2)÷2x÷(TPMMOD+1)
. = ((((32768÷20))×512÷21)÷2)÷22÷(TPMMOD+1)
=1048576÷(TPMMOD +1)
 系统时钟频率:ficsout=8 388 608Hz
 当(TPMMOD)=999时,fpwm =1048.576Hz
. 当(TPMMOD)=0xffff时,fpwm =16Hz
源代码:
 
void main(void){
ICSC1 = 0x07; //外部时钟,1分频=32.768kHz
ICSC2 = 0x44; //使能外部参考时钟
TPMSC = 0x0a; //固定时钟XCLK, 4分频
TPMMOD = 999;
TPMC0V = 500; //初始化设置PWM占空比50%
TPMC0SC=0x28; //边沿排列PWM模式,高为真脉冲
while (1){
 
__RESET_WATCHDOG(); /* feeds the dog */
 
TPMC0V = 500;
 
}
 
}
 
上述程序TPMCH0输出频率测量结果为1039Hz,TPMMOD、TPMC0V分别修改为0xffff和0x8000测试结果为15.82Hz。
 
三.总结
 
1.在Debug环境下,“HCS08 Open Source BDM->Show Status”打开Open Source BDM Status Dialog的System Clock项可查看到目标板实际的系统时钟频率值
 
2.可通过测量外部晶振是否起振,来确定外部参考时钟是否在工作。
 
3.当用BDM连接进入调试状态时,会擦除Flash的内容,包括出厂的内部时钟校准值,所以在程序初始化时不能读0xFFAE、0xFFAF内容(此时为0x1ff,会使频率处于最小值,误差严重)来初始化ICSSC和ICSTRM寄存器,以达到校准的目的!另外,当上电复位时ICSTRM将被重置为0x80,FTRIM位被清零!该值为一折衷值,将近32.768kHz,但也不是最准确值,要想更准确可参考AN2496应用文档进行校准

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客