stm32通过定时器实现串口发送信息&LED周期闪烁&呼吸灯
stm32通过定时器实现串口发送信息&LED周期闪烁&呼吸灯
一、任务要求
二、串口发送“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