STM32(TIM定时器中断)

 理论知识

 

 

定时器定时中断

接线图

定时器工作配置步骤

 定时中断和内外时钟源选择

 

 

 

 定时器中需要使用的函数

程序实现效果:

void TIM_DeInit(TIM_TypeDef* TIMx); **// 恢复定时器的缺省配置**void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct); // 时基单元初始化配置时基单元------>第一个参数表示的是选择某个定时器,第二个结构体包含配置时基单元的一些参数**void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);**// 给结构体变量赋一个默认的值**void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState); **// 使能计数器,第一个参数表示选择计数器,第二个参数表示新的状态,也就是使能还是失能**void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState); **// 使能中断输出信号,中断输出控制,参数第一个为选择定时器,第二个选择要配置哪一个中断输出,第三个新的状态表示使能还是失能**以下的6个函数分别对应时基单元的时钟选择部分,可以选择RCC内部时钟,ETR外部时钟,TRX,其它定时器,TIX捕获通道,void TIM_InternalClockConfig(TIM_TypeDef* TIMx); **// 选择内部时钟**
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource); **// 选择其它定时器的时钟,第一个参数表示要配置的定时器,第二个参数为选择要接入那个其它的定时器**
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,uint16_t TIM_ICPolarity, uint16_t ICFilter);**// 选择TIX捕获通道的时钟,选择需要配置的定时器,第二个参数选择TIX具体需要配置的引脚,最后的两个参数表示的是输入的级性和滤波器**
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);**//选择ETR通过外部模式1输入的函数,第一个参数表示外部触发预蜂鸣器,级性和滤**波器void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);// 选择ETR通过外部时钟模式2输入的时钟,第一个参数和上面的一个函数是一样的
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,uint16_t ExtTRGFilter);// 这个函数是用于单独配置ETR引脚的预分频器,极性,滤波器这些参数void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);//void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);uint16_t TIM_GetCounter(TIM_TypeDef* TIMx); // 获取当前计数器的值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx); //获取当前预分频器的值// 以下的4个函数是用来获取标志位和清除标志位的函数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);

定时器配置

#include "stm32f10x.h"                  // Device header/*定时器中断的初始化代码
*/
void Timer_Init(void)
{// 开启时钟,这里TIM2是通用寄存器RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);// 选择时基单元的时钟,选择内部时钟的模式,定时器默认使用的是内部单元的时钟TIM_InternalClockConfig(TIM2);// 配置时基单元,初始化结构体TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;// 将结构体成员都引用出来放置在这个位置TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;    // 配置参数是否分屏TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up; // 选择计数的模式选择向上计数TIM_TimeBaseInitStructure.TIM_Period = 10000 -1;               // 表示ARR自动重装器的值,这两个参数的取值都要在0-65535之间TIM_TimeBaseInitStructure.TIM_Prescaler = 7200-1;              // PSC预分频器的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;           // 重复计数器的值// 初始化结构体并将结构体的地址放置在init函数中TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);// TIM_ClearFlag(TIM2,TIM_FLAG_Update);手动清除更新中断标志位避免刚初始化玩就进中断标志位的问题TIM_ClearFlag(TIM2,TIM_FLAG_Update);// 选择中断模式为更新中断,配置使能,开启更新中断到nvic的通路TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);// 配置nvic,配置nvic优先级分组,选择分组2的方式NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//初始化nvic的结构体 NVIC_InitTypeDef NVIC_InitStruct;// 配置nvic结构体模式NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;           // 表示中断通道,表示定时器2在nvic中的通道NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;           // 编写为使能ENABLENVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2; // 抢占式优先级NVIC_InitStruct.NVIC_IRQChannelSubPriority =1 ;        // 响应式优先级NVIC_Init(&NVIC_InitStruct);// 启动定时器TIM_Cmd(TIM2, ENABLE);}
/*// 编写定时器2的初始化函数
void TIM2_IRQHandler(void){// 当定时器产生更新中断时这个函数会被执行TIM_GetITStatusif(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET){     // 判断中断标志位,如果中断的标志位等于SET就执行用户代码// 清除中断标志位TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}}
*/

定时器头文件

主函数文件

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"uint16_t Num;int main(void)
{// 初始化oledOLED_Init();// 初始化定时器Timer_Init();// 使用OLED显示字符串OLED_ShowString(1,1,"Num:");while (1){OLED_ShowNum(1, 5, Num, 5);OLED_ShowNum(2, 5, TIM_GetCounter(TIM2), 5);}
}
void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){Num++;TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}

接线图2:

 第二个程序效果展示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/750265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】每日一题 228 汇总区间

给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b] 应该按…

SeAndroid 安全策略机制

seAndroid 是 Android 系统中 SELinux(Security-Enhanced Linux)的实现,它为 Android 提供了强制访问控制(MAC)机制。在 seAndroid 中,策略规则定义了不同进程和文件之间的交互方式,以确保系统的…

数据可视化-ECharts Html项目实战(2)

在之前的文章中,我们学习了如何创建简单的折线图,条形图,柱形图并实现动态触发,最大最小平均值。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下…

波奇学Linux:线程安全和自选锁和读写锁

STL不是线程安全的 单例模式的线程安全 自选锁:当线程申请锁失败时,不是挂起,而是一直申请 挂起等待锁 :当线程申请锁失败时,把锁挂起 一般临界区时间短的适合自选锁,长的适合挂起等待锁

Unity的AssetBundle资源运行内存管理的再次深入思考

大家好,我是阿赵。   这篇文章我想写了很久,是关于Unity项目使用AssetBundle加载资源时的内存管理的。这篇文章不会分享代码,只是分享思路,思路不一定正确,欢迎讨论。   对于Unity引擎的资源内存管理,我…

Visual Studio项目模板的创建与使用

Visual Studio项目模板的创建、使用、删除 创建模板项目模板的使用模板的删除 创建模板 点击项目,点击导出模板 选择你要创建哪个项目的项目模板,点击下一步 输入你的模板名称并添加模板说明,方便记忆 项目模板的使用 点击创建新项目 输入刚刚…

[长城杯 2021 院校组]funny_js

[长城杯 2021 院校组]funny_js 审题 根据题名提示为js,再在ida中查看,基本可以确定为quickjs题 QuickJS 是一个快速、灵活且易于嵌入的 JavaScript 引擎,适用于需要在资源受限环境下运行 JavaScript 代码的场景。 工具准备 来到Linux&…

Qt QTableWidget 实现行选中及行悬浮高亮

表格整行的 selected、hover 高亮需求很常见,但使用 Qt 提供的开箱即用的方法根本无法实现这个需求(至少在当前的时间节点是不行的);想要实现这个效果必须要费一点点力气,我们尽量选择较为简单的方法。 话不多说&…

高可用系统有哪些设计原则

1.降级 主动降级:开关推送 被动降级:超时降级 异常降级 失败率 熔断保护 多级降级2.限流 nginx的limit模块 gateway redisLua 业务层限流 本地限流 gua 分布式限流 sentinel 3.弹性计算 弹性伸缩—K8Sdocker 主链路压力过大的时候可以将非主链路的机器给…

Linux rhmask命令教程:管理Red Hat系统中的掩码(附案例详解和注意事项)

Linux rhmask命令介绍 rhmask是一个用于管理Red Hat系统中的掩码的命令。它可以帮助用户查看、设置和删除系统中的掩码。掩码是一种用于控制文件权限的机制,通过设置掩码,用户可以控制新创建的文件或目录的默认权限。 Linux rhmask命令适用的Linux版本…

python内置函数 C

python内置函数 C Python 解释器内置了很多函数和类型,任何时候都能使用。 C 名称描述callable检查一个对象是否是可调用的。chr将整数(表示Unicode码点)转换为对应的字符。classmethod将一个方法转变为类方法。compile将源代码字符串编译…

Task-balanced distillation for object detection用于

Task-balanced distillation for object detection用于目标检测的任务平衡蒸馏 摘要 主流的目标检测器通常由分类和回归两个子任务组成,由两个并行头部实现。这种经典的设计范式不可避免的导致分类得分和定位质量(IOU)之间的空间分布不一致…

【CTF web1】

CTF web 一、CTF web -PHP弱类型1、是否相等?2、转换规则: 二、CTF web -md5绕过1、若类型比较绕过2、null绕过3、碰撞绕过 三、习题 一、CTF web -PHP弱类型 1、是否相等? :在进行比较的时候,会先判断两种字符串的类型是否相等&…

深入探讨GPT系列与其他NLP架构的流行度差异及其应用解析

Transformer问答-1 为什么现在GPT系列的decoder-only那么流行,而其它两者:encoder-only和encoder-decoder架构不流行了呢? GPT系列(特别是从GPT-3开始)的流行并不意味着encoder-only或encoder-decoder架构不再流行或不再重要。事实上&…

2024.3.13-408学习笔记-C-数据在内存中的存储

1、整数型存储 整数型存储就是所有整型家族里的数据类型的存储方式,也就是说包含了字符类型的存储(因为字符的操作符的返回值是ASCII码值,故实际上存储的是整数)。 1.1、有符号整数 有符号整数包含char,short&#…

切面条-蓝桥杯?-Lua 中文代码解题第1题

切面条-蓝桥杯?-Lua 中文代码解题第1题 一根高筋拉面,中间切一刀,可以得到2根面条。 如果先对折1次,中间切一刀,可以得到3根面条。 如果连续对折2次,中间切一刀,可以得到5根面条。 那么&#xf…

【ollama】(7):使用Nvidia Jetson Nano设备,成功运行ollama,运行qwen:0.5b-chat,速度还可以,可以做创新项目了

1,视频地址 https://www.bilibili.com/video/BV1Pj421o7W5/ 【ollama】(7):使用Nvidia Jetson Nano设备,成功运行ollama,运行qwen:0.5b-chat,速度还可以,可以做创新项目了 2&#x…

vuex购物车案例

store/index.js // 导入vue import Vue from vue // 导入vuex import Vuex from vueximport cart from ./module/cartVue.use(Vuex)// 创建仓库store const store new Vuex.Store({strict: true,modules: {cart} })// 导出仓库 export default storestore/modules/cart impo…

Rust的async和await支持多线程运行吗?

Rust的async和await的异步机制并不是仅在单线程下实现的,它们可以在多线程环境中工作,从而利用多核CPU的并行计算优势。然而,异步编程的主要目标之一是避免不必要的线程切换开销,因此,在单线程上下文中,asy…

【Java】容器|Set、List、Map及常用API

目录 一、概述 二、List 1、List的常用API 2、ArrayList 3、List遍历 三、Set 1、Set的常用方法: 2、HashSet 3、遍历集合: 四、Map 1、Map常用API 2、HashMap 3、遍历Map 五、迭代器 一、概述 在Java中所有的容器都属于Collection接口下的内容 1…