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 切换重要性及不同硬件连接逻辑,培养硬件电路连接与软件调试衔接能力,提升解决实际问题效率,为后续复杂项目筑牢基础、积累宝贵经验。
热门推荐
西工大综述:增材制造与拓扑优化:现状与挑战
日语中的"加油":Ganbare的多种表达方式与使用场景
网购小熊摆件被起诉索赔3万8?网友炸锅
耳鼻喉外科能看咽喉炎吗
颈椎病压迫神经是否可能引起右手严重麻木
想弄清VR和AR区别,这一篇文章就够了
设备管理系统优化方案设计
独特的文创产品:让文化可触摸,让创意可收藏!
糖尿病人什么时候吃苹果好
左氧氟沙星的药理特性
这一站,济南!绝美朝霞大片刷爆朋友圈!
高数(上)视频课程:戴老师十年教学经验,2小时速成期末不挂科
天津旅游必去十大景点 一日游最佳景点推荐
时间管理大师养成记:高中生如何平衡学习与休息
马斯克:SpaceX 明年挑战捕获星舰上下两级
六大运动排行榜,燃脂第一名不是跑步,而是......
发电机组中等效可用系数是什么?怎么算的?
复旦食堂探访:暑期客流激增,学校推出快速就餐窗口应对
教你做出地道可乐鸡翅
冯至《我是一条小河》:流水柔情与爱的哀歌
头晕又偏头痛?注意前庭性偏头痛
辛亥革命十余年,巨额经费从哪里来?原来有一位大清亲王背后支持
什么是人社局的主要职责?
女生脚踝系红绳的寓意及相关说法 女生脚踝红绳的象征意义与文化解释
南京中山陵梧桐大道:古城中的静谧林荫诗画长廊
纸短情长——潮汕侨批中的家国情怀
长期感染幽门螺杆菌,有胃癌风险,做好预防,远离5个传播途径
如是:佛教中的智慧与力量
从尾巴看土狗凶不凶:农村挑选土狗的实用指南
DCDC开关电源的基本原理、设计技巧及选型参数介绍