当前位置: 首页 > news >正文

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 初始化时序
在这里插入图片描述
代码打包如下:

相关文章:

  • 有必要使用 Oracle 向量数据库吗?
  • 蓝桥杯省赛真题C++B组-裁纸刀2022
  • postgresql14编译安装脚本
  • 怎么实现: 大语言模型微调案例
  • AI能否跨越奇点
  • RabbitMQ使用延迟消息
  • 升级到碳纤维齿轮是否值得?
  • CCF-CSP认证 202104-2邻域均值
  • 【js逆向】
  • 牛客周赛:84:C:JAVA
  • 亚信安全发布第七期《勒索家族和勒索事件监控报告》
  • 以太网基础Vlan划分实验
  • C++学习之QT综合项目二经典翻金币小游戏及打包
  • 【LeetCode合并区间C++实现】【c++】【合并区间】
  • javase集合框架List篇
  • ds回答 什么是数据召回
  • 【数据结构】二叉搜索树、平衡搜索树、红黑树
  • 【初探数据结构】带环链表:原理、判断与数学证明
  • 使用 Switch Plus 将 ADTS 文件转为 MP3 格式简单教程
  • 「mysql」Mac mysql一路畅通式安装
  • 释新闻|新加坡大选今日投票:除了黄循财首次挂帅,还有哪些看点
  • 消费持续升温,这个“五一”假期有何新亮点?
  • 魔都眼|咖啡节上小孩儿忍不住尝了咖啡香,母亲乐了
  • 2025年五一档电影新片票房破3亿
  • 乘客被困停滞车厢超4小时,哈尔滨铁路局客服:列车晚点,表示歉意
  • 一周文化讲座|那些年的年青人