stm32通过定时器实现串口发送信息&LED周期闪烁&呼吸灯

stm32通过定时器实现串口发送信息&LED周期闪烁&呼吸灯

  • 一、任务要求
  • 二、串口发送“hello windows!”同时LED周期性闪烁
  • (一)stm32cube生成项目
  • (二)keil修改代码
  • (三)线路连接烧录
  • (四)实验现象
  • 三、 2个LED呼吸灯(外接1个led+PC13)
  • (一)stm32cube生成项目
  • (二)keil修改代码
  • (三)线路连接烧录
  • (四)实验现象
  • (五)仿真
  • 四、总结
  • 一、任务要求

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

    (一)stm32cube生成项目

    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中断


    10.点击Connectivity,选择USART1,配置USART

    11.配置时钟树:
    如图:

    12.进入Project Manager,选择code generator,勾选:

    13.回到Project,设置项目名,储存位置,选择MDK-ARM,最后点击GENERATE CODE生成项目

    14.点击Open Project,跳转至keil

    (二)keil修改代码

    1.将下列代码加入主函数int main(void)中,用于启动定时器

    	HAL_TIM_Base_Start_IT(&htim2);
    	HAL_TIM_Base_Start_IT(&htim3);
    
    

    2.接着在主函数中加入以下代码,用于定时器实现中断回调

    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);
    		}
    			
    	}
    }
    
    

    3.最后在主函数前加入下列代码,用于串口通信发送“hello windows!”

    uint8_t hello[20]="hello windows!\r\n";
    

    (三)线路连接烧录

    1.线路连接
    3V3 —> 3V3
    GND —> GND
    RXD —> A9
    TXD —> A10
    LED—>A4

    2.烧录
    注意,烧录前需要更换boot,烧录完成后再复原
    烧录时:

    烧录完成后复原:

    使用FlyMcu进行烧录,如图设置,文件选择keil编译的hex文件,点击“开始编程”即可开始烧录

    (四)实验现象

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

    (一)stm32cube生成项目

    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;   //占空比
    

    2.在主函数中添加以下代码,开启TIM3和TIM4的PWM的通道1

    	HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); 
        HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1); 
    

    3.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

    2.烧录过程和之前一样,更换boot,更换hex文件即可

    (四)实验现象

    (五)仿真

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


    放大后:

    四、总结

    在实现串口发送 “hello windows!” 同时 LED 周期性闪烁任务中,先利用 STMCubeMX 完成项目基础配置,涵盖芯片选型、时钟源、GPIO 模式、定时器参数、中断使能及串口设置等环节。于 Keil 里修改代码,在主函数启动定时器,借定时器中断回调达成定时切换 LED 状态与串口发送信息功能。烧录时留意 boot 切换,依正确线路连接保障程序运行,最终达成串口定时发送特定字符串且 LED 规律闪烁的效果。
    针对 2 个 LED 呼吸灯任务,同样经 STMCubeMX 配置芯片与定时器,Keil 中定义占空比变量、开启定时器 PWM 通道,借循环调整占空比并延时实现呼吸灯渐变效果,烧录流程与前一任务一致,实验成果契合预期,且给出仿真结果辅助验证。
    此实验深度锤炼了我的嵌入式开发实践能力。借助 STMCubeMX 图形化配置,降低开发初期难度与出错概率,助我高效搭建项目框架、精准设置硬件参数,深刻领悟各模块协同机理,像定时器与 GPIO、串口配合实现复杂功能。
    代码修改环节,明晰定时器中断处理流程与 PWM 控制精髓。定时器中断回调函数内精准计时与状态切换,让我把握实时系统中时间管理与任务调度诀窍;PWM 控制呼吸灯时,借占空比渐变掌控 LED 亮度变化,洞悉此技术对模拟信号输出的关键意义,学会以软件灵活塑造硬件特性。
    烧录与线路连接阶段,强化实践操作规范认知。认识到烧录 boot 切换重要性及不同硬件连接逻辑,培养硬件电路连接与软件调试衔接能力,提升解决实际问题效率,为后续复杂项目筑牢基础、积累宝贵经验。

    作者:HuaijinD

    物联沃分享整理
    物联沃-IOTWORD物联网 » stm32通过定时器实现串口发送信息&LED周期闪烁&呼吸灯

    发表回复