找回密码
 立即注册
查看: 175|回复: 3

启动多路定时器死机问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-04-18 09:09:37

3

主题

1

回帖

59

积分

注册会员

积分
59
发表于 2024-12-29 11:09:41 | 显示全部楼层 |阅读模式

#include "stc32g.h"   //头文件见下载软件
#include "intrins.h"

typedef  unsigned char u8;
typedef  unsigned int u16;
typedef  unsigned long u32;
#define FOSC        11059200UL
#define BRT         (65536 - FOSC / 19200 / 4)

sfr     AUXR    =   0x8e;
sfr     T2H     =   0xd6;
sfr     T2L     =   0xd7;

sfr     P0M1    =   0x93;
sfr     P0M0    =   0x94;
sfr     P1M1    =   0x91;
sfr     P1M0    =   0x92;
sfr     P2M1    =   0x95;
sfr     P2M0    =   0x96;
sfr     P3M1    =   0xb1;
sfr     P3M0    =   0xb2;
sfr     P4M1    =   0xb3;
sfr     P4M0    =   0xb4;
sfr     P5M1    =   0xc9;
sfr     P5M0    =   0xca;

bit busy;
char wptr;
char rptr;
char buffer[16];

u32  Cout0;
u32  Cout1;
void UartIsr() interrupt 4
{
    if (TI)
    {
        TI = 0;
        busy = 0;
    }
    if (RI)
    {
        RI = 0;
        buffer[wptr++] = SBUF;
        wptr &= 0x0f;
    }
}

void UartInit()
{
    SCON = 0x50;
    T2L = 0x70;
    T2H = 0xFF;
    AUXR = 0x15;  //15
    wptr = 0x00;
    rptr = 0x00;
    busy = 0;
}

void UartSend(char dat)
{
    while (busy);
    busy = 1;
    SBUF = dat;
}

void Delay1000ms(void)        //@11.0592MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 2764798UL;
        while (i) i--;
}

void Timer0_Isr(void) interrupt 1
{
        if(Cout0>0x3E8)
        {
                Cout0=0;
                UartSend(0x02);
        }
        Cout0++;
       
}

void Timer1_Isr(void) interrupt 3
{
        if(Cout1>0x3E8)
        {
                Cout1=0;
                UartSend(0x03);
        }
        Cout1++;
}
void Timer0_Init(void)                //100微秒@11.0592MHz
{
        AUXR |= 0x80;                        //定时器时钟1T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0xAE;                                //设置定时初始值
        TH0 = 0xFB;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}
void Timer1_Init(void)                //1毫秒@11.0592MHz
{
        AUXR |= 0x40;                        //定时器时钟1T模式
        TMOD &= 0x0F;                        //设置定时器模式
        TL1 = 0xCD;                                //设置定时初始值
        TH1 = 0xD4;                                //设置定时初始值
        TF1 = 0;                                //清除TF1标志
        TR1 = 1;                                //定时器1开始计时
        ET1 = 1;                                //使能定时器1中断
}
void UartSendStr(char *p)
{
    while (*p)
    {
        UartSend(*p++);
    }
}
void main()
{
          EAXFR = 1; //使能访问XFR,没有冲突不用关闭
    CKCON = 0x00; //设置外部数据总线速度为最快
    WTST = 0x00;  //设置程序代码等待参数,
    //赋值为0可将CPU执行程序的速度设置为最快
          Cout0=0;
          Cout1=0;
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    UartInit();
    ES = 1;
          
                Timer0_Init();
          Timer1_Init();
       
    EA = 1;
                WDT_CONTR = 0x27; //使能看门狗,溢出时间约为8s
                UartSendStr("Uart Test !\r\n");
    while (1)
    {
                        Delay1000ms();
      UartSend(0x01);
                        WDT_CONTR = 0x34; //清看门狗,否则系统复位
    }
}
,上面代码都是ISP复制过来,运行后每隔5秒触发一次看门狗,请问是哪里问题?

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-12-30 10:00:21 | 显示全部楼层

优先度问题

串口1的优先度低于定时器1

但你在定时器1中断内运行UartSend

UartSend内要判断busy标志位

但Busy标志位需要在串口1中断内清零

于是卡死在while(busy);

我不相信以上代码是直接出自ISP

应该是你魔改了吧

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:122
  • 最近打卡:2025-05-01 08:43:07
已绑定手机

2

主题

106

回帖

262

积分

中级会员

积分
262
发表于 2024-12-31 08:22:44 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:186
  • 最近打卡:2025-03-06 09:49:49

14

主题

133

回帖

1149

积分

金牌会员

积分
1149
发表于 2024-12-31 09:27:46 | 显示全部楼层

发送字符串放在主程序里面,定时器里面放个标识。

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 01:26 , Processed in 0.119315 second(s), 74 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表