STM32CubeMx學習之——基於藍橋杯物聯網開發板實現AD轉換和串口通信小例程

STM32CubeMx學習之——基於藍橋杯物聯網開發板實現AD轉換和串口通信小例程

本文介紹利用開發板上的AD採集擴展板,採集電壓,然後上位機向開發板發送字符“S”,則開發板開啓AD轉換,並且向上位機發送AD採集的數據,上位機發送字符“E”,則結束AD轉換。其中當開始AD採集時,開發板向上位機發送數據的格式爲“ADC_Value: XXXX, ADC_Volt: X.XX”。
“ADC_Value”爲AD採集的量化數據,爲十進制數。“ADC_Volt”爲AD採集的轉換電壓值。當停止AD採集時,開發板向上位機發送“AD採集停止”。

1、利用STM32CubeMx配置外設及創建工程代碼

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

2、部分代碼參考

/* Includes ------------------------------------------------------------------*/
#include "stm32l0xx_hal.h"
#include "stdio.h"	//在main.h頭文件裏面要引用該頭文件,以此來使用sprintf函數
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
uint8_t Rx_buf = 0;	//串口字符接收變量
uint8_t Rx_Flag = 0;	//串口接收正確數據標誌位
uint8_t string[50];	//sprintf函數字符緩衝數組
uint16_t ADC_Value = 0;	//AD採集量化值變量
float ADC_Volt = 0;	//AD採集電壓值變量
/* USER CODE END PV */
/* USER CODE BEGIN 0 */
void USART2_Send_AD_Start(void)
{
	sprintf((char *)string, "ADC_Value: %d, ADC_Volt: %.2fV\r\n", ADC_Value, ADC_Volt);	//利用sprintf函數,發送AD採集的數據
	HAL_UART_Transmit(&huart2, string, sizeof(string), 10000);	//串口2發送數據
}

void USART2_Send_AD_Stop(void)
{
	sprintf((char *)string, "AD採集停止\r\n");
	HAL_UART_Transmit(&huart2, string, sizeof(string), 10000);
}
/* USER CODE END 0 */
  /* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart2, &Rx_buf, 1);	//打開串口接收(中斷方式)
  /* USER CODE END 2 */
/* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
   /* USER CODE END WHILE */
	//接收到字符“E”,則關閉ADC採集
	if(Rx_Flag == 1)
	{
		HAL_ADC_Stop_IT(&hadc);
		USART2_Send_AD_Stop();
		HAL_Delay(1000);
	}
	//接收到字符“S”,則開啓ADC採集,並且向上位機發送採集數據
	else if(Rx_Flag == 2)
	{
		HAL_ADC_Start_IT(&hadc);
		USART2_Send_AD_Start();
		HAL_Delay(1000);
	}
   /* USER CODE BEGIN 3 */
 }
 /* USER CODE END 3 */
/* USER CODE BEGIN 4 */
//ADC採集中斷回調函數
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	if(hadc->Instance == ADC1)
	{
		ADC_Value = HAL_ADC_GetValue(hadc);	//獲得AD採集的量化值
		ADC_Volt = ADC_Value * 3.3 / 4096;	//通過計算得出對應的電壓值
	}
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART2)
	{
		if(Rx_buf == 'E')
		{
			Rx_Flag = 1;	//如果開發板接收到字符“E”,則關閉ADC採集
		}
		else if(Rx_buf == 'S')
		{
			Rx_Flag = 2;	//如果開發板接收到字符“S”,則開發板向上位機發送採集的AD值,間隔1S
		}
		
		HAL_UART_Receive_IT(&huart2, &Rx_buf, 1);	//重新開始接受串口數據
	}
}
/* USER CODE END 4 */

3、實驗現象

在這裏插入圖片描述
在這裏插入圖片描述

4、結束語

注意要打開相應的中斷,否則要修改代碼。

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