STM32F4X 定时器中断
STM32F4X 定时器中断
- 什么是定时器
- STM32F4X 定时器分类
- 有关定时器的概念
- 预分频(PSC)
- 自动重装载值(ARR)
- STM32F4X定时器例程
- 定时器相关函数
- 定时器例程
什么是定时器
定时器(Timer)最基本的功能就是定时,比如定时翻转LED灯,定时向串口发送数据等。除此之外,定时器还可以跟GPIO结合使用,利用定时器产生PWM波形,利用定时器捕捉电平信号等。本章先来讲解定时器的最基本的用法,定时功能。
STM32F4X 定时器分类
STM32F4X将定时器分成3类,分别是基本定时器,通用定时器和高级定时器,不同类型的定时器功能不同。下图是STM32F4X的定时器分类以及功能。本章会用基本定时器,也就是TIM6或者TIM7来进行讲解。
有关定时器的概念
预分频(PSC)
定时器想要工作,首先要用时钟,时钟的作用是给定时器一个时基,让定时器按照这个时基单元进行计数。在STM32F4中,定时器是的时钟源是APB时钟。比如APB的时钟是84MHz,那么定时器的时钟就是84MHz。而预分频的作用是对定时器的时钟源进一步细分,得到用户想要的时钟频率。比如用户觉得84MHz的时钟频率太高了,想得到一个42MHz的频率,就可以往定时器的预分频寄存器里面写1(注意:定时器的预分频寄存器会将预分频系数自动加1),就会得到42MHz的频率。
要注意的时定时器的时钟源会根据硬件自动选择,具体如下图所示。
高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线。
通用定时器timer2 ~ timer5,通用定时器timer12 ~ timer14以及基本定时器timer6,timer7的时钟来源是APB1总线。
自动重装载值(ARR)
上面的预分频寄存器设置了定时器的计数频率,那么用户要怎样才能得到想要的定时值呢,这就需要自动重装载值寄存器了。自动重装载寄存器的作用是设置定时器的溢出值,当定时器计数超过自动重装载值寄存器里面值的时候,就会产生一个溢出中断。下面举个例子说明一下。
比如现在需要一个500ms的定时器,APB时钟是84MHz,我们可以这样设置。
预分频系数设置为8399,即定时器的计数频率为84Mhz / 8400 = 10KHZ,定时器每隔10KHz计一次数,也就是0.1ms记一次数,想要得到500ms的定时时间,只需要往自动重装载值寄存器里面写4999即可,也就是0.1*5000 = 500ms。
定时器的计算公式如下:
Tout = (1 / (Tclk / (psc + 1))) * (arr + 1)
Tout:定时器溢出值
Tclk:定时器时钟频率
psc:定时器预分频值
arr:自动重装载值
STM32F4X定时器例程
定时器相关函数
/*
定时器初始化函数
TIMx:定时器索引
TIM_TimeBaseInitStruct:定时器初始化结构体
*/
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)/*
定时器中断使能函数
TIMx:定时器索引
TIM_IT:定时器中断类型
NewState:定时使能
*/
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)/*
定时器获取中断状态函数
TIMx:定时器索引
TIM_IT:定时器中断类型
返回值:定时器中断状态
*/
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)/*
定时器清除中断状态函数
TIMx:定时器索引
TIM_IT:定时器中断类型
*/
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)
定时器例程
该例程是使用定时器7产生一个500ms的中断
#include "timer.h"void bsp_timer_init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;NVIC_InitTypeDef NVIC_InitStruct;RCC_ClocksTypeDef RCC_Clocks;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7,ENABLE); // 使能定时器7时钟TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式TIM_TimeBaseInitStruct.TIM_Period = 4999; // 重装值为5000 500ms中断一次TIM_TimeBaseInitStruct.TIM_Prescaler = 8399; // 预分配值为8400 即84000000/8400 = 10KHZ 0.1ms计一次书TIM_TimeBaseInit(TIM7,&TIM_TimeBaseInitStruct); // 初始化定时器7NVIC_InitStruct.NVIC_IRQChannel = TIM7_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;NVIC_Init(&NVIC_InitStruct); // 配置定时器7 NVIC中断TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE); // 使能更新中断TIM_Cmd(TIM7,ENABLE); // 使能定时器7}void TIM7_IRQHandler(void)
{if(TIM_GetFlagStatus(TIM7,TIM_IT_Update) == SET) // 判断是否为定时器7更新中断{printf("%s\r\n",__func__);TIM_ClearITPendingBit(TIM7,TIM_IT_Update); // 清除定时器7更新中断}}
打开Xcom串口助手,勾选时间戳功能,可以看到串口每隔500ms就进入中断并打印信息。
相关文章:

STM32F4X 定时器中断
STM32F4X 定时器中断 什么是定时器STM32F4X 定时器分类有关定时器的概念预分频(PSC)自动重装载值(ARR) STM32F4X定时器例程定时器相关函数定时器例程 什么是定时器 定时器(Timer)最基本的功能就是定时,比如定时翻转LED灯,定时向串口发送数据等。除此之外…...
MongoDB +Dataframe+excel透视表
读取MongoDB中的表 from pymongo import MongoClient import pandas as pd client MongoClient(IP地址, 27017)db client[AOI] collection db[表名] #替换为实际的名称 document collection.find({time:{$gte:2023-08-15 15:26:06}})#筛选数据 df pd.DataFrame(list(docu…...
PostgreSQL日期相关
PostgreSQL日期相关 PostgreSQL日期相减得到整数 PostgreSQL日期相减得到整数 天数相减得到整数,执行下面的SQL: select to_number(date_trunc(day,2023-08-18 00:00:00::TIMESTAMP - 2023-08-10 00:00:00::TIMESTAMP INTERVAL 1 day)::text, 9999999…...
C++编程法则365天一天一条(8)const_cast去除cv限定
文章目录 1、使用场景2、关于const_cast的陷阱3、总结const_cast主要用于去除cv限定,且在C++提供的4个类型转换运算符里,只有const_cast可以去除或者添加cv属性。 1、使用场景 用法如下: const_cast< target-type >( expression ) 两个可能是多级指针且指向相同类型…...

某网站DES加密逆向分析实战
文章目录 一、抓包分析二、加密分析一、重写加密 一、抓包分析 分析站点: aHR0cDovL2VpcC5jaGFuZmluZS5jb20v 首先我们提交一下登陆信息: 搜索j_password查看加密函数: 把上图搜索到的encryptPassword函数拿出来分析一下: function encryptP…...

面向对象的理解
想要对象了?没问题,new一个就好了。 但是,new太多对象,对象也会生气的哦。 你瞧,她来了 从两段代码发现端倪 我们来计算一个矩形的面积,看看这两段代码有什么区别呢? 第一段: con…...
java ssl加密发送邮件
通过25端口发送邮件不安全,改为ssl加密方式发送邮件,比较常见的2中实现类发送邮件如下所示。 1、JavaMailSenderImpl 类 使用该实现类发送邮件,ssl加密使用端口号为465,借助Properties类设置ssl的各种配置。 SysUserEntity user…...
SpringBoot-yml配置文件的使用与优势
目录 一、什么是yml配置文件? 二、如何在SpringBoot中使用yml配置文件? 三、如何在SpringBoot中注入yml配置文件的属性? Value注解 ConfigurationProperties注解 四、yml配置文件与properties配置文件的区别和优势 区别 优势 五、总结…...

Layer Normalization(层规范化)
详细内容在这篇论文:Layer Normalization 训练深度神经网络需要大量的计算,减少计算时间的一个有效方法是规范化神经元的活动,例如批量规范化BN(batch normalization)技术,然而,批量规范化对小批…...
redisson参数配置
文章目录 pom配置链接配置建议 pom <!-- 引入spring-data-redis组件 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><!-- 因springboot2.x…...

【基于Arduino的仿生蚂蚁机器人】
【基于Arduino的仿生蚂蚁机器人】 1. 概述2. Arduino六足位移台–蚂蚁机器人3D模型3. 3D 打印零件4. 组装Arduino六足位移台5. Arduino蚂蚁机器人电路图6. 为Arduino Hexapod设计PCB7. 组装电路板8. 系统代码9. Arduino蚂蚁机器人安卓应用程序在本教程中,我将向您展示如何构建…...
angular12里面FormGroup做多个项目的相关check
FromFroup在鼠标失去焦点时做相关check,可以在group方法第二个参数的位置加一个对象参数 { validator: this.checkPasswords } 在Angular 12中,可以使用formGroup来进行两个密码是否一致的检查。以下是一个示例: 首先,在组件的…...
TypeScript 的发展与基本语法
目录 一、为什么什么是TypeScript? 1、发展历史 2、typescript与javascript 3、静态类型的好处 二、基础语法 1、基础数据类型 2、补充类型 3、泛型 4、泛型的高级语法 5、类型别名&类型断言 6、字符串/数字 字面量 三、高级类型 1、联合/交叉类型…...
macOS - 上编译运行 risc-v (spike)
文章目录 一、说明二、安装步骤三、测试 一、说明 本文根据以下文章改编: RISC-V 环境配置 https://decaf-lang.github.io/minidecaf-tutorial/docs/step0/riscv_env.html 相关链接: riscv-gnu-toolchain GNU toolchain for RISC-V, including GCC ht…...

Linux--线程地址空间
1.程序地址空间 先来就看这张图 这是一张程序地址分布的图,通过一段代码来证明地址空间的分布情况 编译结果: 可以看出的是,父子进程中对于同一个变量打印的地址是一样的,这是因为子进程以父进程为模板,因为都没有对数…...

华为OD机试 - 最佳植树距离 - 二分查找(Java 2023 B卷 100分)
目录 一、题目描述二、输入描述三、输出描述四、备注说明五、二分查找六、解题思路七、Java算法源码八、效果展示1、输入2、输出3、说明 一、题目描述 按照环保公司要求,小明需要在沙化严重的地区进行植树防沙工作,初步目标是种植一条直线的树带。 由于…...

RNN+LSTM正弦sin信号预测 完整代码数据视频教程
视频讲解:RNN+LSTM正弦sin信号预测_哔哩哔哩_bilibili 效果演示: 数据展示: 完整代码: import torch import torch.nn as nn import torch.optim as optim import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.preprocessing import…...
如何自己实现一个丝滑的流程图绘制工具(四)bpmn-js开启只读状态
背景 流程图需要支持只读状态和编辑状态 翻看官方案例源码,扒拉到了禁用的js代码 DisableModeling.js const TOGGLE_MODE_EVENT toggleMode const HIGH_PRIORITY 10001export default function DisableModeling(eventBus,contextPad,dragging,directEditing,e…...

字节跳动 Git 的正确使用姿势与最佳实践
版本控制Git 黑马&尚硅谷 Git的前世今生 方向介绍 为什么要学习Git 1.0 Git是什么 1.1 版本控制 1.1.1 本地版本控制 1.1.2 集中版本控制 1.1.3 分布式版本控制 我们已经把三个不同的版本控制系统介绍完了,Git 作为分布式版本控制工具, 虽然目前来讲…...

龙迅LT7911UX TYPE-C/DP转MIPI/LVDS,内有HDCP
1. 描述 LT7911UX是一种高性能的Type-C/DP1.4a到MIPI或LVDS芯片。HDCP RX作为HDCP中继器的上游端,可以与其他芯片的HDCP TX协同工作,实现中继器的功能。 对于DP1.4a输入,LT7911UX可以配置为1/2/4车道。自适应均衡使其适用于长电缆应用&#…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...