用定时器Timer方式实现串口通信

一、环境配置

软件:STM32CubeMX:6.6.1
Keil 5.31
mcuisp
野火串口调试助手
硬件:STM32F103C8T6

二、通过STM32Cube配置工程

1.点击“ACCESS TO MCU SELECTOR”来创建一个新的工程:
在这里插入图片描述
2.搜索型号,选择合适的型号进行工程建立
在这里插入图片描述
3.设置RCC
在这里插入图片描述

4.设置SYS
在这里插入图片描述

5.设置USART
在这里插入图片描述

6.配置定时器2。这里我们使用定时器2来实现定时的功能。如图所示,依次点击位置1,选中定时器2;位置2,配置定时器2的时钟源为内部时钟;位置3,分频系数为71,向上计数模式,计数周期为5000,使能自动重载模式。
在这里插入图片描述

分频系数那里虽然写的是71,但系统处理的时候会自动加上1,所以实际进行的是72分频。由于时钟我们一般会配置为72MHZ,所以72分频后得到1MHZ的时钟。1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒。也就是每隔0.005秒定时器2会产生一次定时中断。
7.配置中断。如下图所示,开启定时器2的中断。
在这里插入图片描述

如下图所示,生成定时器2中断优先级配置代码。
在这里插入图片描述

8.配置时钟
在这里插入图片描述
10.点击“Project Manager” ,再点击“Code Generator” ,进行配置
在这里插入图片描述
再点击“Project ”,进行配置后,点击“GENERATE CODE”,生成项目
在这里插入图片描述

三、通过Keil配置代码

1.在main.c中main函数之前定义要发送的字符串,以及后面要用的strlen函数的头文件:

#include"string.h"
char message[]="hello Windows\n";

在这里插入图片描述
2.加入如下代码启动定时器2

HAL_TIM_Base_Start_IT(&htim2);

在这里插入图片描述

3.在main.c中找到如下位置写入代码:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    
    
	static uint32_t time_cnt =0;

	if(htim->Instance == TIM2)
	{
    
    
		if(++time_cnt >= 1000)
		{
    
    
			time_cnt =0;
			HAL_UART_Transmit(&huart1,(uint8_t *)&message,strlen(message),0xffff);
		}
	}
}

在这里插入图片描述

四、运行效果

TIMER2_USART

如上面视频所示,每隔5秒,向串口发送“hello windows!”

五、总结

本实验完成了用定时器Timer方式实现串口通信,掌握了用STM32CubeMX配置定时器和串口发送消息的方法,又积累了一点STM32的知识。

六、参考资料

http://www.mcublog.cn/stm32/2021_01/stm32cubemx-dingshiqi-led/
https://blog.csdn.net/qq_55894922/article/details/127432760?spm=1001.2014.3001.5501

猜你喜欢

转载自blog.csdn.net/qq_55894922/article/details/127544784