96SEO 2026-02-20 02:29 13
BMP280是在BMP180基础上增强的绝对气压传感器在飞控领域的高度识别方面应用也比较多。

BMP280和STM32可以通过SPI或者I2C总线实现访问连接I2C接口连接管脚少这里采用I2C接口实现连接。
这里采用GPIO模拟I2C协议的方式所以随意找2个管脚作为SCL和SDA。
用I2C总线连接时BMP280的SDO管脚的电平状态用作I2C地址低位的选择。
这里以STM32F401CCU6和STM32CUBEIDE开发环境为例实现BMP280的访问读取数据采用USB虚拟串口或普通串口方式打印输出。
代码逻辑识别USB虚拟串口是否连接如果连接则通过USB虚拟串口打印输出否则通过普通串口打印输出。
上电或重启后STM32对BMP280进行初始化如果失败则打印输出报错信息如果成功则循环进行检测和输出压力高度和温度值。
BMP280_CalTemperatureAndPressureAndAltitude(int32_t
{SCL_OUT_H;SDA_OUT_H;PY_Delay_us_t(100000);}void
;SDA_OUT_H;SCL_OUT_H;PY_Delay_us_t(us_num/2)
;SDA_OUT_L;PY_Delay_us_t(us_num/2)
{SCL_OUT_L;PY_Delay_us_t(us_num)
;SDA_OUT_L;PY_Delay_us_t(us_num)
;SCL_OUT_H;PY_Delay_us_t(us_num)
;SDA_OUT_H;PY_Delay_us_t(us_num)
;SDA_OUT_L;PY_Delay_us_t(us_num/2)
;SCL_OUT_H;PY_Delay_us_t(us_num)
status0;SCL_OUT_L;PY_Delay_us_t(us_num/2)
;SDA_OUT_H;PY_Delay_us_t(us_num/2)
SDA_IN;SCL_OUT_H;PY_Delay_us_t(us_num)
i0;i8;i){PY_Delay_us_t(us_num/2)
SDA_OUT_L;txd1;PY_Delay_us_t(us_num/2)
;SCL_OUT_H;PY_Delay_us_t(us_num)
){SCL_OUT_L;PY_Delay_us_t(us_num/2)
;SDA_OUT_H;PY_Delay_us_t(us_num/2)
(0x1e1)if(BMP280_I2C_ADDR_SEL0)
(0x771)I2C_Start();I2C_Send_Byte(daddr);I2C_Read_Ack();I2C_Send_Byte(WrAddr);I2C_Read_Ack();I2C_Send_Byte(data);I2C_Read_Ack();I2C_Stop();}uint8_t
(0x771)I2C_Start();I2C_Send_Byte(daddr);I2C_Read_Ack();I2C_Send_Byte(RdAddr);I2C_Read_Ack();I2C_Start();I2C_Send_Byte(daddr1);I2C_Read_Ack();RegValueI2C_Read_Byte(0);I2C_Stop();return
BMP280_Compensate_Temperature(int32_t
BMP280_Compensate_Pressure(int32_t
BMP280_ReadReg(BMP280_PRESS_XLSB_REG);lsb
BMP280_ReadReg(BMP280_PRESS_LSB_REG);msb
BMP280_ReadReg(BMP280_PRESS_MSB_REG);adc_P
BMP280_Compensate_Pressure(adc_P);
BMP280_Get_Temperature_And_Pressure(double
BMP280_ReadReg(BMP280_TEMP_XLSB_REG);lsb
BMP280_ReadReg(BMP280_TEMP_LSB_REG);msb
BMP280_ReadReg(BMP280_TEMP_MSB_REG);adc_T
BMP280_Compensate_Temperature(adc_T);xlsb
BMP280_ReadReg(BMP280_PRESS_XLSB_REG);lsb
BMP280_ReadReg(BMP280_PRESS_LSB_REG);msb
BMP280_ReadReg(BMP280_PRESS_MSB_REG);adc_P
BMP280_Compensate_Pressure(adc_P);
BMP280_CalculateAbsoluteAltitude(int32_t
BMP280_CalTemperatureAndPressureAndAltitude(int32_t
BMP280_Filter[3];BMP280_Get_Temperature_And_Pressure(CurTemperature,
CurPressure);BMP280_CalAvgValue(BMP280_Filter[0].Index,
pressure);BMP280_CalculateAbsoluteAltitude(CurAltitude,
(*pressure));BMP280_CalAvgValue(BMP280_Filter[1].Index,
Altitude);BMP280_CalAvgValue(BMP280_Filter[2].Index,
BMP280_ReadReg(BMP280_DIG_T1_LSB_REG);msb
BMP280_ReadReg(BMP280_DIG_T1_MSB_REG);dig_T1
BMP280_ReadReg(BMP280_DIG_T2_LSB_REG);msb
BMP280_ReadReg(BMP280_DIG_T2_MSB_REG);dig_T2
BMP280_ReadReg(BMP280_DIG_T3_LSB_REG);msb
BMP280_ReadReg(BMP280_DIG_T3_MSB_REG);dig_T3
BMP280_ReadReg(BMP280_DIG_P1_LSB_REG);msb
BMP280_ReadReg(BMP280_DIG_P1_MSB_REG);dig_P1
BMP280_ReadReg(BMP280_DIG_P2_LSB_REG);msb
BMP280_ReadReg(BMP280_DIG_P2_MSB_REG);dig_P2
BMP280_ReadReg(BMP280_DIG_P3_LSB_REG);msb
BMP280_ReadReg(BMP280_DIG_P3_MSB_REG);dig_P3
BMP280_ReadReg(BMP280_DIG_P4_LSB_REG);msb
BMP280_ReadReg(BMP280_DIG_P4_MSB_REG);dig_P4
BMP280_ReadReg(BMP280_DIG_P5_LSB_REG);msb
BMP280_ReadReg(BMP280_DIG_P5_MSB_REG);dig_P5
BMP280_ReadReg(BMP280_DIG_P6_LSB_REG);msb
BMP280_ReadReg(BMP280_DIG_P6_MSB_REG);dig_P6
BMP280_ReadReg(BMP280_DIG_P7_LSB_REG);msb
BMP280_ReadReg(BMP280_DIG_P7_MSB_REG);dig_P7
BMP280_ReadReg(BMP280_DIG_P8_LSB_REG);msb
BMP280_ReadReg(BMP280_DIG_P8_MSB_REG);dig_P8
BMP280_ReadReg(BMP280_DIG_P9_LSB_REG);msb
BMP280_ReadReg(BMP280_DIG_P9_MSB_REG);dig_P9
BMP280_ReadReg(BMP280_REGISTER_CHIPID);u8CtrlMod
BMP280_ReadReg(BMP280_REGISTER_CONTROL);u8Status
BMP280_ReadReg(BMP280_REGISTER_STATUS);if(u8ChipID
0x58){if(USB_CONN_STATUS()){sprintf(console,
u8ChipID,u8CtrlMod,u8Status);CDC_Transmit_FS((uint8_t*)console,
strlen(console));}else{printf(\r\nBMP280
u8ChipID,u8CtrlMod,u8Status);}BMP280_WriteReg(BMP280_REGISTER_CONTROL,
registerBMP280_WriteReg(BMP280_REGISTER_CONFIG,
registerBMP280_Read_Calibration();}else{if(USB_CONN_STATUS()){sprintf(console,
u8ChipID,u8CtrlMod,u8Status);CDC_Transmit_FS((uint8_t*)console,
strlen(console));}else{printf(\r\nBMP280
u8ChipID,u8CtrlMod,u8Status);}return
main.c文件的实现功能测试代码注意这里把BMP280管脚SDO拉到了高电平所以定义为#define
/*********************************************************************************
body*******************************************************************************
AS-IS.********************************************************************************/
------------------------------------------------------------------*/
----------------------------------------------------------*/
-----------------------------------------------------------*/
(uint32_t)(Delay*usDelayBase);delayReg
HAL_GetTick();PY_Delay_us_t(1000000)
((float)1000)/(secondms-firstms);usDelayBase
(uint32_t)((Delay%1000)*usDelayBase);if(msNum0)
------------------------------------------------------------*/
-------------------------------------------------------------*/
---------------------------------------------------------*/
-----------------------------------------------*/
---------------------------------------------------------*/
abs(dn);if(dn%base0){for(uint8_t
0);}return;}else{if(flen1){sprintf(mc,
j1;jflen;j){if((dn%base)pow(10,j)){for(uint8_t
Configuration--------------------------------------------------------*//*
*/MX_GPIO_Init();MX_USB_DEVICE_Init();MX_USART1_UART_Init();/*
*/PY_usDelayTest();PY_usDelayOptimize();I2C_Init();BMP280_Init();PY_Delay_us_t(100000);
(1){BMP280_CalTemperatureAndPressureAndAltitude(TemperatureVal,
AltitudeVal);if(USB_CONN_STATUS()){sprintf(console,
CDC_Transmit_FS((uint8_t*)console,
PY_Delay_us_t(1);py_f2s4printf(mychar,
CDC_Transmit_FS((uint8_t*)console,
PY_Delay_us_t(1);py_f2s4printf(mychar,
CDC_Transmit_FS((uint8_t*)console,
PY_Delay_us_t(1);py_f2s4printf(mychar,
CDC_Transmit_FS((uint8_t*)console,
PY_Delay_us_t(1);}else{printf(\r\n\r\n-----------------------------------------------);py_f2s4printf(mychar,
mychar);}PY_Delay_us_t(200000);/*
voltage*/__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);/**
structure.*/RCC_OscInitStruct.OscillatorType
RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState
RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState
RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource
RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM
RCC_PLLP_DIV4;RCC_OscInitStruct.PLL.PLLQ
(HAL_RCC_OscConfig(RCC_OscInitStruct)
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
(HAL_RCC_ClockConfig(RCC_ClkInitStruct,
UART_WORDLENGTH_8B;huart1.Init.StopBits
UART_STOPBITS_1;huart1.Init.Parity
UART_PARITY_NONE;huart1.Init.Mode
UART_MODE_TX_RX;huart1.Init.HwFlowCtl
UART_HWCONTROL_NONE;huart1.Init.OverSampling
*/__HAL_RCC_GPIOH_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure
GPIO_PIN_12|GPIO_PIN_13;GPIO_InitStruct.Mode
GPIO_MODE_OUTPUT_OD;GPIO_InitStruct.Pull
GPIO_PULLUP;GPIO_InitStruct.Speed
GPIO_SPEED_FREQ_VERY_HIGH;HAL_GPIO_Init(GPIOB,
注意芯片内部已经配置选用了滤波功能采用滤波功能后的输出速率不高对于外部进行静态高度测量可以再进行取多次平均的算法如果是运动过程高度测量则不必再采用平均算法。
另外可以给
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback