STM32F103(六)——定时器中断

2023-11-04


参考资料:
《开发指南》P206,定时器中断实验
《参考手册》P253,通用定时器

1. 定时器基本原理

STM32F103ZE(精英版、战舰版)有8个16位的定时器,其中有4个通用定时器,2个高级定时器,2个基本定时器。

1.1 三种定时器的区别

具体区别如下图:

在这里插入图片描述
在实际编程中通常使用“通用定时器”。

1.2 通用定时器的主要特点

STM32F103的通用定时器是TIM2、TIM3、TIM4、TIM5.
▶位于低速APB1总线上(时钟可以来源于APB1的时钟)
▶16位向上、向下、中心对齐 的计数模式,自动装载计数器(TIMx_CNT)。
▶16位可实时修改的预分频器(TIMx_PSC),计数器时钟频率的分频系数位1~65535之间的任意数值。(分频之后计数器的时钟频率变小,因此可以计数更长的周期)
▶每一个定时器都有4个独立通道(TIMx_CH1~4),这些道路可以用来作为:
①输入捕获
②输出比较
③PWM生成
④单脉冲模式输出

1.3 通用定时器的3种计数器模式

通用定时器可以向上计数、向下计数、向上向下双向计数模式。
①向上计数模式:
计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
在这里插入图片描述
②向下计数模式:
计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
在这里插入图片描述
③中央对齐模式(向上/向下计数):
计数器从0开始计数到自动装入的值,产生一个计数器溢出事件;然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
在这里插入图片描述

1.4 通用定时器工作过程

在这里插入图片描述
▶图中红圈内是对定时器的时钟选择配置;
▶蓝色圈内是定时器作为计时器、定时的相关配置;
▶左下绿色区域是用来“输入捕获”,也就是测量脉冲的宽度;
▶右下黄色区域是输出比较寄存器,例如,比某个设定的值大时输出为1,比它小时输出为0,可用作PWM

1.5 定时器的内部时钟配置

定时器的时钟可来自内部时钟(CK_INT)

定时器时钟由内部时钟的来由过程:
在这里插入图片描述
在这里插入图片描述
✦首先由AHB的时钟经过APB1时钟的预分频系数产生ABP1的时钟,如果ABP1的预分频为1,那么定时器的时钟(CK_INT)为ABP1的时钟乘以1;如果ABP1的预分频不为1,则为ABP1乘以2。

✦又由于定时器的时钟选择来源于内部时钟,因此CK_PSC等于CK_INT;之后CK_PSC再除以PSC寄存器的值N(预分频系数)则得到计数器的时钟CK_CNT。

例如在默认情况下SYSCLK=72M;AHB时钟=72M;APB1时钟=36M;所以APB1的分频系数为2;因此通用定时器的时CK_INT=2*36M=72M,也就是说CK_PSC=72M,之后再除以PSC寄存器的值,就得到CK_CNT的频率。
实际上走的是这一条路线:
在这里插入图片描述

2. 定时器中断实验

实现用定时器控制led在500ms闪烁一次

2.1 常见库函数

▶定时器参数初始化:
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
第二个参数的结构体定义如下:

typedef struct
{
  uint16_t TIM_Prescaler;       初始化预分频系数
  uint16_t TIM_CounterMode;      计数模式
  uint16_t TIM_Period;          自动装载值
  uint16_t TIM_ClockDivision;     在输入捕获模式才用
  uint8_t TIM_RepetitionCounter;    在高级定时器才使用
} TIM_TimeBaseInitTypeDef;

▶定时器使能函数:
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
第一个参数是哪个定时器;第二个参数是ENABLE/DISABLE

▶定时器中断使能函数:
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
第一个参数是哪个定时器;第二个参数是中断源;第三个参数是ENABLE/DISABLE

▶状态标志位获取和清楚函数:
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

2.2 定时器中断具体实现步骤

  1. 使能定时器时钟
    RCC_APB1PeriphClockCmd();

实例中为:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  1. 初始化定时器,配置ARR(自动装载值),PSC (预分频系数)
    TIM_TimeBaseInt();

实例中为:

	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	
	TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; 向上计数模式 
	TIM_TimeBaseInitStruct.TIM_Period=arr;   自动装载值
	TIM_TimeBaseInitStruct.TIM_Prescaler=psc;   预分频系数
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct); 
  1. 开启定时器中断,配置NVIC(配置中断分组,中断优先级)
    void TIM_ITConfig();
    NVIC_Init();

实例中:

	NVIC_InitTypeDef NVIC_InitStruct;

	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);     使能定时器中断3
	
	NVIC_InitStruct.NVIC_IRQChannel=TIM3_IRQn;    选择初始化定时器中断3
	NVIC_InitStruct.NVIC_IRQChannelCmd=	ENABLE;    使能
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;   抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=3;     响应优先级
	NVIC_Init(&NVIC_InitStruct);              
  1. 使能定时器
    TIM_Cmd();

实例中:

TIM_Cmd(TIM3,ENABLE);
  1. 编写handler函数
    TIMx_IRQHandler();

实例中:

void TIM3_IRQHandler()
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
	{
		LED1=!LED1;
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
	}	
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F103(六)——定时器中断 的相关文章

  • sort函数自定义排序

    sort函数自定义排序 咳咳 自定义排序说实话用的地方还是很多的 像ACM里面 天梯赛里面 特别是天梯 必出这玩意 咳咳 水点字数 咱继续 首先哈 我们来看一下c 自带的排序 可以看出哈 默认是按升序排序的 sort不但可以对整型进行排序还
  • VTK交互器

    VTK交互器定义了用户了与VtkWidget界面的交互方式 结构图如下 交互器类名 功能 vtkInteractorStyle 一个实现大部分动作的基类 对交互只有接口 没有实际功能 vtkInteractorStyle3D 允许用户交互

随机推荐

  • 阿里云ECS服务器Linux第一次登录 提示Login Incorrect的解决方法

    问题情景 1 第一次购买ECS服务器 2 没有设置过系统root账户的Login密码 不是连接远程时提示需要输入的那个6位纯数字密码哈 3 在阿里云控制台中启动 远程连接 4 输入6位纯数字密码 首次连接会提示密码 后面不再提示 需要记下来
  • 小白就懂的IDEA中将本地的Jar包导入到Springboot(含若依)中

    在项目开发的过程中 难免会遇到在Springboot中无法通过pom中添加依赖使用maven下载需要的jar包 而本地PC端中我们拥有jar包 这时候该如何办呢 下面所采用的方法既不添加lib文件 就能搞定 1 打开IDEA开发软件 2 然
  • 『贪吃蛇』AI 算法简易实现(中秋特别版)

    前言 一年一度的中秋节就快到了 平台也有各种各样的中秋发文活动 正在翻阅时偶然间我看到了这篇文章 兔饼大作战 吃月饼 见月亮 还能咬自己 欢庆中秋特制版 掘金 juejin cn 大家肯定比较熟悉了 这个游戏的内核就是贪吃蛇 作者也是对玩法
  • G1理论基础与最佳实践

    文章目录 1 G1理论基础 1 1 G1介绍 1 2 YongGC 1 3 mixed gc 1 4 扩展 1 4 1 记忆集和卡表 1 4 2 STAB和TAMS 1 5 G1相比CMS的优势 2 G1日志解读与经验分享 2 1 日志解读
  • Win10专业版系统Docker安装、配置和使用详细教程

    一 win10专业版系统首先需要开启硬件虚拟化及Hyper V功能 才能进行Docker for Windows软件安装 如何开启硬件虚拟化 自行百度 可在任务栏中查看虚拟化是否开启 win10系统 打开控制面板 应用 程序和功能 开启Hy
  • postman——集合——执行集合——迭代运行集合

    网址 https learning getpostman com docs postman collection runs starting a collection run 开始收集运行 集合是一组请求 可以在对应的环境下作为一系列请求一
  • 前后端接口规范

    原文地址 https github com f2e journey treasure blob master api md 前后端接口规范 随着前后端分离越来越普遍 后端接口规范也就越来越重要了 一套良好的接口规范可以提升工作效率 减少沟通
  • Java-线程同步

    Java 线程同步 在Java中 我们通过同步机制 来解决线程的安全问题 实现线程安全的三种方法 1 同步代码块 synchronized 同步监视器 需要被同步的代码 说明 操作共享数据的代码 即为需要被同步的代码 gt 不能包含代码多了
  • 基于Python+Django的项目实战-信息安全领域中语义搜索引擎的设计与实现(附源码+论文)

    大家好 我是职场程序猿 感谢您阅读本文 欢迎一键三连哦 当前专栏 基于Python的毕业设计 精彩专栏推荐 微信小程序毕业设计 安卓app毕业设计 Java毕业设计 信息安全领域中语义搜索引擎的设计 django 演示 源码及论文下载地址
  • 前端复习HTML+CSS+JavaScript(必问面试题)

    前端复习 HTML 常见的几种图片格式以及他们之间的区别是什么 JPG 支持有损压缩 不支持透明 不支持动画 色彩还原度较好 PNG 不支持压缩 支持透明 半透明 不透明 不支持动画 GIF 支持有损压缩 不支持全透明 支持半透明 支持动画
  • Java 接入微信支付API V3 接口开发案例

    关于API v3 为了在保证支付安全的前提下 带给商户简单 一致且易用的开发体验 我们推出了全新的微信支付API v3 相较于之前的微信支付API 主要区别是 遵循统一的REST的设计风格 使用JSON作为数据交互的格式 不再使用XML 使
  • C02_02 Python笔记备份 变量

    author Liu Shao Ji encoding utf 8 字符串赋值到变量 再打变量打印出来 message Hello Python world print message 尝试在Hello world py中使用一个变量 在这
  • 如何在微信小程序中生成二维码:一个最简单的案例就让你明白

    使用weapp qrcode js 在 微信小程序 中 快速生成二维码 一 效果 二 具体步骤 代码 下载weapp qrcode代码 然后 将 dist 目录下的weapp qrcode esm js 复制到项目目录中 这里是utils目
  • 泰勒公式的展开细节解析(转载)

    转载自 https blog csdn net dog250 article details 76697167 上周写完了 三体 读后思考 泰勒展开 维度打击 黑暗森林 后收到一些邮件 进一步思考了关于泰勒展开的意义 也许我掌握的那些网络技
  • [4G&5G专题-5]:RRU 全面了解什么是4G+5G RF动态频谱共享?

    前言 建议在了解动态频谱DSS之前 前先了解 5G专题 4 RRU 全面了解什么是4G 5G RF静态射频共享 4G 5G专题 4 RRU 全面了解什么是4G 5G RF静态射频共享 文火冰糖的硅基工坊的博客 CSDN博客 rru设计原理与
  • 安卓在ecplise的问题

    Description Resource Path Location Type AndroidManifest xml file missing This is build issue Go to Menu in eclipse Proje
  • 【编程测试题】头条校招

    题目描述 头条的2017校招开始了 为了这次校招 我们组织了一个规模宏大的出题团队 每个出题人都出了一些有趣的题目 而我们现在想把这些题目组合成若干场考试出来 在选题之前 我们对题目进行了盲审 并定出了每道题的难度系统 一场考试包含3道开放
  • 用python实现简易控制台五子棋小游戏

    finish False 游戏是否结束 flagNum 1 当前下棋者标记 flagch 当前下棋者棋子 x 0 当前棋子的横坐标 y 0 当前棋子的纵坐标 print 033 1 37 41m 简易五子棋游戏 控制台版 033 0m 棋盘
  • python生成器的实现及原理

    1 迭代 一个接一个读取列表中的值 这个过程叫迭代 案例 mylist1 1 2 3 for v in mylist1 print v end print mylist2 x x for x in range 5 for v in myli
  • STM32F103(六)——定时器中断

    定时器原理与例程 1 定时器基本原理 1 1 三种定时器的区别 1 2 通用定时器的主要特点 1 3 通用定时器的3种计数器模式 1 4 通用定时器工作过程 1 5 定时器的内部时钟配置 2 定时器中断实验 2 1 常见库函数 2 2 定时