问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32定时器实现串口发送信息、LED闪烁与呼吸灯

创作时间:
作者:
@小白创作中心

STM32定时器实现串口发送信息、LED闪烁与呼吸灯

引用
CSDN
1.
https://blog.csdn.net/HuaijinD/article/details/144399692

一、任务要求

本文将介绍如何使用STM32定时器实现以下功能:

  1. 串口发送"hello windows!"
  2. LED周期性闪烁
  3. 两个LED的呼吸灯效果

二、串口发送"hello windows!"同时LED周期性闪烁

(一)STM32CubeMX生成项目

  1. 在STMCubeMX主界面,点击"ACCEE TO MCU SELECTOR":
  2. 搜索STM32F103C8T6,选中芯片,点击"start project":
  3. 点击"System Core",选择"RCC",在右侧弹出的菜单栏中选"Crystal/Ceramic Resonator":
  4. 选择"SYS",在右侧弹出的菜单栏中选"Serial Wire":
  5. 选择"GPIO",设置PA4为"GPIO_Output"
  6. 配置"TIM2":
    点击"Timers",选择"TIM2",如图设置:
  7. 配置"TIM3":
    与TIM2类似,如图设置:
  8. 点击"NVIC",勾选"TIM2"和"TIM3"中断
  9. 点击"Connectivity",选择"USART1",配置USART
  10. 配置时钟树:
    如图:
  11. 进入"Project Manager",选择"code generator",勾选:
  12. 回到"Project",设置项目名,储存位置,选择"MDK-ARM",最后点击"GENERATE CODE"生成项目
  13. 点击"Open Project",跳转至keil

(二)Keil修改代码

  1. 将下列代码加入主函数int main(void)中,用于启动定时器
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_Base_Start_IT(&htim3);
  1. 接着在主函数中加入以下代码,用于定时器实现中断回调
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);
        }
    }
}
  1. 最后在主函数前加入下列代码,用于串口通信发送"hello windows!"
uint8_t hello[20]="hello windows!\r\n";

(三)线路连接烧录

  1. 线路连接
  • 3V3 —> 3V3
  • GND —> GND
  • RXD —> A9
  • TXD —> A10
  • LED—>A4
  1. 烧录
  • 注意,烧录前需要更换boot,烧录完成后再复原
  • 烧录时:
  • 烧录完成后复原:
  • 使用FlyMcu进行烧录,如图设置,文件选择keil编译的hex文件,点击"开始编程"即可开始烧录

(四)实验现象

三、 2个LED呼吸灯(外接1个led+PC13)

(一)STM32CubeMX生成项目

  1. 在STMCubeMX主界面,点击"ACCEE TO MCU SELECTOR":
  2. 搜索STM32F103C8T6,选中芯片,点击"start project":
  3. 点击"System Core",选择"RCC",在右侧弹出的菜单栏中选"Crystal/Ceramic Resonator":
  4. 选择"SYS",在右侧弹出的菜单栏中选"Serial Wire":
  5. 配置"TIM3"
    点击"Timers",选择"TIM3",如图配置:
  6. 配置"TIM4"
    与TIM3类似,如图配置:
  7. 配置时钟树
    如图:
  8. 进入"Project Manager",选择"code generator",勾选:
  9. 回到"Project",输入项目名,储存位置,选择"MDK-ARM",最后生成代码

(二)Keil修改代码

  1. 在main.c中添加占空比
uint16_t pwm=0;   //占空比
  1. 在主函数中添加以下代码,开启TIM3和TIM4的PWM的通道1
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); 
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1); 
  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);

(三)线路连接烧录

  1. 线路连接
  • 3V3 —> 3V3
  • GND —> GND
  • RXD —> A9
  • TXD —> A10
  • LED灯短脚 —> A6
  • LED灯长脚 —> 3V3
  • PB6 —> PC13
  1. 烧录过程和之前一样,更换boot,更换hex文件即可

(四)实验现象

(五)仿真

此前多次进行仿真,这里就不再复述仿真前的配置了,可以看之前的博客,直接放结果。
放大后:

四、总结

在实现串口发送 "hello windows!" 同时 LED 周期性闪烁任务中,先利用 STMCubeMX 完成项目基础配置,涵盖芯片选型、时钟源、GPIO 模式、定时器参数、中断使能及串口设置等环节。于 Keil 里修改代码,在主函数启动定时器,借定时器中断回调达成定时切换 LED 状态与串口发送信息功能。烧录时留意 boot 切换,依正确线路连接保障程序运行,最终达成串口定时发送特定字符串且 LED 规律闪烁的效果。

针对 2 个 LED 呼吸灯任务,同样经 STMCubeMX 配置芯片与定时器,Keil 中定义占空比变量、开启定时器 PWM 通道,借循环调整占空比并延时实现呼吸灯渐变效果,烧录流程与前一任务一致,实验成果契合预期,且给出仿真结果辅助验证。

此实验深度锤炼了我的嵌入式开发实践能力。借助 STMCubeMX 图形化配置,降低开发初期难度与出错概率,助我高效搭建项目框架、精准设置硬件参数,深刻领悟各模块协同机理,像定时器与 GPIO、串口配合实现复杂功能。

代码修改环节,明晰定时器中断处理流程与 PWM 控制精髓。定时器中断回调函数内精准计时与状态切换,让我把握实时系统中时间管理与任务调度诀窍;PWM 控制呼吸灯时,借占空比渐变掌控 LED 亮度变化,洞悉此技术对模拟信号输出的关键意义,学会以软件灵活塑造硬件特性。

烧录与线路连接阶段,强化实践操作规范认知。认识到烧录 boot 切换重要性及不同硬件连接逻辑,培养硬件电路连接与软件调试衔接能力,提升解决实际问题效率,为后续复杂项目筑牢基础、积累宝贵经验。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号