OpenEdv-开源电子网

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

stm32定时器问题,求大家帮助分析下。

[复制链接]

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2013-3-14 09:36:22 | 显示全部楼层 |阅读模式
我用战舰的范例,关于定时器方面出现问题。定时的时间比实际的时间大8倍。代码如下:
//------------------------------------------
delay_init();       //延时函数初始化   
NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600);  //串口初始化为9600
  LED_Init();      //LED端口初始化
TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
delay_ms(200);  
    while(1)
{
LED=!LED;
delay_ms(500);    
}
LED闪烁间隔是4秒闪烁(4亮4秒熄灭)。应该是500ms才正确啊。很纠结没找出原因。请各位大侠帮小弟分析下。不胜感激啊。
用的板子不是战舰。硬件基本上是一样的。主控芯片是stm32f103zet6.
我感觉是不是没有倍频啊。外部晶振是8M的,9倍频以后就是72M了。我用手机计时的,可能不准。要是4.5秒的话就是正好相差9倍了。 
请大家帮我分析分析。
我之前买了原子的stm32f103rbt6的一块开发板。书也买了定时从来没有出现这种问题啊。我在我以前的那个开发板上移植了modbus通信。modbus通信没有问题的。现在用stm32f103zet6定时就出现上述问题,modbus也通信不了了。
原子哥是不是又要出黑科技了呀。^_^...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
 楼主| 发表于 2013-3-14 09:42:11 | 显示全部楼层
回复【楼主位】fanghuiopenedv:
---------------------------------
LED用的是这个管脚应该于此没有关系。在线等,大家帮忙看下,谢谢。
#define LED Gout(14) // G14
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-3-14 10:02:34 | 显示全部楼层
TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
改为
TIM3_Int_Init(7199,4999);//10Khz的计数频率,计数到5000为500ms
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
 楼主| 发表于 2013-3-14 10:16:48 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
谢谢回复。
TIM3_Int_Init(7199,99);---这样是不是10ms啊。
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
 楼主| 发表于 2013-3-14 10:26:25 | 显示全部楼层
回复【3楼】正点原子:
--------------------------------
刚才我试了下。改成
TIM3_Int_Init(7199,4999);//10Khz的计数频率,计数到5000为500ms
效果是一样的。还是4秒左右的定时啊。
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
 楼主| 发表于 2013-3-14 10:28:14 | 显示全部楼层
回复【楼主位】fanghuiopenedv:
---------------------------------
这是主函数里的:
 int main(void)
 {
  extern u8 modbus_delay;
extern u8 delay_time1;
extern u8 delay_time2;
//------------------------------------------
delay_init();       //延时函数初始化   
NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600);  //串口初始化为9600
  LED_Init();      //LED端口初始化
TIM3_Int_Init(7199,4999);//10Khz的计数频率,计数到5000为500ms
delay_ms(200);  
    while(1)
{
if(delay_time1==0){
delay_time1=1;
LED=!LED;
}
//LED=!LED;
//delay_ms(500);    
}
}
这是定时器里的:
u8 modbus_delay=0;
u8 delay_time1=0;
u8 delay_time2=0;
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


TIM_Cmd(TIM3, ENABLE);  //使能TIMx  
}
//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 
if(modbus_delay!=0)modbus_delay--;
if(delay_time1!=0) delay_time1--;
if(delay_time2!=0) delay_time2--;
}
}
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
 楼主| 发表于 2013-3-14 10:42:41 | 显示全部楼层
回复【楼主位】fanghuiopenedv:
---------------------------------
开机要等要几秒LED才闪烁,间隔4秒左右。是不是像aleda303 说的那样外部晶振没有启动啊。
“很有可能是PLL工作不正常。 或外部时钟晶体不正常, 导致 SysClock =  内部HSI”------aleda303
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

5

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2012-12-3
在线时间
11 小时
发表于 2013-3-14 11:39:13 | 显示全部楼层
建议在定时器中断函数中加个IO口翻转的语句,然后用软件仿真,看看该IO口多久翻转一次,还有LED多久翻转一次
根据这两个时间来判断是时钟源的问题,还是程序问题
stm32
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
 楼主| 发表于 2013-3-14 12:02:59 | 显示全部楼层
回复【7楼】fanghuiopenedv:
---------------------------------
找到原因了是晶振没有起振。谢谢大家啊。
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2013-3-14 13:13:06 | 显示全部楼层
回复【7楼】fanghuiopenedv:
---------------------------------
那你写个最简单的程序,LED延时,看看准不准。用我们的delay函数。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
 楼主| 发表于 2013-3-14 17:40:07 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
是外部晶振的问题。您给的delay函数也是准确的了。内部也有RC自激震荡8M的,没有倍频。这样的话正好相差9倍。
问题已经解决了。大家要是出现类似我的这种情况,请留心一下看看是不是外部晶振的问题。
最终贴。over了。^_^
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

10

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2016-7-13
在线时间
41 小时
发表于 2017-7-11 21:54:22 | 显示全部楼层
正点原子 发表于 2013-3-14 10:02
TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
改为
TIM3_Int_Init(7199,4999);//10Khz ...

新手,问下0.5s不应该是2HZ吗?为什么是10Khz?
回复 支持 反对

使用道具 举报

13

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2017-3-24
在线时间
28 小时
发表于 2017-7-28 15:25:47 | 显示全部楼层
yjh 发表于 2017-7-11 21:54
新手,问下0.5s不应该是2HZ吗?为什么是10Khz?

默认是APB1的两倍作为作为TIM3的时钟频率,psc为7200,APB1为36MHz,所以计数频率当然是10k了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-16 14:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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