基于stm32f103c8t6的定时器详解(持续更新)
一、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的定时器详解(持续更新)相关推荐
- Android 各大厂面试题汇总与详解(持续更新)
介绍 目前网络中出现了好多各种面试题的汇总,有真实的也有虚假的,所以今年我将会汇总各大公司面试比较常见的问题,逐一进行解答.会一直集成,也会收集大家提供的面试题,如有错误,请大家指出,经过排查存在,会 ...
- ElasticSearch搜索引擎详解-持续更新中
ElasticSearch搜索引擎详解 1. ElasticSearch概述 1.1 elasticsearch是什么 1.2 全文搜索引擎 1.3 elasticsearch and solr 1. ...
- Win10C盘文件夹内容详解(持续更新,欢迎留言)
本文参考以下博客: Roaming和Local的区别 C:\Users[用户名]\AppData 1.Local和Roaming之间的区别:Local 比较大,非漫游应用数据.Roaming 一般是漫 ...
- php怎么配置configure,PHP编译参数configure配置详解(持续更新中)
编译参数-使用 ./configure -h 在源代码目录中,该命令可以查看所有编译参数以及对应的英文解释 编译参数-说明 --prefix=/opt/php //指定 php 安装目录 --with ...
- 智力题集锦与详解——持续更新
因为没有标准答案,需要思考,所以欢迎批评与探讨. 目录 一.数和数积 1.1 问题 1.2 分析 A,B不知 A知道(B不知)时知道了 B知道(A一开始不知且现在知道了)时知道了 如果为(2,2) 如 ...
- wireshark网络安全分析工具之万文多图详解(持续更新)
文章目录 1. 基本介绍 2. 下载与安装 3. 详细教程 3.1 软件界面介绍 3.1.1 菜单栏 3.1.2 工具栏 3.1.3 数据包列表区 3.1.4 数据包详细区 3.1.5 数据包字节区 ...
- VIM查找和替换字符串命令详解(持续更新中...)
vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细节使用方法,可以实现复杂的功能,记录几种在此,方便以后查询. :s/vivian/sky/ 替换当前行第一个 vivian ...
- STM32的定时器详解(嵌入式学习)
STM32的定时器详解 0. 前言 1. Systick定时器 概念 工作原理 时钟基准 Systick练习 2. HAL_Delay函数分析 3. 定时器 基本概念 定时器分类 定时器组成 计数器 ...
- STM32 定时器详解
STM32 定时器详解 吃了一个猛亏,自己理解花了大半天时间,结果一看代码发现巨简单 算了,把自己理解的放上来吧 目录 STM32 定时器详解 前言 一.定时器种类和区分 二.时钟源 三.计数过程 3 ...
最新文章
- Revit: Twinmotion工作流程学习
- UML学习总结(3)——StarUML指导手册
- c++中实现域内,左,右对齐的方法
- typescript 怎么表示当前时间减一个月_TypeScript类型元编程:实现8位数的算术运算...
- Flutter 页面托动按钮 DraggableFloatingActionButton
- python设计---空域增强之图片去噪(中值滤波、均值滤波、高斯滤波、双边滤波)
- memcpy与memmove的区别
- IEEE Spectrum:这些小机器人又好玩又实用,适合过年带回家
- EntityTransaction
- NYOJ1282部分和问题--DFS剪枝入门
- EasyUI美化界面项目系统(整合EasyUI_Insdep皮肤)
- t检验的显著性p值python_t检验中的t值和p值是什么关系_t检验和p值的关系
- ogg格式怎样才能转换成mp3
- 《供应链管理》—计划的三道防线
- 冒泡排序及其优化(三种优化)
- PDF Expert快捷键
- u盘中毒如何删除system volume information文件
- 【官宣】.NET 6 正式版来了
- 拼出爱心图案的c语言,抖音爱心图片拼图9格照片怎么弄 高格调拼图已被霸屏
- 2021水利水电安全员模拟考试案例题库及答案