[STM32L1] __LL_ADC_CALC_TEMPERATURE 发生硬件错误

[复制链接]
418|16
小库里 发表于 2025-9-7 23:46 | 显示全部楼层 |阅读模式
__LL_ADC_CALC_TEMPERATURE 发生硬件错误(HardFault)/ TS_CAL1 和 TS_CAL2 读取为零。在排查 ADC DMA 问题时,我用以下示例代码建了工程:
STM32Cube\Repository\STM32Cube_FW_L1_V1.10.3\Projects\NUCLEO-L152RE\Examples_LL\ADC\ADC_MultiChannelSingleConversion
然而,当它转换结果时,由于在 __LL_ADC_CALC_TEMPERATURE() 宏中发生除零错误,导致硬件故障。

/* Computation of ADC conversions raw data to physical values             */
    /* using LL ADC driver helper macro.                                      */
    uhADCxConvertedData_VoltageGPIO_mVolt        = __LL_ADC_CALC_DATA_TO_VOLTAGE(VDDA_APPLI, aADCxConvertedData[0], LL_ADC_RESOLUTION_12B);
    uhADCxConvertedData_VrefInt_mVolt            = __LL_ADC_CALC_DATA_TO_VOLTAGE(VDDA_APPLI, aADCxConvertedData[1], LL_ADC_RESOLUTION_12B);
    hADCxConvertedData_Temperature_DegreeCelsius = __LL_ADC_CALC_TEMPERATURE(VDDA_APPLI, aADCxConvertedData[2], LL_ADC_RESOLUTION_12B); // This crashes

仔细检查后发现,*TEMPSENSOR_CAL1_ADDR 和 *TEMPSENSOR_CAL2_ADDR 的读取结果为零。若使用调试器查看这些地址的内存内容,可以证实该情况。

作为参考,这两个定义位于 stm32l1xx_ll_adc.h 中,具体如下:
/* Temperature sensor */
#if defined (TEMPSENSOR_CAL1_ADDR_CMSIS)
#define TEMPSENSOR_CAL1_ADDR               ((uint16_t*) TEMPSENSOR_CAL1_ADDR_CMSIS) /* Internal temperature sensor, address of parameter TS_CAL1: On STM32L1, temperature sensor ADC raw data acquired at temperature  30 DegC (tolerance: +-5 DegC), Vref+ = 3.0 V (tolerance: +-10 mV). */
#define TEMPSENSOR_CAL2_ADDR               ((uint16_t*) TEMPSENSOR_CAL2_ADDR_CMSIS) /* Internal temperature sensor, address of parameter TS_CAL2: On STM32L1, temperature sensor ADC raw data acquired at temperature 110 DegC (tolerance: +-5 DegC), Vref+ = 3.0 V (tolerance: +-10 mV). */
#endif /* TEMPSENSOR_CAL1_ADDR_CMSIS */

公羊子丹 发表于 2025-9-30 07:22 | 显示全部楼层
先别慌,STM32L1 上读到 TS_CAL1/TS_CAL2 为 0 最常见的原因是用错了器件头文件或 CMSIS 定义,先确认你 include 的 stm32l1xx.h / stm32l1xx_ll_adc.h 与实际芯片型号一致。
周半梅 发表于 2025-9-30 07:23 | 显示全部楼层
用调试器的 Memory View 直接打开 TEMPSENSOR_CAL1_ADDR 和 TEMPSENSOR_CAL2_ADDR 指向的物理地址,确认是真正的 0 还是被 linker/启动代码覆盖掉了。
帛灿灿 发表于 2025-9-30 07:24 | 显示全部楼层
NFC 充电多是低功率(几十 mW~几百 mW),Qi 支持从 5W 到几十 W,功率差别巨大。
童雨竹 发表于 2025-9-30 07:28 | 显示全部楼层
看看 TEMPSENSOR_CAL1_ADDR_CMSIS 宏有没有被条件编译屏蔽或误改,示例工程里可能和你实际选的器件宏不一致。
万图 发表于 2025-9-30 07:28 | 显示全部楼层
要更新 CMSIS,很简单:去 ARM GitHub 下载最新 CMSIS,放进工程文件夹,然后修改 include path。
Wordsworth 发表于 2025-9-30 07:29 | 显示全部楼层
再确认传给宏的 VDDA_APPLI 值是否正确,宏内部会用到 VDDA,错误的电压参数会导致计算异常或掩盖根本问题。
Bblythe 发表于 2025-9-30 07:30 | 显示全部楼层
检查是否在读取前已经正确使能了温度传感器/参考电压,有些示例需要先打开温度传感器并等待稳定时间再读。
Pulitzer 发表于 2025-9-30 07:31 | 显示全部楼层
如果内存视图显示的确为全 0,尝试用 ST 官方示例工程在相同硬件上跑一次,排除是你工程配置或头文件版本的问题。
Uriah 发表于 2025-9-30 07:32 | 显示全部楼层
对比一下使用的 LL/HAL/CMSIS 版本,旧版头文件可能没正确定义这些地址,把官方对应芯片的头文件拷到工程里试试。
Clyde011 发表于 2025-9-30 07:33 | 显示全部楼层
快速排查流程建议:1) 用 Memory View 验证地址内容 2) 检查 device header 与宏定义 3) 检查 linker/startup 映射 4) 在代码里做非零保护 5) 仍不行就把最小可复现工程粘上来让大家看。
powerantone 发表于 2025-9-30 10:41 | 显示全部楼层
宏未正确定义或未启用。
onlycook 发表于 2025-9-30 11:42 | 显示全部楼层
可能是代码配置问题,未启用温度传感器或ADC校准功能。
jcky001 发表于 2025-9-30 15:43 | 显示全部楼层
检查并修正校准地址宏,如果宏仍无效,直接通过指针读取校准值
stormwind123 发表于 2025-9-30 12:43 | 显示全部楼层
建议用HAL库的校准值
七毛钱 发表于 2025-9-30 14:44 | 显示全部楼层
看看ADC和温度传感器是否已正确初始化
内政奇才 发表于 2025-9-30 10:45 | 显示全部楼层
可能是芯片坏了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

52

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部