找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13824|回复: 1
打印 上一主题 下一主题
收起左侧

解决STM8定时器首次进入中断时间不对

[复制链接]
跳转到指定楼层
楼主
ID:71477 发表于 2015-1-1 18:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以定时器2为例,定时器初始化后,发现第一次进入中断的时间不是定时时间到后才进入的,似乎是20多us 就立即进入了中断。以后的中断时间就正常了。这个可以通过在中断里关闭定时器,只让定时器运行一次,来发现这个问题。
这个还不知道是怎么回事。由于我是要每次定时器只定时一次,只能是在中断里判断进入两次后再关闭定时器。
解决办法是,开启定时器后,先不开中断,死等中断标志,清除标志后再开中断即可。
定时器计数初值由TIM2_EGR 初始化,他会引起更新事件中断,所以第一次中断是不准确的。这和51单片机不同。

/********设置定时器2,是向上计数的,自动和装载值比较******/
void SetTimer2(unsigned short val)
{
   
   TIM2_IER=0x00;    //禁止中断
   TIM2_SR1=0x00;
   TIM2_PSCR=0x01;  //2分频 内部RC是16M,默认CLK_DIVR分频8  2M/2= 1M   
   
   //TIM2_CNTRH=val/256;//设置计数器寄存器初值
   //TIM2_CNTRL=val%256;//这里寄存器根本不用初始化, 下面有初始化计数器TIM2_EGR=0X01; 会自动装载,并引起中断
   TIM2_ARRH=val/256;  //设置自动装载寄存器
   TIM2_ARRL=val%256;  //这个值就是计数最大值
   TIM2_CR1=0x01;   //启动定时器
   TIM2_EGR=0x01;    //重新初始化计数器,产生新事件,这会引起中断
   while((TIM2_SR1&0x01)==0);//第一次更新事件标志会立即进入,所以第一次计数不准,这里等待他
   if(TIM2_SR1)
   TIM2_SR1=0x00;//清除第一次无效中断
   TIM2_IER = 0x01; //开中断

}


/*******************定时器2初始化,比较计数值,自动重装**************************/
void Init_Tim2(void)
{
TIM2_CR1=0x00;    //关闭定时器
TIM2_SR1=0x00;
TIM2_PSCR=0x01;  //2分频 内部RC是16M,默认CLK_DIVR分频8  2M/2= 1M
  
TIM2_CNTRH=65530/256;  //设置计数器寄存器初值
TIM2_CNTRL=65530%256;//这两个寄存器根本不用初始化,和51不同,由TIM2_EGR 初始化,他会引起中断,所以第一次不准确
TIM2_ARRH=65530/256;  //设置自动装载寄存器
TIM2_ARRL=65530%256;  //这个值就是计数最大值
TIM2_CR1=0x01;
TIM2_EGR=0x01;    //重新初始化计数器,产生新事件

TIM2_IER=0x01;    //开启中断
}


/****************定时器2中断****************************/
@far @interrupt void TIM2_UPD_OVF_IRQHandler (void)
{

TIM2_SR1=0x00;
Tim2Cnt++;
if(Tim2Cnt>=2)
{
   TIM2_IER=0x00;
   TIM2_CR1=0x00;    //关闭定时器
   PA1_ODR=!PA1_ODR;
   Tim2Cnt=0;
   AllowSetTim2=1;
}
return;
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:435377 发表于 2018-11-28 22:46 | 只看该作者
根本原因不在这里,而是在配置预分频器的时候,没有实际修改该寄存器。
详见我的博客https://blog.csdn.net/a351357741/article/details/84593747,嘻嘻~
如果有用欢迎fork我的github~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表