本帖最后由 w67599 于 2012-12-26 11:40 编辑
尝试了下发现并没有跳入中断函数PC_ODR=0x60; 说明是搬某个教程里面的计数方法的
源程序如下:#include <iostm8s103f3.h>
void CLK_init(void)
{
CLK_CKDIVR = 0x08; // 16M内部RC经2分频后系统时钟为8M
}
void GPIO_init(void)
{
PA_DDR=0x02;
PA_CR1=0x02;
PC_DDR=0x60;
PC_CR1=0x60;
}
void TIM1_init(void)
{
TIM1_PSCRH = 0x1F; // 8M系统时钟经预分频f=fck/(PSCR+1)
TIM1_PSCRL = 0x3F; // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每个计数周期1ms
TIM1_ARRH = 0x03; // 自动重载寄存器ARR=0x01F4=500
TIM1_ARRL = 0xE8; // 每记数1000次产生一次中断,即500ms
TIM1_IER = 0x01; // 允许更新中断
TIM1_CR1 = 0x01; // 计数器使能,开始计数
}
#pragma vector=TIM1_OVR_UIF_vector
__interrupt void TIM1_OVR_UIF(void)
{
PC_ODR=PC_ODR^0x00;
TIM1_SR1 = 0; // 清除更新中断标记,这步不能漏掉,否则会连续进入中断程序
}
void init_devices(void)
{
asm("sim"); // 关全局中断
CLK_init();
GPIO_init();
TIM1_init();
asm("rim"); // 开全局中断
}
void main( void )
{
// 主循环里没有程序需要执行
while(1)
{
init_devices();
PC_ODR=0x00;
}
}
|