合泰单片机之时基中断
时基中断(Time Base Interrupt)是一种基于硬件定时器的周期性中断机制,由特定定时器的溢出信号触发。在合泰单片机中,主要通过TB0和TB1两个定时器模块实现时基中断功能。
具体工作流程如下:
-
定时器溢出触发:
- 当TB0/TB1定时器计数达到预设周期时,会产生溢出信号
- 此时对应的中断请求标志位(TB0F或TB1F)被硬件自动置位
-
中断使能控制:
- 总中断使能位EMI必须为1(使能状态)
- 相应时基中断使能位(TB0E或TB1E)需设为1
- 例如:设置TB0E=1允许TB0定时器中断
-
中断响应过程:
- 满足上述条件时,CPU会暂停当前程序
- 将程序计数器PC值压入堆栈
- 跳转到对应的中断向量地址(如TB0中断向量地址为0x0008)
- 执行中断服务子程序(ISR)
-
中断标志管理:
- 进入ISR后,硬件自动清除TBnF标志
- EMI位被清零,暂时禁止其他中断嵌套
- 典型应用场景:需要周期性执行的任务(如LED闪烁、数据采样等)
-
中断返回:
- ISR执行完毕后通过RETI指令返回
- 恢复EMI位状态
- 从堆栈恢复PC值继续主程序
注意:使用时基中断时需确保堆栈空间足够,避免堆栈溢出导致程序异常。
时基中断的目的时提供一个固定周期的中断信号。其时钟源来自内部时钟源fTB.fTB输入时钟首先经过分频器,分频率由程序设置TBC寄存器相关位获取合适的分频值以提供更长的时基中断周期。不同来源的时钟源fTB依次控制时基中断周期。


首先我们需要设置时基中断,通过上面示意图,我们需要进行以下几步:
- 选择时钟源
- 选择合适的分频器
- 编写中断处理函数
- 开启中断包括EMI、TBnE、TBON;

参考代码如下:
该功能主要实现了通过时基中断设置一个周期为1.024ms的中断,然后通过累加计数方式实现LED灯不断闪烁,周期为1.024s。
#include "HT66F0185.h"#define u8 unsigned char
#define u16 unsigned int#define CLED _pa3void delay_ms(u16 ms)
{while(ms--){GCC_DELAY(2000);//编译器自带延时指定个周期,在主频8Mhz下,一个指令周期为0.5us GCC_CLRWDT();}
}void main()
{_wdtc=0xa8;//关闭看门狗_pac3=0;//设置为输出_cos=1;//设置pa3管脚为IO,而不是比较器输出_tbon = 1; //enable TBC_tbck = 1; //Ftb = Fsys/4_tb02 = 0;_tb01 = 1;_tb00 = 1; //2^11/Ftb 2024/2000000 = 1.024ms_emi = 1;_tb0e = 1;while(1){}
}DEFINE_ISR(tb0,0x1c)
{static u16 ms = 0;if(++ms > 1000){ms = 0;CLED = ~CLED;}
}
