、
合泰单片机时基中断和计时器中断
在工作中使用到了合泰单片机,以HT67F5660为例子
一、时基中断以及初始化
时基中断初始化
void time_base_init()
{
_tbc=0b10110010;
_tb1e=1;//时基1的中断控制位,根據中斷結構看到的
_emi=1;
}
这里有2个timebase–timebase0和timebase1,选择fsub(低频时钟)作为timebase的时钟源ftb (我的fsub=32.768khz)
timebase1的产生一次中断周期是2^15/ftb (1)秒
timebase0的产生一次中断周期是2^10/ftb (1024/32768)秒
_tb1e=1;
_emi=1;
//上面两个bit是用来控制时基中断的中的标志位,可以去datasheet里查询,简单一点就到下面的中断结构图中去查找
写时基中断函数
void __attribute((interrupt(0x18))) isr_time_base1(void)//這裡要參考“中斷結構”---時基1中斷的地址是0x18
{
_tb1f=0; //进入中断函数后,这个请求位要置0
if(off_tmr!=0)
{
off_tmr--;
if(off_tmr==0)
{
sleep_flag=1;//这个功能是在别的地方给off_tmr赋值,如果off_tmr不为=0,就开始倒计时,倒计时到0的时候,sleep_flag置1
}
}
}
到这里不算完,因为合泰单片机自动初始化了看门狗,一定要注意看门狗的喂狗时间,会不会影响到time_base中断。这里给出喂狗函数GCC_CLRWDT();
二、计时器中断及初始化
计时器中断初始化
同样的道理,根据datasheet给寄存器赋值
详情参考他的博文 讲的非常好
引用文本
https://blog.csdn.net/weixin_44783974/article/details/89278887
void time_init()
{ //我这里的系统频率是4.9152MHz,我要求10ms进入一次计时器中断
_stm3c0=0b00110000; //频率Fh/64= 4.9152Mhz/64=76KHZ=13us即计数器加一次就要13us
_stm3c1=0b11000001;
//从0加到10ms 需要进入769次(近似)
_stm3al=769%256; //这里要除以256(规定) =1 ccra比较器的低8位
_stm3ah=769/256; //这里要除以256(规定就要除256)=3 ccra比较器的高2位
//高2位和低8位合起来就是0b11 00000001
_t3on=1;
//计数器加1次要13us 加769次就是10ms 进入中断
_emi=1;
_t3ae=1;//標準計時器3的中断控制位,根據中斷結構看到的
_mf3e=1;//多功能中斷控制位,根據中斷結構看到的
}
当然中断结构图也是要参考的
写计时器中断
void __attribute((interrupt(0x24))) isr_time0(void)
{ //10MS
_t3af=0; //进入中断函数后,这个请求位要置0
key_loop++;
if(key_loop>9)
{
key_loop=0;
key_scan_flag=1;
}
//-------------------------------
}