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的中斷開始函數!再者就是在配置完成外設生成工程文件的時候,一定不能選擇帶有中文的路徑來進行保存,而且工程的命名也不能帶有中文!切記切記!!!否則會導致軟件卡死!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章