找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1029|回复: 9
打印 上一主题 下一主题
收起左侧

STC8H1K16单片机定时器2不是能够很稳定的进入中断,大概是什么原因导致的?

[复制链接]
跳转到指定楼层
楼主
ID:1072390 发表于 2023-4-18 09:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
int main(void)
{
        uint16 ticker = 0;
        P_SW2 |= 0x80;                    //使能访问 XFR特殊寄存器
        GPIO_Init();
        UART_Init();
        SPI_Init();
        Timer2_Init();
        LCD_Init();
//        WDT_CONTR = 0x24;      //使能看门狗,溢出时间约为1s
        ticker = Timer_count;
        EA = 1;                            //允许中断
        while(1)
        {
//                WDT_CONTR = 0x34;  //清看门狗,否则系统复位
                if(ticker != Timer_count)
                {
                        ticker = Timer_count;
                        Vk1621_Data_Exch();//数据处理
                        Key_Schedule(); //按键处理
                }
        }         
}
void Timer2_Init(void)
{
        AUXR |= 0x04;                        //定时器时钟1T模式 16位自动重载
        T2L = 0xdf;                        //设置定时初始值
        T2H = 0xff;                        //设置定时初始值
        AUXR |= 0x10;                        //定时器2开始计时
//        INT_CLKO |=0x04;        //使能P13定时器输出功能
        IE2 |= 0x04;            //使能定时器中断
}


void TM2_Isr() interrupt 12
{
           count++;//1微秒计数
        if(!(count%1000))      
        {
                Timer_count++;//毫秒计数
                UART_SendChar(Timer_count);//测试数据        
        }
        
}

void SPI_Transivion (void) interrupt SPI_VECTOR
{
        SPSTAT = SPIF + WCOL;        //清0 SPIF和WCOL标志
        if(SPI_RxCnt >= SPI_BUF_LENTH)
        {
                SPI_RxCnt = 0;
        }
        SPI_RxBuffer[SPI_RxCnt] = SPDAT;
        if(SPI_RxBuffer[SPI_RxCnt] == 0x20)
        {
                SPI_RxCnt = 0;
        }
        else
        {
                SPI_RxCnt++;
        }
        SPDAT = Key_Information.KeyData;
        SPI_RxTimerOut = 5;        
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:540903 发表于 2023-4-18 09:43 | 只看该作者
可能原因是定时器2中断处理函数(TM2_Isr)存在太多的代码,以至于中断处理时间过长,导致中断不稳定。在中断处理函数中,每次进入中断都会累加一个计数器(count),并且在计数器达到1000时,会递增一个毫秒计数器(Timer_count)并发送测试数据到串口。这些操作可能会占用大量的处理时间,并造成中断处理时间过长
回复

使用道具 举报

板凳
ID:491577 发表于 2023-4-18 10:11 | 只看该作者
定时器时间太短,中断程序还没有处理完下一个中断又到了,1us中断太短。
回复

使用道具 举报

地板
ID:1065084 发表于 2023-4-18 10:50 | 只看该作者
1.硬件条件没写清楚:主频、外设、软件功能
2.代码不全,关键代码看不到

以下为猜测答案:
猜测定时器定时为1us。假设串口波特率为115200,串口一个字节为86us,由于没有展示串口发送部分代码,如果是查询机制,那定时器实际实际触发时间会略大于86us。如果是中断机制,会因为中断设置的不同等级发生不同的变化,代码都不能正常运行。

所以只要将定时器设置为1ms一次,去掉 if(!(count%1000)) ,代码就可以运行
回复

使用道具 举报

5#
ID:1034262 发表于 2023-4-18 11:07 | 只看该作者
中断间隔33个时钟,太少了,根本忙不过来啊,中断要入栈、跳转,执行用户代码,出栈,返回,33个时钟太少了,还没处理完,又一个中断来了,就乱了。
回复

使用道具 举报

6#
ID:1072390 发表于 2023-4-18 11:50 | 只看该作者
coody_sz 发表于 2023-4-18 11:07
中断间隔33个时钟,太少了,根本忙不过来啊,中断要入栈、跳转,执行用户代码,出栈,返回,33个时钟太少了 ...

主频33.1776M,使用了定时器2定时1us,确实是定时时间太短了,感谢大佬
回复

使用道具 举报

7#
ID:1072390 发表于 2023-4-18 11:51 | 只看该作者
hhh402 发表于 2023-4-18 10:11
定时器时间太短,中断程序还没有处理完下一个中断又到了,1us中断太短。

已经查出问题了,感谢指点
回复

使用道具 举报

8#
ID:1072390 发表于 2023-4-18 11:53 | 只看该作者
yuxuesuixing 发表于 2023-4-18 10:50
1.硬件条件没写清楚:主频、外设、软件功能
2.代码不全,关键代码看不到

主频33.1776M,外设定时器2定时1us,SIP从机模式中断接收和发送,串口115200波特率查询发送的
回复

使用道具 举报

9#
ID:1072390 发表于 2023-4-18 11:54 | 只看该作者
yuxuesuixing 发表于 2023-4-18 10:50
1.硬件条件没写清楚:主频、外设、软件功能
2.代码不全,关键代码看不到

感谢大佬指点
回复

使用道具 举报

10#
ID:57657 发表于 2023-4-18 12:02 | 只看该作者
sbit test= P3^2; //用示波器或逻辑分析仪抓取,提高晶振频率使高电平脉宽小于1微秒即可
void TM2_Isr() interrupt 12
{
test=1;
           count++;//1微秒计数
        if(!(count%1000))      
        {
                Timer_count++;//毫秒计数
                UART_SendChar(Timer_count);//测试数据      
        }
       test=0;
}
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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