历史上的今天
返回首页

历史上的今天

今天是:2025年02月04日(星期二)

2020年02月04日 | STM32——TIM2定时器定时

2020-02-04 来源:eefocus

STM32 中一共有11 个定时器,其中2 个高级控制定时器,4 个普通定时器和2 个基本定时器,以及2 个看门狗定时器和1 个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8 个定时器。关于这8 个定时器的简要说明,如图60 所示。其中TIM1 和TIM8 是能够产生3 对PWM 互补输出的高级定时器,常用于三相电机的驱动,时钟由APB2 的输出产生。TIM2-TIM5 是普通定时器,TIM6 和TIM7是基本定时器,其时钟由APB1 输出产生。由于STM32 的TIMER 功能比较复杂,所以只能一点一点的学习。因此今天就从最简单的开始学习起,也就是TIM2-TIM5 普通定时器的定时功能。

因此,就我们现在所学习的通用定时器来说,其完全可以以72MHz 的方式去工作。

 

关于定时器中断的配置步骤,主要分成以下三步:
一、 配置嵌套中断控制器NVCI;
二、定时器初始化配置;
三、定时器中断函数处理。


以下代码为核心代码,不包括一些.h文件,都是在一个文件中的。


一、 配置嵌套中断控制器NVCI;

 1 //1、配置嵌套中断控制器NVIC

 2 void NVIC_config(void)

 3 {

 4     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//优先级分组

 5     

 6     NVIC_InitTypeDef nvic;

 7     nvic.NVIC_IRQChannel=TIM2_IRQn;

 8     nvic.NVIC_IRQChannelCmd=ENABLE;

 9     nvic.NVIC_IRQChannelPreemptionPriority=0;

10     nvic.NVIC_IRQChannelSubPriority=0;

11     NVIC_Init(&nvic);

12 }


二、定时器初始化配置;

 1 //2、定时器初始化配置

 2 void time2_config()

 3 {

 4     TIM_TimeBaseInitTypeDef tim;//结构体

 5     NVIC_config();//优先级函数调用

 6   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟

 7     TIM_DeInit(TIM2);//?????

 8     tim.TIM_ClockDivision=TIM_CKD_DIV1;//采样分频

 9     tim.TIM_CounterMode=TIM_CounterMode_Up;//向上计数

10     tim.TIM_Period=1000;//自动重装载寄存器的值

11     tim.TIM_Prescaler=35;//时钟预分频

12     //tim.TIM_RepetitionCounter=

13     TIM_TimeBaseInit(TIM2,&tim);//初始化结构体

14     TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除溢出中断标志

15     TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);

16     TIM_Cmd(TIM2,ENABLE);//开启时钟

17     

18 }



三、定时器中断函数处理。


 1 //TIM2通用定时器

 2 uint16_t count = 0;

 3 void TIM2_IRQHandler(void)

 4 {

 5     

 6     

 7     if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)//判断中断标志是否发生

 8     {

 9         count++;

10         if(count == 1000)

11         {

12             //点亮红灯

13             red_toggle();//红灯翻转,实现亮一秒灭一秒

14             //count清零

15             count=0;

16         }

17         //手动清除中断标志位

18         

19     }

20     TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);    

21 }

 

四、LED灯配置

这是GPIO配置


 1 int led_gpio_init()

 2 {    

 3     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//时钟使能    

 4     GPIO_InitTypeDef a;

 5     a.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5;//可在这修改颜色 另外在主函数也要相应的修改  端口 5是红色 0是绿色  1是蓝色    

 6     a.GPIO_Speed  = GPIO_Speed_50MHz;//设置输出速率50MHz

 7     a.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出

 8     GPIO_Init(GPIOB,&a);//初始化GPIO,配置工作方式等

 9     GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5);//默认为高电平,灭灯

10 }

 


 


实现翻转功能


 1 /*红灯翻转*/

 2 /*

 3 *读取电平,如果等于高就执行赋低电平,否则给高电平

 4 */

 5 void red_toggle()

 6 {

 7     if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) == RESET)//如果检测到低电平

 8     {

 9         GPIO_SetBits(GPIOB,GPIO_Pin_5);//高电平点亮

10         

11     }

12     else

13     {

14         GPIO_ResetBits(GPIOB,GPIO_Pin_5);//低点平熄灭

15     }

16 }

 


五、主函数

主函数主要调用这个就行

1  led_gpio_init();//GPIO配置

2  NVIC_config();//中断优先级配置

3  time2_config();//定时器TIM2配置


以STM32TIM6为例讲解定时原理

熟记一个公式:定时时间=计数器的中断周期*中断的次数

 

有一个主角:计数器,他为定时发挥巨大的作用

计数器是一个16位的计数器,只能往上计数,最大计数值为65535(怎么算最大值??)。

 

当计数到这个值的时候,如果使能了中断,定时器就产生溢出中断。

问题来了:72MHz,36MHz,是什么意思?有什么用?

MHz是一个频率的单位,36MHz=36000 000Hz,就是每秒产生36000 000次,那么产生一次需要1/36000 000秒,

那么产生1ms需要多少次??

单位换算一下,1ms等于1/1000s

假设需要x次,则x*(1/36000 000)=1/1000

x=36000


在36MHz的频率下,计数值为36000,可以产生1ms

 

再举个例子:

上面的值实际应用看下面:


推荐阅读

史海拾趣

Defender Security公司的发展小趣事

随着网络安全问题的全球化趋势日益明显,Defender Security公司开始积极拓展国际市场。他们与多家国际知名的网络安全企业建立了合作关系,共同应对全球网络安全挑战。通过技术交流和合作研发,Defender Security不断提升自己的国际竞争力,逐渐成为了全球网络安全领域的重要力量。

Carling Technologies公司的发展小趣事

在发展过程中,Carling Technologies还通过收购其他企业来增强自身实力。例如,公司收购了Maretron品牌,将其纳入旗下,并充分利用其在船舶监控和控制解决方案方面的优势,为前沿产品和解决方案的持续开发提供支持。这种收购与品牌整合的策略不仅丰富了公司的产品线,也扩大了其在特定市场的影响力。

Everett Charles Technologies (ECT)公司的发展小趣事

ECT一直致力于技术创新和研发,不断推出具有竞争力的新产品。多年来,ECT成功拥有了100多项专利,这些专利不仅涵盖了电子测试系统的各个方面,也体现了公司在技术上的领先地位。通过不断的技术创新,ECT赢得了众多世界知名电子公司及其代工厂的长期合作伙伴关系,进一步巩固了其在行业中的主导地位。

方向电子公司的发展小趣事

ECT一直致力于技术创新和研发,不断推出具有竞争力的新产品。多年来,ECT成功拥有了100多项专利,这些专利不仅涵盖了电子测试系统的各个方面,也体现了公司在技术上的领先地位。通过不断的技术创新,ECT赢得了众多世界知名电子公司及其代工厂的长期合作伙伴关系,进一步巩固了其在行业中的主导地位。

Cramer公司的发展小趣事

在智能家居领域,Cramer公司也展现出了强大的创新能力。他们推出了一款智能家居控制系统,该系统可以通过手机APP远程控制家中的电器设备。为了实现这一功能,Cramer公司投入了大量资源进行技术研发,并与多家家居品牌达成了战略合作协议。这款产品的推出,使得Cramer公司在智能家居市场上占据了一席之地。

BNS Solutions公司的发展小趣事

在电子行业的早期阶段,BNS Solutions公司凭借其敏锐的市场洞察力和技术创新能力,迅速崭露头角。公司团队针对当时市场上电子产品性能不足、用户体验不佳的问题,研发出了一系列高效能、易操作的电子设备。这些产品不仅满足了消费者对电子设备的基本需求,还通过独特的设计和功能赢得了市场的广泛认可。随着产品的热销,BNS Solutions公司的知名度逐渐提升,为后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

一个可替代传统人机的方案,你不心动吗?

液晶终端+单片机系统=人机界面(HMI)        北京迪文科技有限公司  生产的TFT真彩液晶终端,配上一个小型单片机系统就可实现传统计人机界面的功能。液晶终端实现界面显示及触摸反馈功能,单片机系统进行与PLC的 ...…

查看全部问答>

Linux命令行大全中文版(CHM格式)

Linux命令行大全中文版(CHM格式)…

查看全部问答>

跨导OTA仿真问题

谁用ADS做过mos管OTA仿真? 教教我…

查看全部问答>

步进电机的控制(C语言)

大家好 请问怎样用并口控制两相混合式步进电机的正反转。在网上看了都是用单片来控制的,请问不用单片机直接用两相混合式步进电机细分驱动器可以控制吗? 还有就是写这种程序一般用的是keil软件吗? 小弟初学很多不懂,希望大家帮帮忙。 谢谢…

查看全部问答>

如何察看NIDS_PACKET的内容

看见网上经常有介绍NIDS_PACKET是就贴出这样的内容: Packet length : 590 005dba36:00 00 5a 42 40 86 00 10 7b 3b 90 f5 08 00 45 00 005dba46:02 40 d3 2a 40 00 7f 06 08 24 85 fc 09 70 85 fc 005dba56:09 01 04 72 00 14 02 00 d5 35 9b ...…

查看全部问答>

CListViewCtrl

请指教:   我想用一个位图来做 CListViewCtrl控件的背景,怎么实现?…

查看全部问答>

新手求助如何搭建VS 2005开发wince的环境!在线等!!!!!

  本人初次做Win ce的开发,IDE用的是VS 2005,所建项目类型是在智能设备中的Windows ce 5.0模板用的是设备应用程序,但是在调试时在弹出的“选择应用程序的部部署位置”时我选 了Windows CE Device时出现了\"连接到设备失败。  &nbs ...…

查看全部问答>

华为公司2007年社会招聘

华为内部推荐 招聘对象:        04,05年本科及硕士,06年硕士生,07年的应届生不招, 学校要求省重点大学及以上,通信、电子、计算机、经济类、管理类等相关专业毕业。 招聘的是正式“华为员工”,待遇一般不低于07年的 ...…

查看全部问答>