2_stm32定时中断点灯

news2025/4/7 3:38:34

       定时器是个好东西啊~

       之前搞上层应用时,通过定时器可以以某种频率刷新状态,stm32定时器的一种功能就是如此。此外,stm32的定时器还有很多其他功能,如PWM输出等。定时器具体再细分可以分为高级控制定时器、通用定时器、基本定时器等。

1、定时时间的计算

       基本定时器只具备基本的定时功能,也就是在时钟源的驱动下,从0开始累加脉冲计数,直到超过预定值,然后触发中断或者触发DMA请求。基本定时器和通用定时器的时钟源都是TIMxCLK,TIMxCLK在时钟树中的位置如下:

adc586b6e1209c92b500aff90cd7b63a.png

当APB1的预分频系数为1时,则TIMxCLK就是APB1的频率(也等于AHB的频率);而当APB1的预分频系数不为1时,则TIMxCLK就是APB1的频率的2倍。比如在常见的配置中,AHB=168Mhz,而APB1二分频为84Mhz,那么TIMxCLK就为84Mhz*2=168Mhz。

TIMxCLK的脉冲还会再经过一道分频,然后被TIMx_CNT寄存器累加计数。这个分频器叫做PSC预分频器。PSC预分频器可以设置为任意16位值。当TIMx_CNT的值等于TIMx_ARR寄存器中的值时,产生溢出事件,可用于触发中断。    

根据定时器时钟的频率,比如时钟的频率是168MHZ,可以理解为一秒钟STM32会自己数168M次,预分频系数就是将频率分割,比如分频系数是168,则该时钟的频率会变成168MHZ/168=1MHZ,但是在设置的时候要注意,数值应该是168-1。假定分频系数是168-1,那么频率变成1MHZ,也就意味着STM32在一秒钟会数1M次,即1us数一次。

       接下来就是确定预装载值,比如需要定时1ms,由于1ms=1us*1000,那么预装载值就是1000-1;如此类推,在预分频系数确定的情况下,定时的时长就由预装载值确定了。

       定时1秒设置实例:

//168M/16800=10000Hz
TIM_Prescaler         = 16800-1;
//0.0001s*10000 = 1s
TIM_Period            = 10000-1;

2、定时器与中断的配置

//20240801
void TIM3_Conf(void)
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  //168M/16800=10000Hz    
  TIM_TimeBaseStructure.TIM_Prescaler         = 16800-1;
  TIM_TimeBaseStructure.TIM_Period            = 10000-1;
  TIM_TimeBaseStructure.TIM_CounterMode       = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_ClockDivision     = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
      
  TIM_ARRPreloadConfig(TIM3,ENABLE);
  TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
  TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
  TIM_Cmd(TIM3,ENABLE);
}       


void NVIC_Conf()
{
  NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
  NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;    
  NVIC_Init(&NVIC_InitStructure);
}


void TIM3_IRQHandler(void)
{
  TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
  GPIO_WriteBit(GPIOC,GPIO_Pin_9,g_led_state);
  g_led_state = !g_led_state;
}

       主函数调用:

GPIO_Conf();
TIM3_Conf();
NVIC_Conf();


while(1)
{             
     Delay(10000);
}

       效果如下:

1eb092b2e8143266f4b0568e5edc7b4f.gif

欢迎关注:

a52d78eb1d53de4748f372b9f9baf9d3.png

https://zhou-yuxin.github.io/articles/2016/STM32%E5%AE%9A%E6%97%B6%E5%99%A8%E7%9A%84%E4%BD%BF%E7%94%A8%EF%BC%88%E5%AE%9A%E6%97%B6%E5%99%A8%E4%B8%AD%E6%96%AD%E3%80%81PWM%E8%BE%93%E5%87%BA%E5%92%8C%E8%B7%B3%E5%8F%98%E6%8D%95%E8%8E%B7%E3%80%81%E4%B8%BB%E4%BB%8E%E6%A8%A1%E5%BC%8F%EF%BC%89/index.html

https://blog.csdn.net/ZIIllIIll/article/details/118117534

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

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

相关文章

stm32应用、项目、调试

主要记录实际使用中的一些注意点。 1.LCD1602 电路图: 看手册:电源和背光可以使用5v或者3.3v,数据和控制引脚直接和单片机引脚连接即可。 单片机型号:stm32c031c6t6 可以直接使用推完输出连接D0--D7,RS,EN,RW引脚,3…

uni-app可替换radio-group的控件uni-segmented-control(十九)

【前言】 以前写过一篇对radio-group中的元素进行分列展示的文章,有兴趣的朋友可以看以下uni-app将radio-group元素分列展示(七):专栏管理-CSDN创作中心https://mp.csdn.net/mp_blog/manage/column/columnManage/12711831当时主要是因为radio-group中的元素过多,如果利用手…

600道大模型面试题,看完它手撕面试官,非常详细收藏我这一篇就够了

大模型面试题及答案 什么是大模型? 答: 大模型通常指的是那些拥有大量参数(例如数十亿甚至更多)的人工智能模型,这些模型经过大规模数据集的训练,能够处理复杂的任务。大模型的一个重要特点是它们往往能够捕…

977. 有序数组的平方(双指针)

目录 一题目: 二:代码: 三:结果: 一题目: 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 二:代码: class Solution…

汽车动态:小米汽车对开门车型热议:技术储备与量产计划的辨析

小米汽车,作为科技巨头小米集团进军汽车行业的新尝试,自宣布以来就备受市场关注。近日,有关小米汽车是否会推出对开门车型的问题引起了广泛讨论。小米汽车对此作出回应,明确表示技术储备并不直接代表一定会进行量产。 首先&#…

【Material-UI】按钮与第三方路由库的集成详解

文章目录 一、ButtonBase 组件简介二、与第三方路由库的集成1. React Router示例代码 2. Next.js示例代码 三、客户端导航的优势四、其他自定义集成1. 使用自定义组件示例代码 五、总结 在现代前端开发中,单页应用(SPA)变得越来越普遍。这种应…

Vision Pro使用GLFT 加载模型shader错误解决办法

Glft shader在vision pro上加载错误 前言相关背景解决办法 参考文章 前言 之前在Vision Pro上尝试加载Glb文件,但是加载完成后发现加载出来的Glb文件材质不正确。材质是黑色的。因此整理一下解决方案。 相关背景 使用Unity开发,Glb的加载插件为gltf F…

SQL二次注入

目录 1.什么是二次注入? 2.二次注入过程 2.1寻找注入点 2.2注册admin#用户 2.3修改密码 1.什么是二次注入? 当用户提交的恶意数据被存入数据库后,因为被过滤函数过滤掉了,所以无法生效,但应用程序在从数据库中拿…

动手学深度学习V2每日笔记(深度卷积神经网络AlexNet)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1h54y1L7oe/spm_id_from333.788.recommend_more_video.0&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不太理解的内容进行笔记记录&…

COCO格式json转yolo唯一官方指定转换方法

自带转换程序,谁还在那自己写呢? https://docs.ultralytics.com/reference/data/converter/?hconvert_coco#ultralytics.data.converter.convert_coco """ 这个脚本用于将coco数据集格式转换为yolo数据集格式 """ from …

【最新版】Windows10纯净专业版下载:无捆绑软件!

今天系统之家小编给大家带来2024年最新的Windows10纯净专业版系统,经过精心地优化,确保系统无捆绑软件,系统资源占用少,是非常干净的专业版系统,且兼容性强,配置不高的老电脑也适合安装,安装后运…

linux 查看一个端口是否被占用

1 linux命令 要在Linux中查看一个端口是否被占用,可以按照以下步骤进行操作: 打开终端(Terminal)。 运行以下命令来列出系统上所有正在监听的端口及其对应的进程: sudo netstat -tuln | grep LISTEN这将显示所有正在…

【LeetCode每日一题】2024年8月第二周(上)

2024.8.5 困难 链接:600. 不含连续1的非负整数 (1)题目描述: (2)示例 (3)分析 思路1: 题目要求的数值,是将数二进制转换后,不存在连续的1&#x…

python 爬取 ip 代理网站 获取ip代理池

爬取的网站:免费私密代理IP_IP代理_HTTP代理 - 快代理 示例代码: import jsonimport requests import time,reclass daili:# 1.发送请求,获取响应def send_request(self, page):print("正在抓取第{}页".format(page))# 目标网页&…

设计模式19-状态模式

设计模式19-状态模式(State Pattern) 写在前面状态变化模式 动机定义与结构定义结构 C代码推导优缺点应用总结 写在前面 状态变化模式 在组建构建过程中,某些对象的状态经常面临着变化。如何对这些变化进行有效的管理呢?同时又w…

特征向量可视化方法介绍

在最近的研究中,实验需要结合可视化进行解释分析,于是大致上了解了下目前一些特征可视化的工具,主要分为四种类型:热力图、散点图、线性图和雷达图,并将相应的基础绘制方法做一个简单的总结。 1 热力图(Hea…

向量检索的3种方式

本文介绍向量检索服务如何通过控制台、SDK、API三种不同的方式检索向量。 控制台方式 登录向量检索服务控制台。 在左侧导航栏单击Cluster列表,选中需要检索向量的Collection,单击Collection详情。 在左侧二级导航栏,单击相似向量搜索&…

Leetcode - 136双周赛

目录 一,3238. 求出胜利玩家的数目 二,3239. 最少翻转次数使二进制矩阵回文 I 三,3240. 最少翻转次数使二进制矩阵回文 II 四,3241. 标记所有节点需要的时间 一,3238. 求出胜利玩家的数目 本题直接暴力求解&#x…

springboot招聘管理系统-计算机毕业设计源码26241

摘 要 随着企业的发展和竞争的加剧,人才招聘成为企业人力资源管理中的重要环节。为了提高招聘效率、降低招聘成本,同时提升招聘过程的透明度和公平性,设计并实现一款基于 SpringBoot 的招聘管理系统具有重要的现实意义。 本系统旨在提供一个全…

【MySQL】MySQL常见命令大全

目录 前言一、DQL二 、DML(数据操作语言)部分2.1 插入数据:2.2 更新数据:2.3 删除数据:2.4 创建 create 三、修改 alter四、删除 drop五、表的复制六、常见数据类型 前言 大家好,不知道前面的20题大家写的怎么样,前面分享的20题是…