pingfr 发表于 2023-6-1 22:39:38

Timer0中断异常

芯片是STC32G12K, 用STC-LINK仿真,Timer0初始化程序如下,如果TMOD设置为不可屏蔽中断,则ISR中断正常运行,如果是设置为普通的自动重装计时器,运行时进入中断几次后就再也不进了,这是怎么回事呢?


      #define Timer0_Reload (65536UL - (MAIN_Fosc / 1000)) // Timer 0 中断频率, 1000次/秒


       // MODE3, Timer0 set as 16 bits timer auto-reload
        //TMOD = 0x00;       


        //工作模式, 0: 16 位自动重装, 1: 16 位定时/计数, 2: 8 位自动重装, 3: 16 位自动重装, 不可屏蔽中断
        TMOD = 0x03;


        AUXR |= 0x80;                               // Timer0 set as 1T
        TH0 = (u8)(Timer0_Reload / 256);
        TL0 = (u8)(Timer0_Reload % 256);
        ET0 = 1; // Timer0 ISR enable

        TR0 = 1; // Tiner0 run
        EA = 1;       // 打开总中断

void Timer0_ISR(void) interrupt TMR0_VECTOR
{
        B_1ms = 1; // 1ms 标志
}



我这个现象和这个帖子的有点类似,https://www.stcaimcu.com/forum.php?mod=viewthread&tid=2497&extra=page%3D1

乘风飞扬 发表于 2023-6-3 11:08:12

烧录STC32G实验箱例程包,或者屠龙刀例程包里面的例子“Timer0-Timer1-Timer2-Timer3-Timer4测试程序”到芯片里测试一下,这个例子默认使用16位自动重装模式,通过测量中断函数里翻转的IO口信号就知道中断是否正常触发。
实在不行的话将你最简化的,可以复现问题的项目发出来,我们才好帮你分析。
尽量删除无关代码,以免增加分析时间。

pingfr 发表于 2023-6-3 11:32:57

本帖最后由 pingfr 于 2023-6-4 00:09 编辑

乘风飞扬 发表于 2023-6-3 11:08
烧录STC32G实验箱例程包,或者屠龙刀例程包里面的例子“Timer0-Timer1-Timer2-Timer3-Timer4测试程序”到芯 ...
烧录例程可以正常工作,程序用了uart1_dma,不知道为啥“63-DMA-UART串口与存储器数据自动收发”中uart1_dma例程的中断号都是USER_VECTOR,用该中断号串口DMA工作正常,Time0中断工作不正常,把uart1_dma收发的中断号分别改成DMA_UR1T_VECTOR和DMA_UR1R_VECTOR以后Time0中断恢复正常,串口DMA中断工作也正常,没搞明白例程为啥使用USER_VECTOR作为串口DMA的中断号

32G12K128 发表于 2023-6-5 10:19:02

解决就好{:4_250:}

hsrzq 发表于 2023-6-10 23:48:29

pingfr 发表于 2023-6-3 11:32
烧录例程可以正常工作,程序用了uart1_dma,不知道为啥“63-DMA-UART串口与存储器数据自动收发”中uart1_d ...

因为keil默认不支持大于31的中断号,而stc的中断又这么多,只好在C代码中用USER_VECTOR,然后在汇编中把真正的中断ljmp过去
页: [1]
查看完整版本: Timer0中断异常