29#include "i2c_spi_interface.h"
49#define LOCAL_QNH_CALIBRATION
51#ifdef LOCAL_QNH_CALIBRATION
53#define SEA_LEVEL_PRESSURE_PA 102057.7
56#define SEA_LEVEL_PRESSURE_PA 101325.0
99#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
103 HAL_UART_Transmit(&
huart1, (uint8_t *)&ch, 1, 0xFFFF);
111 __HAL_TIM_SET_COUNTER(&
htim1, 0);
112 while (__HAL_TIM_GET_COUNTER(&
htim1) < us);
126 return altitudeM * 3.28084;
164 HAL_TIM_Base_Start(&
htim1);
166 printf(
"\x1b[2J\x1b[H");
170 uint16_t settings_sel;
171 struct bmp3_settings settings = { 0 };
176 bmp3_interface_init(&
bmp390, BMP3_I2C_INTF);
177 rslt = bmp3_init(&
bmp390);
181 printf(
"BMP3 init OK, chip_id=0x%02X\r\n",
bmp390.chip_id);
183 settings.press_en = BMP3_ENABLE;
184 settings.temp_en = BMP3_ENABLE;
185 settings.odr_filter.press_os = BMP3_OVERSAMPLING_2X;
186 settings.odr_filter.temp_os = BMP3_OVERSAMPLING_2X;
187 settings.odr_filter.odr = BMP3_ODR_25_HZ;
189 settings_sel = BMP3_SEL_PRESS_EN | BMP3_SEL_TEMP_EN | BMP3_SEL_PRESS_OS | BMP3_SEL_TEMP_OS | BMP3_SEL_ODR;
191 rslt = bmp3_set_sensor_settings(settings_sel, &settings, &
bmp390);
192 bmp3_check_rslt(
"bmp3_set_sensor_settings", rslt);
194 settings.op_mode = BMP3_MODE_NORMAL;
195 rslt = bmp3_set_op_mode(&settings, &
bmp390);
196 bmp3_check_rslt(
"bmp3_set_op_mode", rslt);
200 printf(
"BMP3 init FAILED, rslt=%d\r\n", rslt);
215 struct bmp3_status status = { { 0 } };
216 struct bmp3_data data = { 0 };
218 rslt = bmp3_get_status(&status, &
bmp390);
220 if ((rslt == BMP3_OK) && (status.intr.drdy == BMP3_ENABLE))
222 rslt = bmp3_get_sensor_data(BMP3_PRESS_TEMP, &data, &
bmp390);
226 double tempF = (data.temperature * 9.0 / 5.0) + 32.0;
228 double pressureInHg = data.pressure * 0.0002952998751;
231 printf(
"T: %.2f degF, P: %.2f Pa, %.2f inHg, Alt: %.2f ft\r\n", tempF, data.pressure, pressureInHg,
236 rslt = bmp3_get_status(&status, &
bmp390);
252 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
253 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
257 __HAL_RCC_PWR_CLK_ENABLE();
258 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
263 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
264 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
265 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
266 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
267 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
268 RCC_OscInitStruct.PLL.PLLM = 8;
269 RCC_OscInitStruct.PLL.PLLN = 180;
270 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
271 RCC_OscInitStruct.PLL.PLLQ = 4;
272 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
279 if (HAL_PWREx_EnableOverDrive() != HAL_OK)
286 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
287 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
288 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
289 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
290 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
291 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
293 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
312 hi2c1.Instance = I2C1;
313 hi2c1.Init.ClockSpeed = 100000;
314 hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
315 hi2c1.Init.OwnAddress1 = 0;
316 hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
317 hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
318 hi2c1.Init.OwnAddress2 = 0;
319 hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
320 hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
321 if (HAL_I2C_Init(&
hi2c1) != HAL_OK)
328 if (HAL_I2CEx_ConfigAnalogFilter(&
hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
335 if (HAL_I2CEx_ConfigDigitalFilter(&
hi2c1, 0) != HAL_OK)
355 TIM_ClockConfigTypeDef sClockSourceConfig = {0};
356 TIM_MasterConfigTypeDef sMasterConfig = {0};
361 htim1.Instance = TIM1;
362 htim1.Init.Prescaler = 180 - 1;
363 htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
364 htim1.Init.Period = 65535;
365 htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
366 htim1.Init.RepetitionCounter = 0;
367 htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
368 if (HAL_TIM_Base_Init(&
htim1) != HAL_OK)
372 sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
373 if (HAL_TIM_ConfigClockSource(&
htim1, &sClockSourceConfig) != HAL_OK)
377 sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
378 sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
379 if (HAL_TIMEx_MasterConfigSynchronization(&
htim1, &sMasterConfig) != HAL_OK)
403 huart1.Init.BaudRate = 19200;
404 huart1.Init.WordLength = UART_WORDLENGTH_8B;
405 huart1.Init.StopBits = UART_STOPBITS_1;
406 huart1.Init.Parity = UART_PARITY_NONE;
407 huart1.Init.Mode = UART_MODE_TX_RX;
408 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
409 huart1.Init.OverSampling = UART_OVERSAMPLING_16;
410 if (HAL_UART_Init(&
huart1) != HAL_OK)
430 __HAL_RCC_GPIOC_CLK_ENABLE();
431 __HAL_RCC_GPIOH_CLK_ENABLE();
432 __HAL_RCC_GPIOA_CLK_ENABLE();
433 __HAL_RCC_GPIOB_CLK_ENABLE();
448#ifdef REDIRECT_PRINTF
451 snprintf(buf,
sizeof(buf),
452 "Trapped in _Error_Handler(). Called from: %s, line: %d\r\n",
466#ifdef USE_FULL_ASSERT
474void assert_failed(uint8_t *file, uint32_t line)
485#ifdef REDIRECT_PRINTF
489 snprintf(buf,
sizeof(buf),
490 "assert_param failed: file %s, line %lu\r\n",
491 (
char *)file, (
unsigned long)line);
static void MX_TIM1_Init(void)
TIM1 Initialization Function.
TIM_HandleTypeDef htim1
TIM1 handle, used as delayUS()'s free-running microsecond counter.
UART_HandleTypeDef huart1
USART1 handle, used for printf() output via REDIRECT_PRINTF.
static void MX_I2C1_Init(void)
I2C1 Initialization Function.
static double calculateAltitudeFt(double pressurePa)
Converts pressure to altitude using the barometric formula (International Standard Atmosphere model),...
static void MX_USART1_UART_Init(void)
USART1 Initialization Function.
void SystemClock_Config(void)
System Clock Configuration.
#define SEA_LEVEL_PRESSURE_PA
Sea-level pressure (Pa) used as the altitude reference.
int main(void)
The application entry point.
static struct bmp3_dev bmp390
BMP390 driver device handle (Bosch bmp3_dev).
void _Error_Handler(const char *file, int line)
Reports a fatal error and halts. See _Error_Handler() in main.c.
void delayUS(uint16_t us)
Busy-waits for the given number of microseconds using TIM1 (1 MHz counter – see MX_TIM1_Init()'s pres...
static I2C_SPI_Interface bmp390Intf
I2C bus/address binding passed to the BMP390 driver as intf_ptr.
static void MX_GPIO_Init(void)
GPIO Initialization Function.
I2C_HandleTypeDef hi2c1
I2C1 handle, used by the BMP390 driver's read/write callbacks.
: Header for main.c file. This file contains the common defines of the application.
#define Error_Handler()
Calls _Error_Handler() with the caller's own file/line.