STM8 Tim4定时器问题

2019-07-19 20:45发布

我不清楚这个定时器的时钟源是哪里来的,计数方向是向上还是向下计数,自己这里有两个代码,得出了不同的结论.....


代码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 ");
      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秒


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
洋仔ko
1楼-- · 2019-07-20 19:06
 精彩回答 2  元偷偷看……
leiyutian
2楼-- · 2019-07-20 20:57
 精彩回答 2  元偷偷看……
sjh2101
3楼-- · 2019-07-20 22:05
本帖最后由 sjh2101 于 2017-6-30 23:26 编辑
绝封于孽镜 发表于 2015-1-7 16:30
已解决,错误是因为我两个代码的时钟初始化有区别,STM8上电默认时钟是2Mhz,计数器是递减计数器,手册上说 ...

我买的最小系统板,用的103f3,卖家提供的测试程序也和这个代码很相似,初值和重装值都是255.换成25后,led闪烁频率加快了。
我做的实验确实如此。我现在认为如果是加计数的话,重装值就是溢出值,加计数从0开始。这样合理吗?
这里有网友solarmax1969的解释,http://bbs.21ic.com/icview-201219-1-1.html

1:TIM4 是向上计数的(只能向上,不能像TIM1能设置向下计数)
2:TIM4_ARR 是计数的TOP值,一旦TIM4_CNTR = TIM4_APP ,就发生溢出中断,同时TIM4_CNTR 自动归0.
3:TIM4_CNTR 是当前计数值,来一个CLK ,TIM4_CNTR 就加1。
4:在TIM1,2,3 中向下计数时,ARR 理解为“自动Load”。呵呵,老外的思路。
    说实在STM的说明书写得难懂,没有Atmel 的说明书容易理解。

手册确实没说明白怎么个溢出法。

一周热门 更多>