关于CH552定时器0 定时问题

我想用CH552定时器0,配置成8位自动重装载模式,100us产生一次中断,然后1s切换LED状态,但是设置完LED是4s才切换状态,不知道是哪里配置错了呢?


代码:

sbit LED = P3^4;

void main(void)
{
  //设置时钟
  SAFE_MOD = 0x55; //进入安全模式
  SAFE_MOD = 0xAA;
  
  CLOCK_CFG &= ~bOSC_EN_XT;  //关闭外部晶振
  CLOCK_CFG |= bOSC_EN_INT;  //使能内部晶振
  CLOCK_CFG = CLOCK_CFG & (~MASK_SYS_CK_SEL) | 0x06; //24M
  
  SAFE_MOD = 0x00;//退出安全模式
  
  //LED配置
  //LED -- P3.4 -- 推挽输出
  P3 &= ~(1 << 0x04); 
  P3_DIR_PU |= (1 << 0x04);
  P3 |= (1 << 0x04);//关闭LED
  
  //定时器0初始化
  T2MOD &= ~bT1_CLK; //系统时钟12分频
  TMOD = TMOD & 0xF0 | bT0_M1;  //模式2
  TL0 = 0x38;  //赋初值 100us
  TH0 = 0x38;
  ET0 = 1;
  TR0 = 1;

  EA = 1;
  while(1);
}  

//定时器中断
void Time0Interrupt(void) interrupt INT_NO_TMR0 using 1
{
  static uint16_t  cnt = 0;

  cnt++;
  if(cnt >= 10000)
  {
    cnt = 0;
    LED ^= 1;
  }
}

之后我用串口线接到LED引脚,引脚每次从高电平到低电平跳变时,串口会收到0x00

前后收到0x00的时间基本都是8s,也就是LED闪烁的时间间隔为4s,TH0和TL0的初值手算和工具算出来都是这个值。

微信截图_20210315133149.png


刚用这款单片机,定时器是按照手册和CH554例程来设置的


主频24m,定时器时钟12分频即2m,那么一个指令执行时间即1/2m,也就是0.5us。如果要设置100us的定时时间需要设置初值为200。


定时器不是往上加到全为1变成0就是溢出吗,所以计数200次,200*0.5 = 100,所以初值应该是256 - 200=56吧


已解决   T2MOD &= ~bT1_CLK; //系统时钟12分频

这个配置成定时器1去了,然后修改时钟后加了延时等待稳定



只有登录才能回复,可以选择微信账号登录