STM32定时器实现串口发送信息、LED闪烁与呼吸灯
创作时间:
作者:
@小白创作中心
STM32定时器实现串口发送信息、LED闪烁与呼吸灯
引用
CSDN
1.
https://blog.csdn.net/HuaijinD/article/details/144399692
一、任务要求
本文将介绍如何使用STM32定时器实现以下功能:
- 串口发送"hello windows!"
- LED周期性闪烁
- 两个LED的呼吸灯效果
二、串口发送"hello windows!"同时LED周期性闪烁
(一)STM32CubeMX生成项目
- 在STMCubeMX主界面,点击"ACCEE TO MCU SELECTOR":
- 搜索STM32F103C8T6,选中芯片,点击"start project":
- 点击"System Core",选择"RCC",在右侧弹出的菜单栏中选"Crystal/Ceramic Resonator":
- 选择"SYS",在右侧弹出的菜单栏中选"Serial Wire":
- 选择"GPIO",设置PA4为"GPIO_Output"
- 配置"TIM2":
点击"Timers",选择"TIM2",如图设置: - 配置"TIM3":
与TIM2类似,如图设置: - 点击"NVIC",勾选"TIM2"和"TIM3"中断
- 点击"Connectivity",选择"USART1",配置USART
- 配置时钟树:
如图: - 进入"Project Manager",选择"code generator",勾选:
- 回到"Project",设置项目名,储存位置,选择"MDK-ARM",最后点击"GENERATE CODE"生成项目
- 点击"Open Project",跳转至keil
(二)Keil修改代码
- 将下列代码加入主函数int main(void)中,用于启动定时器
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_Base_Start_IT(&htim3);
- 接着在主函数中加入以下代码,用于定时器实现中断回调
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t time_cnt =0;
static uint32_t time_cnt3 =0;
if(htim->Instance == TIM2)
{
if(++time_cnt >= 400)
{
time_cnt =0;
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);
}
}
if(htim->Instance == TIM3)
{
if(++time_cnt3 >= 1000)
{
time_cnt3 =0;
HAL_UART_Transmit(&huart1,hello,20,100000);
}
}
}
- 最后在主函数前加入下列代码,用于串口通信发送"hello windows!"
uint8_t hello[20]="hello windows!\r\n";
(三)线路连接烧录
- 线路连接
- 3V3 —> 3V3
- GND —> GND
- RXD —> A9
- TXD —> A10
- LED—>A4
- 烧录
- 注意,烧录前需要更换boot,烧录完成后再复原
- 烧录时:
- 烧录完成后复原:
- 使用FlyMcu进行烧录,如图设置,文件选择keil编译的hex文件,点击"开始编程"即可开始烧录
(四)实验现象
三、 2个LED呼吸灯(外接1个led+PC13)
(一)STM32CubeMX生成项目
- 在STMCubeMX主界面,点击"ACCEE TO MCU SELECTOR":
- 搜索STM32F103C8T6,选中芯片,点击"start project":
- 点击"System Core",选择"RCC",在右侧弹出的菜单栏中选"Crystal/Ceramic Resonator":
- 选择"SYS",在右侧弹出的菜单栏中选"Serial Wire":
- 配置"TIM3"
点击"Timers",选择"TIM3",如图配置: - 配置"TIM4"
与TIM3类似,如图配置: - 配置时钟树
如图: - 进入"Project Manager",选择"code generator",勾选:
- 回到"Project",输入项目名,储存位置,选择"MDK-ARM",最后生成代码
(二)Keil修改代码
- 在main.c中添加占空比
uint16_t pwm=0; //占空比
- 在主函数中添加以下代码,开启TIM3和TIM4的PWM的通道1
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);
- while中添加以下调用代码
while (pwm< 500)
{
pwm++;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);
HAL_Delay(1);
}
while (pwm)
{
pwm--;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwm);
__HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_1, pwm);
HAL_Delay(1);
}
HAL_Delay(200);
(三)线路连接烧录
- 线路连接
- 3V3 —> 3V3
- GND —> GND
- RXD —> A9
- TXD —> A10
- LED灯短脚 —> A6
- LED灯长脚 —> 3V3
- PB6 —> PC13
- 烧录过程和之前一样,更换boot,更换hex文件即可
(四)实验现象
(五)仿真
此前多次进行仿真,这里就不再复述仿真前的配置了,可以看之前的博客,直接放结果。
放大后:
四、总结
在实现串口发送 "hello windows!" 同时 LED 周期性闪烁任务中,先利用 STMCubeMX 完成项目基础配置,涵盖芯片选型、时钟源、GPIO 模式、定时器参数、中断使能及串口设置等环节。于 Keil 里修改代码,在主函数启动定时器,借定时器中断回调达成定时切换 LED 状态与串口发送信息功能。烧录时留意 boot 切换,依正确线路连接保障程序运行,最终达成串口定时发送特定字符串且 LED 规律闪烁的效果。
针对 2 个 LED 呼吸灯任务,同样经 STMCubeMX 配置芯片与定时器,Keil 中定义占空比变量、开启定时器 PWM 通道,借循环调整占空比并延时实现呼吸灯渐变效果,烧录流程与前一任务一致,实验成果契合预期,且给出仿真结果辅助验证。
此实验深度锤炼了我的嵌入式开发实践能力。借助 STMCubeMX 图形化配置,降低开发初期难度与出错概率,助我高效搭建项目框架、精准设置硬件参数,深刻领悟各模块协同机理,像定时器与 GPIO、串口配合实现复杂功能。
代码修改环节,明晰定时器中断处理流程与 PWM 控制精髓。定时器中断回调函数内精准计时与状态切换,让我把握实时系统中时间管理与任务调度诀窍;PWM 控制呼吸灯时,借占空比渐变掌控 LED 亮度变化,洞悉此技术对模拟信号输出的关键意义,学会以软件灵活塑造硬件特性。
烧录与线路连接阶段,强化实践操作规范认知。认识到烧录 boot 切换重要性及不同硬件连接逻辑,培养硬件电路连接与软件调试衔接能力,提升解决实际问题效率,为后续复杂项目筑牢基础、积累宝贵经验。
热门推荐
婚前AA制协议:夫妻间的财产纠纷化解之道
网约车乘客“开门杀”导致的机动车交通事故 责任如何划分?
重庆开州磨梁村:特色产业赋能乡村振兴
学拼音,看音调,一招搞定!
传统中医中的砭石:历史、功效与现代应用解析
时间的流逝与人生哲学:珍惜每一个瞬间的重要性与智慧
客户授信管理流程表格:从信息收集到风险预警的完整指南
肠化生是怎么回事
从好声音走出来的实力唱将:周深的音乐观与艺术成就
菲尼尔透镜的优缺点及其实际应用领域
从收入负债比角度剖析个人财务状况
陶瓷不粘锅,真的像宣传的“安全又不粘”吗?内行给出答案
注册安全工程师还有用吗
安全管理证书都有哪些项目
被司法冻结了银行卡找律师有用吗?律师会通过哪些手段帮助你?
深度解析《唐探1900》:历史悬案中的民族觉醒与商业密码
Excel边框和底纹设置完整指南
换证了,换证了!残疾人2024年换证申请指南来了
如何帮助孩子克服学校恐惧感?
民间借贷利率法律规定及有效区间详解
古代皇宫有多少禁卫军?完全听命于皇帝吗?
低烧怎么办?六种科学方法助你快速退烧
违法犯罪问题线索的认定标准与分类体系研究
项目问题跟踪:如何高效管理和解决项目中的问题?
奥伯斯悖论:为什么夜空是黑暗的?
Logo设计AI生成算法:超越传统设计的可能性
睡觉爱做梦的人,健康指数是不做梦的人数倍?医生给出了解析
《怪物猎人:荒野》首篇媒体评测泄露!满分评价 优化超棒
解析「杭州六小龙」背后的城市密码与生态样本
构建绩效申诉的有力数据证据