【STM32入门学习】定时器与PWM的LED控制
目录
一、定时器与PWM介绍
1.1定时器
1.1.1定时器分类简介
1.1.2STM32定时器分类比较表
1.1.3定时器启动操作:
1.2 PWM
1.2.1 简介:
1.2.2PWM工作原理
1.2.3使用步骤:
二、定时器计数控制LED灯亮灭
2.1HAL库
2.1.1使用HAL库创建程序(熟悉HAL库使用)
编辑
2.1.2计算定时器溢出时间
2.2烧录结果:
三、PWM驱动LED呼吸灯
3.1HAL库点灯
3.2烧录结果:
四、总结
一、定时器与PWM介绍
1.1定时器
1.1.1定时器分类简介
STM32定时器种类多,功能强大,这些定时器完全独立、互不干扰,可以同步操作。

1.SysTick定时器
SysTick系统时钟位于Cortex-M3内核,是一个24位的递减计数器,主要用于:精确延时,在多任务操作系统中为系统提供时间基准(时基);任务切换,为每个任务分配时间片。
2.WatchDog看门狗
作用:当微控制器受到外部干扰或程序中出现不可预知的逻辑故障导致应用程序脱离正常的执行流程时(俗称程序跑飞),在一定的时间间隔内使系统复位,回到初始状态;
看门狗设计是用来监视MCU程序运行状态的,是确保系统可靠稳定运行的一种有效措施。

1.1.2STM32定时器分类比较表
| 定时器 | 基本定时器 (TIM6、TIM7) | 通用定时器 TIMx(x=2~5) | 高级定时器 (TIM1、TIM8) |
| 计数器类型 | 16位,向上 | 16位, 向上、 向下、 向上/向下 | 16位, 向上、 向下、 向上/向下 |
| 预分频系数 | 1~65535 之间的任意数 | 1~65535 之间的任意数 | 1~65535 之间的任意数 |
| 输入/捕获通道 | 无 | 四个独立通道:输入捕获、输出比较、 PWM生成、单脉冲模式输出 | |
| 产生中断/DMA | 可以 | 可以 | 可以 |
| 刹车(电机控制) | 无 | 无 | 可以 |
1通用定时器:
TIM2、TIM3、TIM4、TIM5为STM32的4个独立的16位通用定时器,具有定时、测量输入信号的脉冲长度(输入捕获)、输出所需波形(输出比较、产生PWM、单脉冲输出等)等功能。

2.基本定时器:
STM32有2个基本定时器TIM6和TIM7,可用作:通用的16位计数器、产生DAC触发信号基本定时器的计数模式只有向上计数模式。

3.高级定时器
高级定时器相比基本定时器、通用定时器,功能更为强大
1.1.3定时器启动操作:
操作步骤:
1.时钟配置:配置定时器使用的时钟源和时钟分频器,确保定时器的工作频率符合应用需求。
2.定时器初始化:选择并初始化所需的定时器模块,设置计数模式、PWM模式、计数方向等。
3.定时器功能配置:根据应用需求配置定时器的比较器、捕获/比较通道、PWM输出等功能。
4.中断或DMA配置:如有需要,配置定时器的中断或DMA,以便在特定事件发生时执行相应的处理程序或数据传输操作。
5.启动定时器:启动定时器开始计数或PWM输出,监控定时器的状态并根据应用需要调整参数。
1.2 PWM
1.2.1 简介:
PWM(Pulse Width Modulation,脉冲宽度调制)是一种利用脉冲宽度即占空比实现对模拟信号进行控制的技术,即是对模拟信号电平进行数字表示的方法。
广泛应用于电力电子技术中,比如PWM控制技术在逆变电路中的应用; PWM还应用于直流电机调速,如变频空调的交直流变频调速,除实现调速外,还具有节能等特性。

周期为10ms(频率为100Hz)的PWM波形
1.2.2PWM工作原理
占空比(Duty Cycle),是指在一个周期内,高电平时间占整个信号周期的百分比,即高电平时间与周期的比值,是PWM工作中的重要环节。

占空比=Tp/T

1.2.3使用步骤:
1.选择合适的PWM频率:通常选择一个高频率的PWM,以确保控制精度和减少可听见的开关噪声。
2.设定周期:确定PWM信号的周期,即脉冲的重复频率。
3.设定占空比:根据需要设定高电平(ON时间)相对于总周期的比例,这决定了输出信号的平均功率或效果。
4.应用于输出设备:将PWM信号输出到需要控制的设备,如电机驱动电路、LED控制电路或音频放大器。
二、定时器计数控制LED灯亮灭
要求:使用STM32F103的 Tim2~Tim5其一定时器的某一个通道pin,连接一个LED,用定时器计数方式,控制LED以2s的频率周期性地亮-灭。
2.1HAL库
2.1.1使用HAL库创建程序(熟悉HAL库使用)





在生成代码上进行修改和配置:


HAL_TIM_Base_Start_IT(&htim2);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
//这里灯亮一秒,灭一秒,则中断产生20次改变一次电平static uint32_t time_cnt =0; //记录中断次数if(htim->Instance == TIM2) {if(++time_cnt >= 20) //判断是否已经达到一秒{time_cnt =0; //点灯用的中断次数归零HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9); //改变LED所接引脚的电平}}
}
2.1.2计算定时器溢出时间

2.2烧录结果:
LED闪烁
三、PWM驱动LED呼吸灯
要求:采用定时器PWM模式,让 LED 以呼吸灯方式渐亮渐灭,周期为1~2秒,自己调整占空比变化到一个满意效果,
3.1HAL库点灯

选择芯片F103C8T6







创建好文件后修改代码:
在tim.c中添加:
/* USER CODE BEGIN 1 */
#include "usart.h"uint16_t CCR1, CCR2, CCR3;
uint8_t measure_flag = 0;
// 定时器3 捕获中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{static uint8_t measure_cnt = 1;// 初始设置的是捕获上升沿if (htim == &htim3){// 1. 第一次发生中断肯定是上升沿if (measure_cnt == 1){// 2. 获取此时定时器计时数据CCR1 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);// 3. 将定时器设置为捕获下降沿__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);measure_cnt = 2;}// 4. 捕获到下降延else if (measure_cnt == 2){// 5. 获取此时定时器计时数据CCR2 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);// 6. 将定时器重新设置为捕获上升沿__HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);measure_cnt = 3;}// 7. 再次捕获到上升沿,说明一个周期结束了。else if (measure_cnt == 3){// 8. 获取此时定时器计时的数据CCR3 = HAL_TIM_ReadCapturedValue(&htim3, TIM_CHANNEL_1);// 9. 关闭定时器中断。HAL_TIM_IC_Stop_IT(&htim3, TIM_CHANNEL_1);measure_cnt = 1;measure_flag = 1;}}
}// 捕获函数
void capture(void)
{// diff1:高电平持续时间// diff2:一个周期的时间uint16_t diff1 = 0, diff2 = 0;uint32_t freq; // 频率uint8_t duty; // 占空比if (measure_flag){measure_flag = 0;if (CCR1 < CCR2)diff1 = CCR2 - CCR1;elsediff1 = 0xffff + 1 + CCR2 - CCR1; // 设置的最多能数65535,也就是0xffff + 1if (CCR1 < CCR3)diff2 = CCR3 - CCR1;elsediff2 = 0xffff + 1 + CCR3 - CCR1;// 每秒能数 1000000.一个周期是 diff2。freq = (72000000 / 72) / diff2;// 高电平持续时间/低电平持续时间 不让出现小数,所以*100duty = diff1 * 100 / diff2;}printf("freq: %d HZ, duty: %d %% \r\n", freq, duty);
}
/* USER CODE END 1 */
主函数中:
while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */while (pwmVal< 500){pwmVal++;__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; 与上方相同HAL_Delay(1);}while (pwmVal){pwmVal--;__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; 与上方相同HAL_Delay(1);}HAL_Delay(200);}/* USER CODE END 3 */
3.2烧录结果:
PWM呼吸灯
四、总结
本次博客主要介绍了定时器和PWM,都是非常常用的模块,在单片机的使用过程中,通过计时器和PWM完成了很多延时、点灯、舵机旋转等工作,从中学习到很多东西。本人才疏学浅,还请各位友友批评指正。我们下期再见!
相关文章:
【STM32入门学习】定时器与PWM的LED控制
目录 一、定时器与PWM介绍 1.1定时器 1.1.1定时器分类简介 1.1.2STM32定时器分类比较表 1.1.3定时器启动操作: 1.2 PWM 1.2.1 简介: 1.2.2PWM工作原理 1.2.3使用步骤: 二、定时器计数控制LED灯亮灭 2.1HAL库 2.1.1使用HAL库创建…...
PyTorch实战:模型训练中的特征图可视化技巧
1.特征图可视化,这种方法是最简单,输入一张照片,然后把网络中间某层的输出的特征图按通道作为图片进行可视化展示即可。 2.特征图可视化代码如下: def featuremap_visual(feature, out_dirNone, # 特征图保存路径文件save_feat…...
有人@你!神工坊知识问答第二期中奖名单新鲜出炉
六月作为伟大的物理学家—麦克斯韦的诞辰月 神工坊特别推出 “ 辨 ‘麦克斯韦妖’,赢百元好礼” 夏日知识问答主题活动 活动一经推出 反响热烈 第二期中奖名单公布! 中奖的伙伴们速来兑奖! 听说还有同学没有参与? 活动最后…...
数据结构篇:旋转操作在AVL树中的实现过程
本节课在线学习视频(网盘地址,保存后即可免费观看): https://pan.quark.cn/s/06d5ed47e33b AVL树是平衡二叉搜索树的一种,它通过旋转操作来保持树的平衡。AVL树的特点是,任何节点的两个子树的高度最大差别…...
为什么Java默认使用UTF-16,Golang默认使用UTF-8呢?
Java 和 Go 语言在默认字符编码上做出了不同的选择,这是由它们的设计目标和使用场景决定的。下面是对 Java 默认使用 UTF-16 和 Go 默认使用 UTF-8 的原因进行的详细解释。 Java 默认使用 UTF-16 的原因 1. 历史背景和兼容性 Unicode 的发展: Java 诞生于 1995 年…...
JavaScript常见面试题(三)
文章目录 1.对原型、原型链的理解2.原型修改、重写3.原型链指向4.对闭包的理解5. 对作用域、作用域链的理解6.对执行上下文的理解7.对this对象的理解8. call() 和 apply() 的区别?9.异步编程的实现方式?10.setTimeout、Promise、Async/Await 的区别11.对…...
【Effective Modern C++】第1章 型别推导
【Effective Modern C】第1章 型别推导 文章目录 【Effective Modern C】第1章 型别推导条款1:理解模板型别推导基础概念模板型别推导的三种情况情景一 ParamType 是一个指针或者引用,但非通用引用情景二 ParamType是一个通过引用情景三 ParamType既不是…...
服装连锁实体店bC一体化运营方案
一、引言 随着互联网的快速发展和消费者购物习惯的变化,传统服装连锁实体店在面对新的市场环境下亟需转型升级。BC(Business to Consumer)一体化运营方案的实施将成为提升服装连锁实体店竞争力和顾客体验的关键举掖。商淘云详细介绍服装连锁…...
IDEA中SpringMVC的运行环境问题
文章目录 一、IEAD 清理缓存二、用阿里云和spring创建 SpringMVC 项目中 pom.xml 文件的区别 一、IEAD 清理缓存 springMVC 运行时存在一些之前运行过的缓存导致项目不能运行,可以试试清理缓存 二、用阿里云和spring创建 SpringMVC 项目中 pom.xml 文件的区别 以下…...
Python初体验
# Java基础知识学的差不多了,项目上又没什么事,学学py,方便以后对接 1、打包flask应用(好痛苦,在什么平台打包就只在那个平台可用想在linux用只能参考方法2了) pyinstaller --onefile app.py -n myapp 2…...
从零开始如何学习人工智能?
说说我自己的情况:我接触AI的时候,是在研一。那个时候AlphaGo战胜围棋世界冠军李世石是大新闻,人工智能第一次出现我面前,当时就想搞清楚背后的原理以及这些技术有什么作用。 就开始找资料,看视频。随着了解的深入&am…...
【仿真建模-anylogic】动态生成ConveyorCustomStation
Author:赵志乾 Date:2024-06-18 Declaration:All Right Reserved!!! 0. 背景 直接使用Anylogic组件开发的模型无法动态改变运输网布局;目前需求是要将运输网布局配置化;运输网配置化…...
如何使用idea连接Oracle数据库?
idea版本:2021.3.3 Oracle版本:10.2.0.1.0(在虚拟机Windows sever 2003 远程连接数据库) 数据库管理系统:PLSQL Developer 在idea里面找到database,在idea侧面 选择左上角加号,新建ÿ…...
谈谈kafaka的并行处理,顺带讲讲rabbitmq
简介 Kafka 是一个分布式流处理平台,它支持高效的并行处理。Kafka 的并行处理能力主要体现在以下几个方面: 分区(Partition)并行 Kafka 将数据存储在称为"分区"的逻辑单元中。每个分区可以独立地并行地进行读写操作。生产者可以根据分区策略,将数据写入到指定的分…...
P3056 [USACO12NOV] Clumsy Cows S
[USACO12NOV] Clumsy Cows S 题目描述 Bessie the cow is trying to type a balanced string of parentheses into her new laptop, but she is sufficiently clumsy (due to her large hooves) that she keeps mis-typing characters. Please help her by computing the min…...
智赢选品,OZON数据分析选品利器丨萌啦OZON数据
在电商行业的激烈竞争中,如何快速准确地把握市场动态、洞察消费者需求、实现精准选品,是每个电商卖家都面临的挑战。而在这个数据驱动的时代,一款强大的数据分析工具无疑是电商卖家们的得力助手。今天,我们就来聊聊这样一款选品利…...
Canal自定义客户端
一、背景 在Canal推送数据变更信息至MQ(消息队列)时,我们遇到了特定问题,尤其是当消息体的大小超过了MQ所允许的最大限制。这种限制导致数据推送过程受阻,需要相应的调整或处理。 二、解决方法 采用Canal自定义客户…...
20240621将需要自启动的部分放到RK3588平台的Buildroot系统的rcS文件中
20240621将需要自启动的部分放到RK3588平台的Buildroot系统的rcS文件中 2024/6/21 17:15 开发板:飞凌OK3588-C SDK:Rockchip原厂的Buildroot 缘起:在凌OK3588-C的LINUX R4系统启动的时候,需要拉高GPIO4_B5、GPIO3_B7和GPIO3_D0。…...
掌握数据魔方:Xinstall引领ASA全链路数据归因新纪元
一、引言 在数字化时代,数据是App推广和运营的核心驱动力。然而,如何准确获取、分析并应用这些数据,却成为了许多开发者和营销人员面临的痛点。Xinstall作为一款专业的App全渠道统计服务商,致力于提供精准、高效的数据解决方案&a…...
IIS代理配置-反向代理
前后端分离项目,前端在开发中使用proxy代理解决跨域问题,打包之后无效。 未配置前无法访问 部署环境为windows IIS,要在iis设置反向代理 安装代理模块 需要在iis中实现代理,需要安装Application Request Routing Cache和URL重…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
AWS vs 阿里云:功能、服务与性能对比指南
在云计算领域,Amazon Web Services (AWS) 和阿里云 (Alibaba Cloud) 是全球领先的提供商,各自在功能范围、服务生态系统、性能表现和适用场景上具有独特优势。基于提供的引用[1]-[5],我将从功能、服务和性能三个方面进行结构化对比分析&#…...
在Spring Boot中集成RabbitMQ的完整指南
前言 在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...
解密鸿蒙系统的隐私护城河:从权限动态管控到生物数据加密的全链路防护
摘要 本文以健康管理应用为例,展示鸿蒙系统如何通过细粒度权限控制、动态权限授予、数据隔离和加密存储四大核心机制,实现复杂场景下的用户隐私保护。我们将通过完整的权限请求流程和敏感数据处理代码,演示鸿蒙系统如何平衡功能需求与隐私安…...

