|
本帖最后由 gzyavr 于 2012-8-31 09:42 编辑
程序实现:环境STVD+cosmic 内部晶振16M。STM8S903
定时一秒的时间,使LED闪烁的时间间隔为一秒。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void GPIO_INIT(void)
{
GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_OUT_PP_HIGH_FAST);//推挽输出低电平
GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_FAST);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Tim1_Init(void)
{
/*
TIM1_DeInit();
_asm("SIM") ; //开全局中断
CLK->PCKENR1|=0X80;//0x8 使能TIM1时钟。
TIM1_TimeBaseInit(16, TIM1_COUNTERMODE_UP,1000,0);//10ms
TIM1_ARRPreloadConfig(ENABLE);
TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
TIM1_Cmd(ENABLE);
*/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~以上屏蔽的使用的是库函数,但是进不了中断
CLK->PCKENR1|=0X80;//0x8 使能TIM1时钟。
TIM1->PSCRH=0X3e;
TIM1->PSCRL=0X80; //16000分频,16M晶振, 的到得计数频 1毫秒,
TIM1->ARRH =0x03;
TIM1->ARRL =0xe8; //1000次
TIM1->SMCR=0X00;
TIM1->ETR=0X00;
TIM1->EGR=0X01; // 软件产生一次中断 更新寄存器中值
TIM1->IER|=0x01; //允许溢出中断。
_asm("RIM") ; //开全局中断
TIM1->CR1|=0X81; //使能计数器,使能预装载,向上计数方式。
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#pragma vector=0xb
@far @interrupt void TIM1_Server_Interrupt(void)
{
_asm("SIM") ; //关全局中断
//GPIO_WriteHigh(GPIOD, GPIO_PIN_6);
//delay_ms(1000);
//GPIO_WriteLow(GPIOD, GPIO_PIN_6);
//delay_ms(1000); ~~~~~~~~~~~~~~~~~~~~~~加入延时后,,LED可以闪烁
GPIO_WriteReverse(GPIOD, GPIO_PIN_6);~~~~~~~~~不加延时的时候,LED仅仅有一点点亮度,几乎看不到LED亮。
TIM1->SR1&=0xfe;//清除中断标志
_asm("RIM"); //开全局中断
}
在stm8_interrupt_vector.c文件里面是:
extern @far @interrupt void TIM1_Server_Interrupt(void);~~~~~~~~~~在该文件的开头相当于一个声明吧。
然后在 struct interrupt_vector const _vectab[] ={ }中写
{0x82, TIM1_Server_Interrupt}, /* irq11 - TIM1 Update/Overflow/Trigger/Break interrupt */
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void main(void)
{
CLK_HSICmd(ENABLE);
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//内部时钟分频2分频。内部晶振8M
GPIO_INIT();
Tim1_Init();
/* Infinite loop */
while (1)
{
}
}
编译后没有问题.
现在的情况是:中断可以进入,但是时间不对。
问题:
1. 需要达到1S闪烁的LED基本上不亮的。
我为了验证是否进入中断,我在中断函数里面加了个延时,这样LED可以闪烁。
2.
我的stm8_interrupt_vector.c文件和我看到的资料上说怎么改中断入口参数说的不一样,是不是这个文件的问题呢?
http://hi.baidu.com/gzyavr/item/efbdd9f0ab5904bd30c1997f
我是按照上面链接中的方法修改中断入口的。如下图所示的两个文件是不是等效的呢?
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|