作为一名嵌入式工程师,监控芯片温度是保证系统稳定运行的重要任务。大多数STM32微控制器内部都集成了温度传感器,但如何正确读取并获取准确数值却暗藏玄机。
本文将深入探讨STM32内部温度传感器的工作原理、实现方法。
STM32 系列 MCU 内部温度传感器是一枚二极管型传感器,其输出电压与温度成线性关系。
温度传感器的输出经片内多路复用进入 ADC 通道,再由 ADC 转换为数字值。
厂商在数据手册中提供了两点标定值(在 30°C 和 130°C 时 ADC 采样值 TS_CAL1 与 TS_CAL2,要根据芯片数据手册确定)及对应温度,读出 ADC 值后,可使用线性插值公式计算当前温度:
正确配置ADC是获取温度数据的基础,在CubeMX的Analog选项卡中,选择ADC模块,勾选“Temperature Sensor Channel”。
对于STM32H7/U5等系列,还需启用内部通道转换(设置VSENSESEL位)。并且配置采样通道。
在启动 ADC 转换前,进行一次 ADC 校准:
ADC1->CR2 |= ADC_CR2_RSTCAL; // 复位校准寄存器
while (ADC1->CR2 & ADC_CR2_RSTCAL); // 等待完成
ADC1->CR2 |= ADC_CR2_CAL; // 启动校准
while (ADC1->CR2 & ADC_CR2_CAL); // 等待完成
在 STM32 的 Flash 内,地址 TS_CAL1(0x1FFF75A8)、TS_CAL2(0x1FFF75CA )存放对应 30°C 和 110°C 时的校准 ADC 值。
注意,不同STM32系列的温度传感器通道和校准值地址有差异。
设计驱动程序如下:
float Read_Temperature(void) {
HAL_ADC_Start(&hadc1);
while (HAL_ADC_GetState(&hadc1) != HAL_ADC_STATE_READY);
uint32_t adc_value = HAL_ADC_GetValue(&hadc1);
uint16_t ts_cal1 = *(__IO uint16_t *)0x1FFF75A8;
uint16_t ts_cal2 = *(__IO uint16_t *)0x1FFF75CA;
float temperature = (float)(130 - 30) / (ts_cal2 - ts_cal1) * (adc_value - ts_cal1) + 30;
return temperature;
}