AHT20 BMP280 STM32C8T6 cubemx
模块使用AHT20 BMP280 二合一
使用cubemx生成的
然后直接上程序吧:
BMP280.C
#include "BMP280.h"
#include "math.h"
BMP280_Calibration BMP280_Cal; //BMP280校准结构体
/*
* 函数:BMP280初始化
* 参数:无
* 返回:读取ID成功并初始化成功返回0,读取ID错误返回1
*/
GPIO_PinState BMP280_Init(void)
{
//初始化校准值
uint8_t lsb;
uint8_t msb;
//配置寄存器
uint8_t WriteBuffer;
//若读取ID不为0x58,则视为错误
if(BMP280_ReadID() != 0x58)
{
return BMP280_ERROR;
}
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_T1_LSB_REG, 1, &lsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_T1_MSB_REG, 1, &msb, 1, BMP280_TIMEOUT);
BMP280_Cal.T1 = (uint16_t)lsb + ((uint16_t)msb << 8);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_T2_LSB_REG, 1, &lsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_T2_MSB_REG, 1, &msb, 1, BMP280_TIMEOUT);
BMP280_Cal.T2 = (uint16_t)lsb + ((uint16_t)msb << 8);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_T3_LSB_REG, 1, &lsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_T3_MSB_REG, 1, &msb, 1, BMP280_TIMEOUT);
BMP280_Cal.T3 = (uint16_t)lsb + ((uint16_t)msb << 8);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P1_LSB_REG, 1, &lsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P1_MSB_REG, 1, &msb, 1, BMP280_TIMEOUT);
BMP280_Cal.P1 = (uint16_t)lsb + ((uint16_t)msb << 8);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P2_LSB_REG, 1, &lsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P2_MSB_REG, 1, &msb, 1, BMP280_TIMEOUT);
BMP280_Cal.P2 = (uint16_t)lsb + ((uint16_t)msb << 8);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P3_LSB_REG, 1, &lsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P3_MSB_REG, 1, &msb, 1, BMP280_TIMEOUT);
BMP280_Cal.P3 = (uint16_t)lsb + ((uint16_t)msb << 8);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P4_LSB_REG, 1, &lsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P4_MSB_REG, 1, &msb, 1, BMP280_TIMEOUT);
BMP280_Cal.P4 = (uint16_t)lsb + ((uint16_t)msb << 8);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P5_LSB_REG, 1, &lsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P5_MSB_REG, 1, &msb, 1, BMP280_TIMEOUT);
BMP280_Cal.P5 = (uint16_t)lsb + ((uint16_t)msb << 8);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P6_LSB_REG, 1, &lsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P6_MSB_REG, 1, &msb, 1, BMP280_TIMEOUT);
BMP280_Cal.P6 = (uint16_t)lsb + ((uint16_t)msb << 8);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P7_LSB_REG, 1, &lsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P7_MSB_REG, 1, &msb, 1, BMP280_TIMEOUT);
BMP280_Cal.P7 = (uint16_t)lsb + ((uint16_t)msb << 8);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P8_LSB_REG, 1, &lsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P8_MSB_REG, 1, &msb, 1, BMP280_TIMEOUT);
BMP280_Cal.P8 = (uint16_t)lsb + ((uint16_t)msb << 8);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P9_LSB_REG, 1, &lsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_DIG_P9_MSB_REG, 1, &msb, 1, BMP280_TIMEOUT);
BMP280_Cal.P9 = (uint16_t)lsb + ((uint16_t)msb << 8);
BMP280_Cal.t_fine = 0;
//配置寄存器
WriteBuffer = t_0_5ms | Filter_4;//等待时间0.05ms,滤波器等级4
HAL_I2C_Mem_Write(&BMP280_I2C, BMP280_ADDRESS, BMP280_CONFIG, 1, &WriteBuffer, 1, BMP280_TIMEOUT);
WriteBuffer = Temp_OverSampl_1|Press_OverSampl_8| Normal_Mode;//过温度采样1,压力过采样4,正常模式
HAL_I2C_Mem_Write(&BMP280_I2C, BMP280_ADDRESS, BMP280_CTRL_MEAS, 1, &WriteBuffer, 1, BMP280_TIMEOUT);
return BMP280_OK;
}
/*
* 函数:BMP280读取设备ID
* 参数:无
* 返回:ID值(0x58)
*/
uint8_t BMP280_ReadID(void)
{
uint8_t ID;
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_ID, 1, &ID, 1, BMP280_TIMEOUT);
return ID;
}
/*
* 函数:BMP280读取温度值
* 参数:无
* 返回:温度值(摄氏度)
*/
double BMP280_ReadTemp(void)
{
double Temperature;
int32_t Temp_Reg;
uint8_t Temp_xlsb;
uint8_t Temp_lsb;
uint8_t Temp_msb;
//I2C读取存储温度数据的寄存器
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_TEMP_XLSB, 1, &Temp_xlsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_TEMP_LSB, 1, &Temp_lsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_TEMP_MSB, 1, &Temp_msb, 1, BMP280_TIMEOUT);
//数据拼接
Temp_Reg = ((int32_t)Temp_xlsb >> 4) + ((int32_t)Temp_lsb << 4) + ((int32_t)Temp_msb << 12);
//计算并校准
Temperature = BMP280_compensate_T(Temp_Reg);
return Temperature;
}
/*
* 函数:BMP280读取大气压
* 参数:无
* 返回:大气压(Pa)
*/
double BMP280_ReadPress(void)
{
double Pressure;
int32_t Press_Reg;
uint8_t Press_xlsb;
uint8_t Press_lsb;
uint8_t Press_msb;
//I2C读取存储大气压数据的寄存器
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_PRESS_XLSB, 1, &Press_xlsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_PRESS_LSB, 1, &Press_lsb, 1, BMP280_TIMEOUT);
HAL_I2C_Mem_Read(&BMP280_I2C, BMP280_ADDRESS, BMP280_PRESS_MSB, 1, &Press_msb, 1, BMP280_TIMEOUT);
//数据拼接
Press_Reg = ((int32_t)Press_xlsb >> 4) + ((int32_t)Press_lsb << 4) + ((int32_t)Press_msb << 12);
//计算并校准
Pressure = BMP280_compensate_P(Press_Reg);
return Pressure;
}
/*
* 函数:根据BMP280测得的大气压值计算海拔高度
* 参数:无
* 返回:海拔高度(m)
* 注意:误差比较大,不建议使用
*/
double BMP280_ReadAltitude(void)
{
double Altitude = 0;
double pressure = 0;
//测量大气压
pressure = BMP280_ReadPress();
//计算海拔高度
Altitude = 44330 * (1 - pow((pressure/101325.0), 1.0/5.255));
return Altitude;
}
/*
* 函数:BMP280温度校准
* 参数:无
* 返回:温度值
*/
double BMP280_compensate_T(int adc_T)
{
double var1, var2, T;
var1 = (((double)adc_T)/16384.0 - ((double)BMP280_Cal.T1)/1024.0) * ((double)BMP280_Cal.T2);
var2 = ((((double)adc_T)/131072.0 - ((double)BMP280_Cal.T1)/8192.0) *
(((double)adc_T)/131072.0 - ((double) BMP280_Cal.T1)/8192.0)) * ((double)BMP280_Cal.T3);
BMP280_Cal.t_fine = (int)(var1 + var2);
T = (var1 + var2) / 5120.0;
return T;
}
/*
* 函数:BMP280大气压值校准
* 参数:无
* 返回:大气压
*/
double BMP280_compensate_P(int adc_P)
{
double var1, var2, p;
var1 = ((double)BMP280_Cal.t_fine/2.0) - 64000.0;
var2 = var1 * var1 * ((double)BMP280_Cal.P6) / 32768.0;
var2 = var2 + var1 * ((double)BMP280_Cal.P5) * 2.0;
var2 = (var2/4.0)+(((double)BMP280_Cal.P4) * 65536.0);
var1 = (((double)BMP280_Cal.P3) * var1 * var1 / 524288.0 + ((double)BMP280_Cal.P2) * var1) / 524288.0;
var1 = (1.0 + var1 / 32768.0)*((double)BMP280_Cal.P1);
if (var1 == 0.0){
return 0; // avoid exception caused by division by zero
}
p = 1048576.0 - (double)adc_P;
p = (p - (var2 / 4096.0)) * 6250.0 / var1;
var1 = ((double)BMP280_Cal.P9) * p * p / 2147483648.0;
var2 = p * ((double)BMP280_Cal.P8) / 32768.0;
p = p + (var1 + var2 + ((double)BMP280_Cal.P7)) / 16.0;
return p;
}
BMP280.H
```c
#ifndef INC_BMP280_H_
#define INC_BMP280_H_
#include "main.h"
#include "i2c.h"
#define BMP280_I2C hi2c2 //BMP280使用的I2C
//BMP280常用读写寄存器
#define BMP280_ADDRESS 0xEE //根据BMP280电路原理图,可能为0xEE或0xEC
#define BMP280_ID 0xD0
#define BMP280_CONFIG 0xF5
#define BMP280_CTRL_MEAS 0xF4
#define BMP280_TEMP_XLSB 0xFC
#define BMP280_TEMP_LSB 0xFB
#define BMP280_TEMP_MSB 0xFA
#define BMP280_PRESS_XLSB 0xF9
#define BMP280_PRESS_LSB 0xF8
#define BMP280_PRESS_MSB 0xF7
//BMP280校准寄存器
#define BMP280_DIG_T1_LSB_REG 0x88
#define BMP280_DIG_T1_MSB_REG 0x89
#define BMP280_DIG_T2_LSB_REG 0x8A
#define BMP280_DIG_T2_MSB_REG 0x8B
#define BMP280_DIG_T3_LSB_REG 0x8C
#define BMP280_DIG_T3_MSB_REG 0x8D
#define BMP280_DIG_P1_LSB_REG 0x8E
#define BMP280_DIG_P1_MSB_REG 0x8F
#define BMP280_DIG_P2_LSB_REG 0x90
#define BMP280_DIG_P2_MSB_REG 0x91
#define BMP280_DIG_P3_LSB_REG 0x92
#define BMP280_DIG_P3_MSB_REG 0x93
#define BMP280_DIG_P4_LSB_REG 0x94
#define BMP280_DIG_P4_MSB_REG 0x95
#define BMP280_DIG_P5_LSB_REG 0x96
#define BMP280_DIG_P5_MSB_REG 0x97
#define BMP280_DIG_P6_LSB_REG 0x98
#define BMP280_DIG_P6_MSB_REG 0x99
#define BMP280_DIG_P7_LSB_REG 0x9A
#define BMP280_DIG_P7_MSB_REG 0x9B
#define BMP280_DIG_P8_LSB_REG 0x9C
#define BMP280_DIG_P8_MSB_REG 0x9D
#define BMP280_DIG_P9_LSB_REG 0x9E
#define BMP280_DIG_P9_MSB_REG 0x9F
//过采样设置,即分辨率设置,过采样率越高,分辨率越高
#define Temp_OverSampl_0 0x00
#define Temp_OverSampl_1 0x20
#define Temp_OverSampl_2 0x40
#define Temp_OverSampl_4 0x60
#define Temp_OverSampl_8 0x80
#define Temp_OverSampl_16 0xE0
#define Press_OverSampl_0 0x00
#define Press_OverSampl_1 0x04
#define Press_OverSampl_2 0x08
#define Press_OverSampl_4 0x0C
#define Press_OverSampl_8 0x10
#define Press_OverSampl_16 0x1C
//模式设置
#define Sleep_Mode 0x00
#define Forced_Mode 0x01
#define Normal_Mode 0x03
//待机时间设置
#define t_0_5ms 0x00
#define t_62_5ms 0x20
#define t_125ms 0x40
#define t_250ms 0x60
#define t_500ms 0x80
#define t_1000ms 0xA0
#define t_2000ms 0xC0
#define t_4000ms 0xE0
//滤波器设置
#define Filter_0 0x00
#define Filter_2 0x04
#define Filter_4 0x08
#define Filter_8 0x0C
#define Filter_16 0x1C
//BMP280初始化成功或失败
#define BMP280_OK 0
#define BMP280_ERROR 1
//BMP280 I2C通信等待时间
#define BMP280_TIMEOUT 100
//BMP280校准结构体
typedef struct
{
uint16_t T1;
int16_t T2;
int16_t T3;
uint16_t P1;
int16_t P2;
int16_t P3;
int16_t P4;
int16_t P5;
int16_t P6;
int16_t P7;
int16_t P8;
int16_t P9;
int32_t t_fine;
}BMP280_Calibration;
//在主函数中调用的基本函数
GPIO_PinState BMP280_Init(void);
uint8_t BMP280_ReadID(void);
double BMP280_ReadTemp(void);
double BMP280_ReadPress(void);
double BMP280_ReadAltitude(void);
//无需在主函数调用
double BMP280_compensate_T(int adc_T);
double BMP280_compensate_P(int adc_P);
#endif
```c
#include "AHT20.h"
//AHT20初始化
void AHT20_Init(void)
{
//临时变量用于读取
uint8_t ReadBuffer;
//根据手册,上电后等待40ms
HAL_Delay(40);
//根据手册,通过发送0x71看状态字的校准使能位
HAL_I2C_Master_Receive(&AHT20_I2C, AHT20_ADDRESS, &ReadBuffer, 1, AHT20_TIMEOUT);
//根据手册,该位不为1则发送初始化指令
if((ReadBuffer & 0x08) != 0x08)
{
//临时变量用于发送
uint8_t SendBuffer[3] = {0xBE, 0x08, 0x00};
//根据手册,发送初始化指令
HAL_I2C_Master_Transmit(&AHT20_I2C, AHT20_ADDRESS, SendBuffer, 3, AHT20_TIMEOUT);
}
}
//AHT20读取温湿度信息函数
void AHT20_Read(float *Temperature, float *Humidity)
{
//触发测量指令
uint8_t SendBuffer[3] = {0xAC, 0x33, 0x00};
//临时变量用于读取
uint8_t ReadBuffer[6];
//发送测量指令
HAL_I2C_Master_Transmit(&AHT20_I2C, AHT20_ADDRESS, SendBuffer, 3, AHT20_TIMEOUT);
//根据手册,等待75ms
HAL_Delay(75);
//接收测量数据
HAL_I2C_Master_Receive(&AHT20_I2C, AHT20_ADDRESS, ReadBuffer, 6, AHT20_TIMEOUT);
//根据手册,检测忙状态Bit[7]为0后可以读取数据
if((ReadBuffer[0] & 0x80) == 0x00)
{
//临时变量,存放数据
uint32_t Data = 0;
//湿度数据计算
Data = ((uint32_t)ReadBuffer[3] >> 4) + ((uint32_t)ReadBuffer[2] << 4) + ((uint32_t)ReadBuffer[1] << 12);
*Humidity = Data * 100.0f / (1<<20);
//温度数据计算
Data = ((uint32_t)ReadBuffer[5]) + ((uint32_t)ReadBuffer[4] << 8) + (((uint32_t)(ReadBuffer[3] & 0x0F)) << 16);
*Temperature = Data * 200.0f / (1<<20) - 50;
}
}
AHT20.H
#ifndef INC_AHT20_H_
#define INC_AHT20_H_
#include "main.h"
#include "i2c.h"
#define AHT20_ADDRESS 0x70
#define AHT20_I2C hi2c2
#define AHT20_TIMEOUT 100
void AHT20_Init(void);
void AHT20_Read(float *Temperature, float *Humidity);
#endif
MAIN.C
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2025 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include "AHT20.h"
#include "BMP280.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t*) &ch, 1, 0xffff);
return ch;
}
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
GPIO_InitTypeDef GPIO_InitStruct ;
float AHT20_Temperature = 0;
float AHT20_Humidity = 0;
double BMP280_Temperature = 0;
double BMP280_Pressure = 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_TIM2_Init();
MX_USART1_UART_Init();
MX_I2C2_Init();
/* USER CODE BEGIN 2 */
printf("Start AHT20 Init \r\n");
AHT20_Init();
BMP280_Init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
AHT20_Read(&AHT20_Temperature, &AHT20_Humidity);
printf("AHT20_Temperature:%f \r\n",AHT20_Temperature);
printf("AHT20_Humidity:%f \r\n",AHT20_Humidity);
HAL_Delay(500);
//BMP280读取温度和大气压
BMP280_Temperature = BMP280_ReadTemp();
BMP280_Pressure = BMP280_ReadPress();
printf("BMP280_Temperature:%f \r\n",BMP280_Temperature);
printf("BMP280_Pressure:%f \r\n",BMP280_Pressure);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
AHT20 初始化时序
代码打包如下: