【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重…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...

2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...