STM32CUBEMX_定时器控制LED闪烁和串口通信
前面的实验中,延时功能都是通过delay函数实现的。这种方式,相当于让CPU一直在做无用功,空耗CPU资源,让他停在这个递减计数中循环,还不能做别的事情。因此可以通过定时器的方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务。
软件版本:
STM32CubeMX:6.6.0 KEIl:5.37.0.0 FlyMcu:0.188 硬件: STM32F103c8t6
1. 通过CubeMX配置项目
1.1 RCC设置
1.2 SYS设置
1.3 配置IO。
配置PA5,并命名为LED。这里我们只使用一个LED,做演示用。
1.4 配置串口
1.5 配置定时器
尽管要同时对串口和LED进行选择,但是只需要一个定时器便可以进行控制。
将时钟源改为内部时钟,选择72分频,向上计算到9999便结束,实际计数时间为72M/72/10000,为定时间定时频率。
分频系数那里虽然写的是71,但系统处理的时候会自动加上1,所以实际进行的是72分频。由于时钟我们一般会配置为72MHZ,所以72分频后得到1MHZ的时钟。中断时间为1/(72M/72/10000)=0.01s.
1.6 配置中断
1.7 配置时钟
1.8 生成项目
2.Keil代码编写
2.1 printf函数设置
在main.c 和usart.c 中添加头文件#include "stdio.h" 之后,勾选Target中的use MicroLIB,在mian.c 文件中,添加如下代码,进行重定义
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
2.2 对中断函数进行设置
2.2.1 添加中断
在int main()里面的while前面添加
HAL_TIM_Base_Start_IT(&htim2);
开启定时器中断
2.2.2 HAL_TIM_PeriodElapsedCallback()
在main.c里面添加回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t time_cnt =0;
static uint32_t time_cnt2 =0;
if(htim->Instance == TIM2)
{
if(++time_cnt >= 200)
{
time_cnt =0;
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
}
if(++time_cnt2 >=500 )
{
time_cnt2 =0;
printf("hello windows!\r\n");
}
}
}
2.3 编译成hex,烧录
3. 运行结果
2秒led灯闪烁一次,5秒发送一句hello windows!
4.总结
通过这次实验,了解了定时器的相关知识和stm32cubemx的相关配置,并能简单运用到项目中
5. 参考文章
定时间控制LED—串口_qq_57244669的博客-CSDN博客
STM32CUBEMX_定时器控制LED闪烁
|