一、stm32f103系列定时器介绍

先声明:stm32f103c8t6中没有基本定时器、只有TIM1-TIM4:分别是高级定时器和通用定时器(对照下图请自行阅读stm32f103x的datasheet)1、定时器功能:定时、输出比较、输入捕获、互补输出,其中基本定时器只有定时功能、通用定时器只没有互补输出功能、高级定时器具有所有功能。2、定时器分类:
(1)基本定时器:TIM6、7
(2)通用定时器:TIM2345
(3)高级定时器:TIM1、8

3、定时器总线时钟:


无特殊情况,给到定时器的内部时钟都是72M

二、基本定时器

基本定时器分为三部分讲解:
(1)时钟源
(2)控制器
(3)时基单元

1、时钟源

时钟源来自RCC的TIMXCLK,就是内部时钟(CK_INT)直接经过控制器传给时基单元充当CK_PSC

2、控制器

控制定时器的复位、使能、计数、DAC触发

3、时基单元

基本定时器的时基单元包括三个部分
(1)预分频器:分频、得到计时器的时钟,即CNT计数1次所需要的时间,预分频器时16位的寄存器、所以可分频为1-65536
(2)计数器:用来计数、基本定时器的CNT计数器只能向上计数
(3)自动装载寄存器ARR:即CNT加到ARR的值之后,会产生一个事件或中断或DMA请求,中断用得比较多(定时x时间之后、当点灯大师)

(4)其实、时基单元里面还有非常重要的寄存器、叫做影子寄存器,什么是影子寄存器呢?仔细看上面的图会发现PSC和自动重装载寄存器ARR都有阴影,它们就是影子寄存器
影子寄存器的作用:其实,PSC和ARR都是当影子寄存器被写入新的值时,电路才会生效,所以是用户值->寄存器->影子寄存器->生效,影子寄存器可以起到缓冲的作用,一般不会使用影子寄存器

如何实现500ms定时

1.分频器PSC设置:72-1(即计数器时钟为1us)
2.ARR设置为1000,即计数一次1ms
3.可通过计数产生中断,中断里面设置全局变量,每次加1,当从0加到500时,就是500ms了。

基本定时器代码实例

bsp_BasicTim.c

#include "bsp_BasicTim.h"// 中断优先级配置
static void BASIC_TIM_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure; // 设置中断组为0NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);     // 设置中断来源NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQ ;  // 设置主优先级为 0NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   // 设置抢占优先级为3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}static void BASIC_TIM_Config(void)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;// 开启定时器时钟,即内部时钟CK_INT=72MBASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, ENABLE);// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断TIM_TimeBaseStructure.TIM_Period = BASIC_TIM_Period;   // 时钟预分频数为TIM_TimeBaseStructure.TIM_Prescaler= BASIC_TIM_Prescaler;// 时钟分频因子 ,基本定时器没有,不用管//TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;// 计数器计数模式,基本定时器只能向上计数,没有计数模式的设置//TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; // 重复计数器的值,基本定时器没有,不用管//TIM_TimeBaseStructure.TIM_RepetitionCounter=0;// 初始化定时器TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure);// 清除计数器中断标志位TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);// 开启计数器中断:计数器溢出、产生更新事件、计数器的更新事件能够产生中断、并被使能TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);// 使能计数器TIM_Cmd(BASIC_TIM, ENABLE);
}void BASIC_TIM_Init(void)
{BASIC_TIM_NVIC_Config();BASIC_TIM_Config();
}

bsp_BasicTim.h

#ifndef __BSP_TIMEBASE_H
#define __BSP_TIMEBASE_H#include "stm32f10x.h"/********************基本定时器TIM参数定义,只限TIM6、7************/
#define BASIC_TIM6 // 如果使用TIM7,注释掉这个宏即可#ifdef  BASIC_TIM6 // 使用基本定时器TIM6
#define            BASIC_TIM                   TIM6
#define            BASIC_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
#define            BASIC_TIM_CLK               RCC_APB1Periph_TIM6
#define            BASIC_TIM_Period            (1000-1)
#define            BASIC_TIM_Prescaler         71
#define            BASIC_TIM_IRQ               TIM6_IRQn
#define            BASIC_TIM_IRQHandler        TIM6_IRQHandler#else  // 使用基本定时器TIM7
#define            BASIC_TIM                   TIM7
#define            BASIC_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
#define            BASIC_TIM_CLK               RCC_APB1Periph_TIM7
#define            BASIC_TIM_Period            1000-1
#define            BASIC_TIM_Prescaler         71
#define            BASIC_TIM_IRQ               TIM7_IRQn
#define            BASIC_TIM_IRQHandler        TIM7_IRQHandler#endifvoid BASIC_TIM_Init(void);#endif    /* __BSP_TIMEBASE_H */

中断服务子程序:BASIC_TIM_IRQHandler

void BASIC_TIM_IRQHandler(void)
{if ( TIM_GetITStatus( BASIC_TIM, TIM_IT_Update) != RESET ) //当更新时间到来、定时器TIM的状态寄存器就不为0,满足条件。{   time++;TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);         }
}

三、高级定时器

高级定时器分为6个部分讲解:
(1)时钟源
(2)控制器
(3)时基单元
(4)输入捕获
(5)输出比较
(6)刹车控制区

附上功能框图:

1、时钟源

高级定时器的时钟源有4种:
(1)内部时钟源IN_CLK
(2)外部时钟模式1: TIx(x=1,2,3,4)
(3)外部始终模式2: ETR
(4)内部触发输入: ITRx


二、控制器

触发控制器用来针对片内外设输出触发信号,比如为其它定时器提供时钟和触发 DAC/ADC 转换。

从模式控制器可以控制计数器复位、启动、递增/递减、计数。

三、时基单元

参考基本定时器

四、输入捕获

基于stm32f103c8t6的定时器详解(持续更新)相关推荐

  1. Android 各大厂面试题汇总与详解(持续更新)

    介绍 目前网络中出现了好多各种面试题的汇总,有真实的也有虚假的,所以今年我将会汇总各大公司面试比较常见的问题,逐一进行解答.会一直集成,也会收集大家提供的面试题,如有错误,请大家指出,经过排查存在,会 ...

  2. ElasticSearch搜索引擎详解-持续更新中

    ElasticSearch搜索引擎详解 1. ElasticSearch概述 1.1 elasticsearch是什么 1.2 全文搜索引擎 1.3 elasticsearch and solr 1. ...

  3. Win10C盘文件夹内容详解(持续更新,欢迎留言)

    本文参考以下博客: Roaming和Local的区别 C:\Users[用户名]\AppData 1.Local和Roaming之间的区别:Local 比较大,非漫游应用数据.Roaming 一般是漫 ...

  4. php怎么配置configure,PHP编译参数configure配置详解(持续更新中)

    编译参数-使用 ./configure -h 在源代码目录中,该命令可以查看所有编译参数以及对应的英文解释 编译参数-说明 --prefix=/opt/php //指定 php 安装目录 --with ...

  5. 智力题集锦与详解——持续更新

    因为没有标准答案,需要思考,所以欢迎批评与探讨. 目录 一.数和数积 1.1 问题 1.2 分析 A,B不知 A知道(B不知)时知道了 B知道(A一开始不知且现在知道了)时知道了 如果为(2,2) 如 ...

  6. wireshark网络安全分析工具之万文多图详解(持续更新)

    文章目录 1. 基本介绍 2. 下载与安装 3. 详细教程 3.1 软件界面介绍 3.1.1 菜单栏 3.1.2 工具栏 3.1.3 数据包列表区 3.1.4 数据包详细区 3.1.5 数据包字节区 ...

  7. VIM查找和替换字符串命令详解(持续更新中...)

    vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细节使用方法,可以实现复杂的功能,记录几种在此,方便以后查询.    :s/vivian/sky/ 替换当前行第一个 vivian ...

  8. STM32的定时器详解(嵌入式学习)

    STM32的定时器详解 0. 前言 1. Systick定时器 概念 工作原理 时钟基准 Systick练习 2. HAL_Delay函数分析 3. 定时器 基本概念 定时器分类 定时器组成 计数器 ...

  9. STM32 定时器详解

    STM32 定时器详解 吃了一个猛亏,自己理解花了大半天时间,结果一看代码发现巨简单 算了,把自己理解的放上来吧 目录 STM32 定时器详解 前言 一.定时器种类和区分 二.时钟源 三.计数过程 3 ...

最新文章

  1. Revit: Twinmotion工作流程学习
  2. UML学习总结(3)——StarUML指导手册
  3. c++中实现域内,左,右对齐的方法
  4. typescript 怎么表示当前时间减一个月_TypeScript类型元编程:实现8位数的算术运算...
  5. Flutter 页面托动按钮 DraggableFloatingActionButton
  6. python设计---空域增强之图片去噪(中值滤波、均值滤波、高斯滤波、双边滤波)
  7. memcpy与memmove的区别
  8. IEEE Spectrum:这些小机器人又好玩又实用,适合过年带回家
  9. EntityTransaction
  10. NYOJ1282部分和问题--DFS剪枝入门
  11. EasyUI美化界面项目系统(整合EasyUI_Insdep皮肤)
  12. t检验的显著性p值python_t检验中的t值和p值是什么关系_t检验和p值的关系
  13. ogg格式怎样才能转换成mp3
  14. 《供应链管理》—计划的三道防线
  15. 冒泡排序及其优化(三种优化)
  16. PDF Expert快捷键
  17. u盘中毒如何删除system volume information文件
  18. 【官宣】.NET 6 正式版来了
  19. 拼出爱心图案的c语言,抖音爱心图片拼图9格照片怎么弄 高格调拼图已被霸屏
  20. 2021水利水电安全员模拟考试案例题库及答案

热门文章

  1. Django Migrate和Makemigrations
  2. R语言绘图基础学习(一)
  3. Neutrino追问AMA第19期 | AlphaWallet CEO 张中南:Token化能为现有互联网从底层补足集成缺陷
  4. Q1.Numpy_数组、数组查询、转置和轴对换、读写文件
  5. 可知道我们十指交缠的那一夜;我们誓言到老的那一夜
  6. 2022年计算机行业报告:虚拟电厂,山雨欲来风满楼
  7. Python之多线程应用
  8. 大型文件远距离传输如何做到 ?
  9. 罐装自动化生产线控制系统设计(PLC课设)
  10. 修改XP开机画面最简单办法(图)