问题:定时器计算值和实际值频率差一半。
芯片:MC9S08DZ60
晶振:8MH
问题线束:中断服务函数里我写了让某一个脚取反,示波器是那个引脚在中断里取反出来的波形,根据计算:8Mhz/4*32=64Mhz,总线频率=64/2=32Mhz,,定时器32分频=1MHZ,50000数字计数一次,即50ms一次,也就是说50ms引脚电平反转一次,结果如图所示,100ms才反转一次,希望各位大神帮忙解答一下,不胜感激~~0~~
代码
/********************************************************************************************
** 函数名称: void INIT_MCG(void)
** 功能描述: 初始化总线时钟PEE模式 外部晶振频率为8MHz,总线频率32MHz
** 输 入:
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
*********************************************************************************************/
void INIT_MCG(void)
{
// 上电复位为FEI模式
// 由FEI模式转为FBE模式
MCGC2 = 0x36; // 0x00110110BDIV=00:用所选时钟除以1;RANGE=1: 8 MHz 的频率属于高频范围 ;
// HGO=1: 配置外部振荡器的高增益运行; EREFS=1:选择振荡器 ;ERCLKEN =1:MCGERCLK 使能
while(!MCGSC_OSCINIT); // EREFS 位选择的晶体已经完成初始化
MCGC1 = 0xb8; // 10111000 CLKS=10:将外部参考时钟选择为系统时钟源;RDIV=111:参考时钟除以 128 (=62.5KHZ)
// IREFS=0: 选择外部参考时钟
while(MCGSC_IREFST); // 是 0,表明外部参考是参考时钟的当前源
while(MCGSC_CLKST != 0b10);// MCGSC 中的 CLKST (位 3 和 2)是 %10,表明已经选择外部参考时钟为 MCGOUT 馈电
// 从 FBE 模式转换到 BLPE 模式
MCGC2_LP = 1; // 旁路模式中禁止 FLL ( 或 PLL) ( 低功率 ) (已进入 BLPE 模式)
MCGC1 = 0x90; // 10010000RDIV=010:8/4=2 MHZ PLL 要求的1MHz -- 2 MHz 频率范围内
MCGC3 = 0x48; // 01001000PLLS=1:选择 PLLVDIV=1000: 2 MHz* 32 = 64 MHz
while(!MCGSC_PLLST); // PLLST 置位,表明 PLLS 时钟的当前源是PLL
// 从 BLPE 模式转换到 PBE 模式
MCGC2_LP = 0; // LP (位 3)清除至 0,切换到 PBE 模式
while(!MCGSC_LOCK); // MCGSC 中的 LOCK (位 6)置位,表明 PLL 已经获得锁定
// 从 PBE 模式转换到 PEE 模式
MCGC1 = 0x10; // 00010000CLKS=00,将 PLL 输出选择为系统时钟源
while(MCGSC_CLKST != 0b11);// CLKST (位 3 和 2)是 %11,表明已经选择 PLL 输出,在当前时钟模式中为 MCGOUT 馈电
}
/********************************************************************************************
** 函数名称: void INIT_TPM1ch0(void)
** 功能描述: 初始化TPM1ch0
** 输 入:
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
*********************************************************************************************/
void INIT_TPM1ch0(void)
{
TPM1SC = 0X6D; // 01101101TOF = 0(清除溢出标志位); TOIE = 1(中断允许); CPWMS = 1( 所有通道以中央对齐 PWM 模式运行);
// CLKS = 01(总线速率时钟); PS = 101(分频系数32); 脉冲周期为1us
TPM1CNTH = 0; // 任意时刻对TPM1CNTH或TPM1CNTL的写操作将计数寄存器的计数值复位(清零)
TPM1CNTH = 0;
TPM1MOD = 50000 - 1; // 每50000个脉冲周期计数器溢出一次,溢出周期为50000 * 1us = 50ms
}
void interrupt 11 TPM1_OVERFLOW(void)
{
TPM1SC_TOF = 0;//清除溢出标志位
EPS_LED = ~EPS_LED; //引脚输出取反
} 50ms中断一次没毛病啊。50ms高电平,再50ms低电平,总共100ms一个周期,是正确的啊,楼主还有什么疑惑? Ilove51andAVR 发表于 2018-9-25 18:16
50ms中断一次没毛病啊。50ms高电平,再50ms低电平,总共100ms一个周期,是正确的啊,楼主还有什么疑惑? ...
用示波器测试却是100ms高电平,再100ms低电平,如图,小弟不知这么办了,望大神给指导指导
页:
[1]