历史上的今天
今天是: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
再举个例子:

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

史海拾趣
|
液晶终端+单片机系统=人机界面(HMI) 北京迪文科技有限公司 生产的TFT真彩液晶终端,配上一个小型单片机系统就可实现传统计人机界面的功能。液晶终端实现界面显示及触摸反馈功能,单片机系统进行与PLC的 ...… 查看全部问答> |
|
大家好 请问怎样用并口控制两相混合式步进电机的正反转。在网上看了都是用单片来控制的,请问不用单片机直接用两相混合式步进电机细分驱动器可以控制吗? 还有就是写这种程序一般用的是keil软件吗? 小弟初学很多不懂,希望大家帮帮忙。 谢谢… 查看全部问答> |
|
看见网上经常有介绍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 ...… 查看全部问答> |
|
新手求助如何搭建VS 2005开发wince的环境!在线等!!!!! 本人初次做Win ce的开发,IDE用的是VS 2005,所建项目类型是在智能设备中的Windows ce 5.0模板用的是设备应用程序,但是在调试时在弹出的“选择应用程序的部部署位置”时我选 了Windows CE Device时出现了\"连接到设备失败。 &nbs ...… 查看全部问答> |
|
华为内部推荐 招聘对象: 04,05年本科及硕士,06年硕士生,07年的应届生不招, 学校要求省重点大学及以上,通信、电子、计算机、经济类、管理类等相关专业毕业。 招聘的是正式“华为员工”,待遇一般不低于07年的 ...… 查看全部问答> |




