• 开发环境:Window 7
  • 开发工具:Keil uVision4
  • 硬件:STM32F103VCT6

定时器最基本的功能就是定时处理事情。比如定时发送USART数据、定时采集AD数据、定时检测IO口电位、还可以通过IO口输出波形等。可以实现非常丰富的功能。

STM32系列的定时器分为基本定时器、通用定时器、高级控制定时器。后者包括前者的全部功能。所以先掌握基本定时器可以更好理解后面功能繁多的定时器。

通常地,STM32高级定时器TIM1、TIM8,通用定时器TIM2、TIM3、TIM4、TIM5,基本定时器TIM6、TIM7。

有用过STM32的话都知道,STM32所有的外设初始化都是使用标准库里的初始化结构体和初始化函数,下面先说一下IM_TimeBaseInitTypeDef structure 结构体成员的含义。

TIM_TimeBaseInitTypeDef 定义于文件“stm32f10x_tim.h”:

typedef struct
{
u16 TIM_Period;
u16 TIM_Prescaler;
u8 TIM_ClockDivision;
u16 TIM_CounterMode;
u8 TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef;
  1. TIM_Period:定时器周期,当计数寄存器的值递增到等于该值时,将相关事件标志位置位。范围0~65535。
  2. TIM_Prescaler:定时器预分频设置。时钟源经该预分频器才是定时器时钟。范围0~65535。
  3. TIM_ClockDivision:时钟分频。基本定时器没有这个功能,无需设置。
  4. TIM_CounterMode:定时器计数方式设置。基本定时器只能向上计数,无需设置。
  5. TIM_RepetitionCounter :重复计数器,基本定时器没有这个功能,无需设置。

虽然定时器初始化结构体有5个成员,但是对于基本定时器只需设置其中两个就可以了。下面是一个定时0.5s翻转IO口电平的例子。

循环定时时间的计算:基本定时器只有内部时钟72MHz,定时器的实际时钟=内部时钟/(定时器预分频+1),那么TIM_Prescaler设置为7200-1,内部时钟源经过定时器预分频后即可得到10kHz(72MHz/((7200-1)+1))的频率。然后TIM_Period设置为5000-1,(这里因为计数是从0开始的,所以要减1),即可以得到定时为0.5s(5000*(1/10kHz))的定时器。代码如下:

创建一个TIME_base.h

#ifndef __TIMER_BASE_H
#define __TIMER_BASE_H
#include "stm32f10x.h"void TIME_NVIC_Configuration(void);void TIME_Configuration(void);void GPIO_Config(void);
#endif

创建一个TIME_base.c

#include "TIME_base.h"
void TIME_NVIC_Configuration(void)//如果系统会产生多种中断,那么就存在中断响应的优先级
{NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);           //设置优先级分组NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;           //指定IRQ通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //指定先占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //从优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //定义的IRQ是被使能还是失能NVIC_Init(&NVIC_InitStructure);
}void TIME_Configuration(void)//配置TIM6
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); TIM_TimeBaseStructure.TIM_Period = 5000; //设置了在下一个更新事件装入活动的自动重装载寄存器周期的值 范围是0x0000-0xFFFFTIM_TimeBaseStructure.TIM_Prescaler =(7200-1); //设置了用来作为 TIMx 时钟频率除数的预分频值TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); TIM_ITConfig(TIM6,TIM_IT_Update|TIM_IT_Trigger,ENABLE);//使能或者失能 TIM 的中断,详见附录图1TIM_Cmd(TIM6, ENABLE);
}void GPIO_Config(void)//配置一个IO口:
{       /*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启GPIOB的外设时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);/*选择要控制的GPIOB引脚*/       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;   /*设置引脚模式为通用推挽输出*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   /*设置引脚速率为50MHz */   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /*调用库函数,初始化GPIOB*/GPIO_Init(GPIOB, &GPIO_InitStructure);/*PB.0 输出高*/GPIO_SetBits(GPIOB,GPIO_Pin_0);
}

附录图1:

在stm32f10x_it.c添加定时器触发的中断处理函数:

void TIM6_IRQHandler(void)
{if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)  //获取中断状态{TIM_ClearITPendingBit(TIM6, TIM_IT_Update  );  //清除中断标志//在这里做中断需要处理的事情,尽可能精简,避免过长时间停留在中断里面GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction)(1-(GPIO_ReadOutputDataBit(GPIOB,  GPIO_Pin_0))));}}

创建一个main.c

#include "TIME_base.h"
int main(void)
{     /* IO端口配置 */ GPIO_Config();   /* TIM6 定时配置 */TIME_NVIC_Configuration();TIME_Configuration();while(1){}
}

将上面的TIM6全部换成TIM7也是可以的。

然后就可以把编译好的程序下载到开发板了,可以在PB.0引脚处接一个led,那么led就会每0.5s闪烁一次。

水平有限,仅供参考,错误以及不足之处还望多多指教。

stm32之TIM-基本定时器应用实例(详细)相关推荐

  1. stm32之TIM-高级定时器应用实例一(详细)

    硬件:stm32f103c8t6 开发工具:Keil uVision4 下载调试工具:ARM仿真器 如果第一次接触定时器,可以先看基本定时器.本篇内容较多,如果想直接动手操作,可以跳到后面的实验代码. ...

  2. 面向应用学习stm32(6)-TIM基本定时器-计数计时

    前导:本文的目的与,意在于面向应用的学习单片机,故不会涉及太多的原理知识,例如寄存器之类的. 主要目的在于面向应用的学习单片机,学会单片机的基础用法,开发板采取野火的指南者f103. 作者大二小白,写 ...

  3. stm32之TIM-高级定时器应用实例二(测量频率和占空比)

    接着上一篇(实验一)高级定时器应用. 实验二:PWM输入捕捉实验 实验要求: 高级定时器TIM1接收TIM2产生的PWM,TIM1测量PWM的频率和占空比,并将数据从UART1上发送到上位机,同时上位 ...

  4. STM32学习——TIM基本定时器

    基础知识 1.定时器分类 2.定时器时钟来自PCLK1(APB1),时钟源频率TIMxCLK=72M 3.真正计数用的时钟还需要进行分频,可进行1~65536之间的任何一个数进行分频.最终的计数频率为 ...

  5. STM32 TIM高级定时器死区时间的计算

    STM32 TIM高级定时器的互补PWM支持插入死区时间,本文将介绍如何计算以及配置正确的死区时间. 文章目录 什么是死区时间? 数据手册的参数 如何计算合理的死区时间? STM32中配置死区时间 什 ...

  6. STM32入门笔记04_TIM定时器+案例:TIM定时器定时中断、定时器外部时钟

    TIM定时器 TIM简介 TIM(Timer) 定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器.预分频器.自动重装寄存器的时基单元,在72MHz(系统主频)计数时 ...

  7. STM32学习笔记之定时器(2)

    文章结构: --> 一.定时器基本介绍 --> 二.普通定时器详细介绍TIM2-TIM5 --> 三.定时器代码实例 一.定时器基本介绍  之前有用过野火的学习板上面讲解很详细,所以 ...

  8. 第31章 TIM—基本定时器—零死角玩转STM32-F429系列

    第31章     TIM-基本定时器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...

  9. STM32的一个通用定时器理论上可以当做N个来用

    这个想法还是来自于PLC,学过PLC的都知道,在PLC中定时器是用很多的,西门子S7-1200中定时器是这样的 想用更多的定时器可以这样 而且这么多定时器同时或者不同时工作都不会相互影响,原因就是相当 ...

最新文章

  1. Android 弱网测试(小米手机切换3g和2g)
  2. SQL Server性能计数器部署(批量)
  3. 允許Linux的snmp服務被查詢
  4. 哈希桶 entry_哈希表代码实现
  5. Linux 时间同步问题_qingshanli1988-ChinaUnix博客
  6. iOS 14.5 目前已經發布了8 個測試版更新
  7. 腾讯面试官这样问我二叉树,我刚好都会 | 原力计划
  8. 自动布局和view 设置frame同时有效
  9. 解决This application failed to start because no Qt platform plugin could be initialized的问题
  10. 手把手教你用Python网络爬虫实现起点小说下载
  11. 从张家界火车站如何去张家界玻璃桥游玩,最详细的张家界攻略
  12. 点击微信内网页a标签直接跳转打开淘宝APP的方法实例
  13. 重读微积分(六):差商与牛顿插值
  14. Spring-全面详解(基础知识)
  15. OAuth 2.0 基础(2)
  16. 简历被公司浏览分布图-来自前程无忧
  17. Gym 103117 Problem - Spicy Restaurant
  18. 在win上下载安装CTex及其注意事项
  19. antdesign卡片_10分钟精通Ant Design Form表单
  20. mysql的树状表结构设计。

热门文章

  1. 基于Cortex-A7架构的嵌入式linux ARM驱动开发<1>——字符设备驱动开发
  2. UIControl类控件(三)
  3. 编程日常:创建枚举窗体的线程, 结果无法找到目标窗体
  4. EEG中的10-20和10-10标准导联系统介绍
  5. 视频转换芯片MS7200概述 HDMI转数字RGB/YUV/HDMI RXReceive/替代IT66021FN
  6. 【CV-Paper 19】PReLU:Delving Deep into Rectifiers
  7. 如何对HashMap按键值排序
  8. insert语句插数据入表的时候,Date带毫秒,并且会进1. 2022-06-18 01:07:18.523 入表时间为2022-06-18 01:07:19
  9. Python2.7抓取豆瓣美女图片
  10. evus是什么意思_EVUS到底是啥意思