前言
无需多言 直接开始定时器中断 的学习
通过上次的PWM学习,上次用的是周期型TM定时器模块
这次使用标准型TM定时器模块(STM)
代码
#include <HT66F2390.h>
void Timer0_Init(void){
_stm0c0 = 0b00001000;
_stm0c1 = 0b11000001;
_stm0al = 0xD0;
_stm0ah = 0x07;
_stm0ae = 1;
_mf0e = 1;
_emi = 1;
}
void LED2_Init(void){
_phc0 = 0;
_ph0 = 1;
}
void main(){
_wdtc=0b10101111;
LED2_Init();
Timer0_Init();
while(1){
}
}
unsigned int count=0;
DEFINE_ISR(abc,0x14)
{
if(_stm0af == 1)
{
_stm0af = 0;
if(++count > 1000){
count = 0;
_ph0 = ~_ph0;
}
}
}
代码讲解
主要的还是
STMnC0 和 STMnC1寄存器
我们需要配置定时器和定时器中断主要就是配置这两个寄存器
根据自己的需求配置为_stm0c0 = 0b00001000;
2MHz,开启计数器
这里因为要配置为定时器模式,并且注意一个点
如上图所示:比较器P是8位的,比较器A是16位的
根据自己的需求来配置,我选择的是16位的,比较器A
再由上图可以知道,比较器里面的数值和计数器相等时,会产生中断 ,那这个比较器的值我们也可以通过手册知道如何配置
,因为我们的时钟是2MHz,一次计数是0.5us,然后我们的计数器也是从0开始计数的,所以我们如果要配置1ms就要2000次计数,所以我们配置为
_stm0al = 0xD0;
_stm0ah = 0x07;
这样子我们就配置好了定时器,接下来就是打开中断
我们需要看着这个图来配置这些中断选项
这个我们可以知道有些是需要我们自己清除中断标志位的
所以最后我们可以配置中断函数为:
下面的名字“abc”是自定义的
后面的地址需要看图配置
DEFINE_ISR(abc,0x14)
{
if(_stm0af == 1)
{
_stm0af = 0;
if(++count > 1000){
count = 0;
}
}
}
结果演示
合泰单片机板子上的LED2每隔1S闪烁