HAL STM32F4内部温度读取+ADC阻塞式读取
- 📍相关篇《STM32F103VET6基于STM32CubeMX 配置非DMA方式获取内部温度》
- 🔖对于大多数stm32型号,基本上内部都集成了温度传感器。
⛳不同型号的STM32单片机,计算温度的公式差异
-
🌿对于STM32F1系列:(计算公式在参考手册上)
-
🌿STM32F4系列:
🛠STM32CubeMX配置
- 🌿配置通道0:
- 🌿勾选内部温度通道以及参数配置
🛠业务代码
- 🌿adc读取函数
uint16_t Read_Adc() {
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
while(!HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC));
// while (HAL_IS_BIT_CLR(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)) {}
return HAL_ADC_GetValue(&hadc1);
}
- 🌿main函数
int main(void)
{
/* USER CODE BEGIN 1 */
uint16_t Adcbuf[2] = {0,0};
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
for (uint8_t i = 0; i < 2; i++)
Adcbuf[i] = Read_Adc();
float Voltage = (Adcbuf[0]/ 4095.f)* 3.3f;
float Temperature = ( Adcbuf[1]*3.3/4095 - 0.76)/0.0025 + 25 ;//计算方法
printf("CH0 Voltage = %.2f,Temp Sensor= %.2f\r\n", \
Voltage, Temperature);
HAL_Delay(500);
HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
}
/* USER CODE END 3 */
}
- 🌿串口输出相关函数
#include "stdio.h"//勾选MicroLib
/*可调用printf*/
int fputc(int ch, FILE *f)
{
/*&huart1指的是串口1,如果用别的串口就修改数字*/
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
return ch;
}
- 📜测试打印信息:
📚测试工程
链接:https://pan.baidu.com/s/16J-BQyDwcB8klYTaKL8gxA?pwd=bu2y
提取码:bu2y