OpenEdv-开源电子网

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

请教大神时钟,分频,计时器之间的概念

[复制链接]

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2018-6-21
在线时间
25 小时
发表于 2018-7-7 11:36:28 | 显示全部楼层 |阅读模式
5金钱
请教一下各位大神,小弟使用的是STM32F103ZET6开发板,最近被时钟,预分频,还有ARR,PSC搞懵逼了,
2222222222222222.png

44444444444444.png

请问这个per还有psc指的是什么 ?per是ARR,psc是预分频吗 ?72MHZ的时钟进来,除以PSC(举例此时为7200),就得到10000,这个10000又是指的什么意思 ??,我想让LED每隔1秒钟闪烁一次,应该怎么配置 ?还有图2中的TIM_SetCompare1()函数中的第二个参数代表什么 ?有没有大神帮小弟讲解一下 ,感谢,小弟太菜
32132113321321321.png

最佳答案

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

问题太多的话, 就需要自己去找定时器的章节仔细研究一下, 这种问法可能效果不是很好。 你的代码上面本身就有注释, PER是自动装载值,PSC是分频数。72MHZ分7200得10000,当然是HZ,HZ是每秒一次的意思,10000就是每秒10000次计数,反过来说,计数10000次就是你所需要的1秒啦
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4520
金钱
4520
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-7 11:36:29 | 显示全部楼层
问题太多的话,
就需要自己去找定时器的章节仔细研究一下,
这种问法可能效果不是很好。
你的代码上面本身就有注释,
PER是自动装载值,PSC是分频数。72MHZ分7200得10000,当然是HZ,HZ是每秒一次的意思,10000就是每秒10000次计数,反过来说,计数10000次就是你所需要的1秒啦
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

18

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2017-9-5
在线时间
43 小时
发表于 2018-7-7 12:32:45 | 显示全部楼层
10000就表示每秒內timer執行10000次數值增減。  我也是新手,感覺是這樣的。
开发板:战舰V3,操作系统:Win7 32位旗舰版,Keil版本:5.24a
回复

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2018-6-21
在线时间
25 小时
 楼主| 发表于 2018-7-8 15:22:47 | 显示全部楼层
warship 发表于 2018-7-7 16:52
问题太多的话,
就需要自己去找定时器的章节仔细研究一下,
这种问法可能效果不是很好。

谢谢大牛, 我昨天仔细研究了一下,已经差不多弄清楚了,问题的关键还是我没有明白时钟,分频,跟自动重装载值的概念,
时钟: 单片机的心脏,72MHZ,1/72MHZ即为时钟工作一次的时间,经过PSC的10000分频后得到了计时器的时钟(10000),也就是说计时器工作一次的时间为1/10000,反之,工作一秒钟,则需要10000/10000,所以自动重装载值ARR就得写10000啦,
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4520
金钱
4520
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-8 21:36:16 | 显示全部楼层
强大的腰 发表于 2018-7-8 15:22
谢谢大牛, 我昨天仔细研究了一下,已经差不多弄清楚了,问题的关键还是我没有明白时钟,分频,跟自动重 ...

//配置TIM2为1s产生一次中断,用于定时器使用
void Timer2_Init(void)
{                                         
        TIM_TimeBaseInitTypeDef    TIM_TimeBaseInitTypeStruct;       
        NVIC_InitTypeDef    NVIC_InitTypeStruct;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        //72000000/7200=10000=10K
        //10Khz的计数频率,每次为1/10K=0.1ms=100us, 计数到10000为1s  
        TIM_TimeBaseInitTypeStruct.TIM_Prescaler = 7199;//tim2预分频值7200,即时钟为100us
        TIM_TimeBaseInitTypeStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
        TIM_TimeBaseInitTypeStruct.TIM_Period =        9999+1;        //10000*100us=1s溢出一次                                                          
        TIM_TimeBaseInitTypeStruct.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitTypeStruct);                

        NVIC_InitTypeStruct.NVIC_IRQChannel = TIM2_IRQn;                     //配置定时器中断优先级
        NVIC_InitTypeStruct.NVIC_IRQChannelPreemptionPriority =        1;
        NVIC_InitTypeStruct.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitTypeStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitTypeStruct);       

        TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE);         //允许溢出中断          
        TIM_Cmd(TIM2,DISABLE);
}
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2018-6-21
在线时间
25 小时
 楼主| 发表于 2018-7-8 22:02:49 | 显示全部楼层
warship 发表于 2018-7-8 21:36
//配置TIM2为1s产生一次中断,用于定时器使用
void Timer2_Init(void)
{                                         

请教大牛 ,用定时器的方式为:
1:使能时钟
2:配置定时器(ARR,PSC,定时器计数模式,初始化TIM_TimeBaseInit()函数)
3:使能中断(TIM_ITConfig())
4::配置中断(通道,抢占优先,从优先级配置,使能通道,初始化NVIC_Init()
5:使能外设(TIM_Cmd())
这样的步骤对吗 ?
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4520
金钱
4520
注册时间
2018-5-11
在线时间
946 小时
发表于 2018-7-8 23:02:51 | 显示全部楼层
强大的腰 发表于 2018-7-8 22:02
请教大牛 ,用定时器的方式为:
1:使能时钟
2:配置定时器(ARR,PSC,定时器计数模式,初始化TIM_TimeB ...

对的。
我的上一个例子,是关了中断和定时器的,
这样可以等需要的时候再开。
void StopMyTimer2(void)
{
        TIM_Cmd(TIM2,DISABLE );         //失能定时器2
        TIM_ITConfig( TIM2,TIM_IT_Update, DISABLE); //关闭TIM2超时溢出中断       
}


void StartMyTimer2(void)
{
        TIM_Cmd(TIM2,ENABLE );         //使能定时器2
        TIM_ITConfig( TIM2,TIM_IT_Update, ENABLE); //允许TIM2超时溢出中断       
}
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2018-6-21
在线时间
25 小时
 楼主| 发表于 2018-7-13 08:30:09 | 显示全部楼层
warship 发表于 2018-7-8 23:02
对的。
我的上一个例子,是关了中断和定时器的,
这样可以等需要的时候再开。

好些 ,谢谢大神,新手上路~~~
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 13:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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