我不清楚这个定时器的时钟源是哪里来的,计数方向是向上还是向下计数,自己这里有两个代码,得出了不同的结论.....
代码1:
////////////////////////////////////////////////////////////////////////////////////////////////
#include "IOSTM8S105K4.h"
unsigned char i=0;
void Init_Timer4(void)
{
TIM4_CR1=0x01;//使能计数器
//TIM4_IER=0x00;
TIM4_IER=0x01;//更新中断使能
TIM4_EGR=0x01;
TIM4_CNTR=255;//计数器值
TIM4_ARR=255;//自动重装的值
TIM4_PSCR=0x07;//分频值
}
void Init_GPIO(void)
{
PE_DDR|=0x20;
PE_CR1|=0x20;
PE_CR2|=0x00;
}
/*
中断
声明一个中断向量,说明如下:
#pragma vector=0x02
__interrupt void interrupt_handler(void)
{
}
说明:
#pragma vector:
是IAR中断向量指令
=0x02 :
其数字代表中断向量编号。STM8的地址是从0x00800开始,IAR的中断编号从0开始。中断向量号依次按照中断地址递增。如:
复位向量是0x008000,中断向量号是0x00
TRAP的中断地址是0x008004中断向量号是0x01
SPI中断号是0x0C;详细见下表
__interrupt void interrupt_handler
(void):
是声明一个中断函数,注意interrupt是两个下划线,interrupt_handler是中断函数名字,可自己定义
*/
#pragma vector=TIM4_OVR_UIF_vector//0x19
__interrupt void TIM4_OVR_UIF_IRQHandler(void)//对应IAP的中断地址:0x8060
{
//asm("JP 0x9060\n");
i++;
TIM4_SR=0x00;
if(i==61)
{
 E_ODR^=0x20;
i=0;
}
//return;
}
int main( void )
{
Init_GPIO();
Init_Timer4();
asm("rim");//开全局中断
while(1);
//return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////
代码1的延时是1S
代码2:
//////////////////////////////////////////////////////////////////////////////////////////////
void Timer4_Init() //8位基本定时器
{
TIM4_IER=0X00; //禁止中断
TIM4_PSCR=0x07; //预分频值 16Mhz/128
TIM4_CNTR=0; //计数器初始值
TIM4_ARR=255; //自动重装的值
TIM4_EGR=0x01; //计数器重新初始化并产生寄存器更新
TIM4_IER=0x01; //使能更新中断
TIM4_CR1=0x01; //使能计数器
}
#pragma vector=0x19
__interrupt void TIM4_OVR_UIF_IRQHandler(void)
{
i++;
TIM4_SR=0X00; //中断状态寄存器清0
if(i==61)
{
PE_ODR^=0X20;
i=0;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////
代码2的延时不是1S ,而是 0.125秒
|