STM32CubeMx学习之——基于蓝桥杯物联网开发板实现定时器2和串口2的综合小例程

STM32CubeMx学习之——基于蓝桥杯物联网开发板实现定时器2和串口2的综合小例程

本文主要介绍利用蓝桥杯物联网开发板上的定时器2模拟时钟,来进行记录开发板上电运行时间,并且通过串口向上位机进行数据传输。由上位机向开发板发送指令“0XFF”,然后开发板返回当前时钟数据,其返回时钟的格式为“XX:XX:XX”,分别为时:分:秒。

1、利用STM32CubeMx配置外设及创建工程代码

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
因为本次例程选取时钟源频率为16MHZ,所以在配置定时器时,将预分频系数设置为15999,自动装载值设置为999。这样的话,在定时器每次计满一个周期的数值之后,进入中断的时间正好为1秒。这里更正一下上述图片定时器时间计算的公式:16000000/((15999+1)*(999+1)) = 1。不好意思将16MHZ少打了两个0,因为懒得返回去截图更改,所以在这里强调更改下。。。
在这里插入图片描述
记得要打开定时器2的中断!

在这里插入图片描述
串口2的基本设置:波特率为115200,8位数据位,无奇偶校验位,1位停止位。

在这里插入图片描述
记得打开串口2中断!

在这里插入图片描述
设置系统时钟。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、部分代码参考

/* Includes ------------------------------------------------------------------*/
#include "stm32l0xx_hal.h"
#include "stdio.h"	//在main.h头文件里面要引用该头文件,以此来使用sprintf函数
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
uint8_t Rx_buf = 0;	//定义串口接收数据变量
uint8_t string[20];	//定义sprintf函数字符串缓存数组
uint8_t hour = 0, minute = 0, second = 0;	//定义时钟的时、分、秒
/* USER CODE END PD */
//在主函数里调用定时器2的中断开启函数和串口2的中断接收函数
 /* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2);	//打开定时器2
HAL_UART_Receive_IT(&huart2, &Rx_buf, 1);	//打开串口接收
 /* USER CODE END 2 */
//在主函数外调用定时器2中断回调函数和串口2中断接收回调函数
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(++second == 60)
	{
		second = 0;
		if(++minute == 60)
		{
			minute = 0;
			if(++hour == 24)
				hour = 0;
		}
	}
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART2)
	{
		if(Rx_buf == 0xFF)
		{
			sprintf((char *)string, "%d:%d:%d\r\n", hour, minute, second);
			HAL_UART_Transmit(&huart2, string, sizeof(string), 10000);
			
			HAL_UART_Receive_IT(&huart2, &Rx_buf, 1);	//重新打开串口接收,注意要加上该行代码,否则串口只能接收一次数据
		}
	}
}
/* USER CODE END 4 */

3、实验现象

在这里插入图片描述

4、结束语

本次实验较为简单,需要注意的是,在开启定时器2的时候一定不能忘了开启中断,而且要在主函数里调用定时器2的中断开始函数!再者就是在配置完成外设生成工程文件的时候,一定不能选择带有中文的路径来进行保存,而且工程的命名也不能带有中文!切记切记!!!否则会导致软件卡死!!!

猜你喜欢

转载自blog.csdn.net/qq_42449286/article/details/106152456