本帖最后由 ZXDSCCD 于 2018-3-29 06:02 编辑
//定时器初始化和启动
void TIM2_Init(void)
{
CLK_PCKENR1_PCKEN10=1;//开启定时器2外设时钟
TIM2_PSCR=0x0f;//不分频
TIM2_ARRH = 0x27; // 自动重载寄存器,10000
TIM2_ARRL = 0x10; // 计数达到该值即重头开始计数,(更新)
TIM2_CNTRH =0x00;//设定计数器起始值(出现异常后增加了这段程序)
TIM2_CNTRL =0x00;
TIM2_IER = 0x01; // 允许更新中断
TIM2_SR1_UIF=0;//清除中断标志 (出现异常后才加的这代码,异常照旧)
TIM2_CR1 = 0x85; // 允许溢出中断,开始计数
}
//下面是定时器2中断程序
//TIM2溢出中断,采样时间进行定时
#pragma vector = TIM2_OVR_UIF_vector
__interrupt void EXIT_TIM2_OVR(void) //中断服务函数
{
TIM2_SR1_UIF=0;//清除中断标志
TIM2_CR1 = 0x00; //停止计数器2
TIM2_CNTRH =0x13;//设定计数器起始值,5000(出现异常后增加了这段程序)
TIM2_CNTRL =0x88;
TIM2_CR1 = 0x85;//// 允许溢出中断,开始计数
}
#include <iostm8l152r8.h>
//主函数
int main( void )
{
asm("rim");
TIM2_Init();
while(1);
}
照上面的程序运行,在计数到10000时能够进入中断,但是问题在于定时器一起动就先进入中断(从5000开始计数),然后才正常计数到10000后再次进入中断。换成定时器3,定时器4,定时器5,都一样的情况,不管是先请中断标志再启动定时器,还是启动定时器立即清除中断标志都一样的效果,初始化顺序来回调整都一样的效果,折腾一晚上了,还没搞定。
此帖出自
小平头技术问答
一周热门 更多>