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、配置嵌套中断控制器NVIC
void NVIC_config(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//优先级分组 NVIC_InitTypeDef nvic;
nvic.NVIC_IRQChannel=TIM2_IRQn;
nvic.NVIC_IRQChannelCmd=ENABLE;
nvic.NVIC_IRQChannelPreemptionPriority=;
nvic.NVIC_IRQChannelSubPriority=;
NVIC_Init(&nvic);
}

二、定时器初始化配置;

 //2、定时器初始化配置
void time2_config()
{
TIM_TimeBaseInitTypeDef tim;//结构体
NVIC_config();//优先级函数调用
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟
TIM_DeInit(TIM2);//?????
tim.TIM_ClockDivision=TIM_CKD_DIV1;//采样分频
tim.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
tim.TIM_Period=;//自动重装载寄存器的值
tim.TIM_Prescaler=;//时钟预分频
//tim.TIM_RepetitionCounter=
TIM_TimeBaseInit(TIM2,&tim);//初始化结构体
TIM_ClearFlag(TIM2,TIM_FLAG_Update);//清除溢出中断标志
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2,ENABLE);//开启时钟 }

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

 //TIM2通用定时器
uint16_t count = ;
void TIM2_IRQHandler(void)
{ if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)//判断中断标志是否发生
{
count++;
if(count == )
{
//点亮红灯
red_toggle();//红灯翻转,实现亮一秒灭一秒
//count清零
count=;
}
//手动清除中断标志位 }
TIM_ClearITPendingBit(TIM2,TIM_FLAG_Update);
}

四、LED灯配置

这是GPIO配置

 int led_gpio_init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//时钟使能
GPIO_InitTypeDef a;
a.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5;//可在这修改颜色 另外在主函数也要相应的修改 端口 5是红色 0是绿色 1是蓝色
a.GPIO_Speed = GPIO_Speed_50MHz;//设置输出速率50MHz
a.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(GPIOB,&a);//初始化GPIO,配置工作方式等
GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_5);//默认为高电平,灭灯
}

实现翻转功能

 /*红灯翻转*/
/*
*读取电平,如果等于高就执行赋低电平,否则给高电平
*/
void red_toggle()
{
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5) == RESET)//如果检测到低电平
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);//高电平点亮 }
else
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);//低点平熄灭
}
}

五、主函数

主函数主要调用这个就行

  led_gpio_init();//GPIO配置
NVIC_config();//中断优先级配置
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

再举个例子:

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

最新文章

  1. iOS and JAVA 的 RSA 加密解密 (转载整理 )
  2. 淘宝WAP版小BUG分析
  3. 开源战棋 SLG 游戏框架设计思考(二)规则系统要考虑的因素
  4. C#常用错误
  5. ORACLE数据库异步IO介绍
  6. PHP之分页类
  7. !! Android developer 最新国内镜像
  8. 【NodeJs】用arrayObject.join('')处理粘包的错误原因
  9. JS 单击复制,复制后变为已复制
  10. [Android] hid设备按键流程简述
  11. [LeetCode 116 117] - 填充每一个节点的指向右边邻居的指针I & II (Populating Next Right Pointers in Each Node I & II)
  12. 初识lucene
  13. C#中的委托和游戏中的运用
  14. W3C 、HTML 、CSS 发展介绍
  15. React学习及实例开发(一)——开始(转载)
  16. 用php脚本比较MySQL两个数据库的结构差异
  17. 使用mysqldiff生成两个数据库结构不同的脚本
  18. Express 应用生成器
  19. 通过HttpClient请求webService
  20. c++之旅:操作符重载

热门文章

  1. python property的用法
  2. JavaMail在Windows平台下正常发送邮件,部署到Linux后则发送失败
  3. python--使用递归优雅实现列表相加和进制转换
  4. 来一个使用sysbench测试cpu性能的简单脚本
  5. Ansible playbook 部署Openresty
  6. zookeeper 学习 状态机复制的共识算法
  7. Anslib 使用错误归纳
  8. Promise-async-await处理函数
  9. Python3爬虫知识点总结
  10. sqlldr的使用