OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13956|回复: 9

STM8 Tim4定时器问题

[复制链接]

9

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-12-26
在线时间
1 小时
发表于 2015-1-7 16:30:43 | 显示全部楼层 |阅读模式
5金钱

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


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


最佳答案

查看完整内容[请看2#楼]

已解决,错误是因为我两个代码的时钟初始化有区别,STM8上电默认时钟是2Mhz,计数器是递减计数器,手册上说是递增计数器是错误的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-12-26
在线时间
1 小时
 楼主| 发表于 2015-1-7 16:30:44 | 显示全部楼层
已解决,错误是因为我两个代码的时钟初始化有区别,STM8上电默认时钟是2Mhz,计数器是递减计数器,手册上说是递增计数器是错误的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-1-7 23:01:17 | 显示全部楼层
帮顶....
回复

使用道具 举报

9

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-12-26
在线时间
1 小时
 楼主| 发表于 2015-1-9 07:40:19 | 显示全部楼层
怎么没人解决呢?
回复

使用道具 举报

14

主题

490

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1229
金钱
1229
注册时间
2012-8-4
在线时间
248 小时
发表于 2015-1-9 08:59:56 | 显示全部楼层
回复【3楼】绝封于孽镜:
---------------------------------
你代码1是2m频率
代码2是16m频率
nrf51822蓝牙4.0手环开发板: 淘宝小店
回复

使用道具 举报

9

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-12-26
在线时间
1 小时
 楼主| 发表于 2015-1-9 11:05:42 | 显示全部楼层
回复【4楼】muniao:
---------------------------------
我看过,没有2M的时钟频率,主时钟都没有分频
回复

使用道具 举报

14

主题

490

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1229
金钱
1229
注册时间
2012-8-4
在线时间
248 小时
发表于 2015-1-9 11:57:36 | 显示全部楼层
回复【6楼】绝封于孽镜:
---------------------------------
呵呵呵不是没有2M的乜,还看过
ps这论坛大爷的多啊
nrf51822蓝牙4.0手环开发板: 淘宝小店
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-1-20
在线时间
0 小时
发表于 2015-1-20 20:33:29 | 显示全部楼层
回复【6楼】绝封于孽镜:
---------------------------------tim4是向上计数器
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2014-12-13
在线时间
0 小时
发表于 2015-3-24 11:48:02 | 显示全部楼层
帮顶....
回复

使用道具 举报

5

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2017-4-27
在线时间
58 小时
发表于 2017-6-30 23:16:50 | 显示全部楼层
本帖最后由 sjh2101 于 2017-6-30 23:26 编辑
绝封于孽镜 发表于 2015-1-7 16:30
已解决,错误是因为我两个代码的时钟初始化有区别,STM8上电默认时钟是2Mhz,计数器是递减计数器,手册上说 ...

我买的最小系统板,用的103f3,卖家提供的测试程序也和这个代码很相似,初值和重装值都是255.换成25后,led闪烁频率加快了。
我做的实验确实如此。我现在认为如果是加计数的话,重装值就是溢出值,加计数从0开始。这样合理吗?
这里有网友的解释,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 的说明书容易理解。

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

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 23:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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