BARO模块BMP388气压计的PCB硬件设计和PX4驱动配置
- BMP388简介
- 硬件设计
- 封装
- 原理图
- PCB设计
- 引脚选择问题
- PX4驱动配置
- 飞控板的配置文件夹结构
- default.px4board文件
- nuttx-config/nsh/defconfig文件
- nuttx-config/include/board.h文件
- src/board_config.h文件
- src/i2c.cpp文件
- init/rc.board_sensors文件
- 编译BootLoader和Firmware并烧录进自己的飞控板
BMP388简介
BMP388是一款基于成熟传感原理的压力和温度测量数字传感器。
硬件设计
封装
采用了标准的LGA封装,单位是毫米。
引脚序号。
引脚定义。
原理图
使用I2C总线进行连接时的原理图。
使用I2C总线进行连接时的原理图。
PCB设计
我这里使用的是I2C总线进行连接,连接到MCU主控的I2C1接口。
主控选择的是STM32H743VIH6,I2C1总线是使用的SDA-PB9引脚、SCL-PB8引脚,气压计的数据准备完毕信号Data_Ready是使用PB7引脚,这些信息需要记录下来,之后在PX4配置中需要用到。
引脚选择问题
这里需要注意不是所有的引脚都可以作为BMP388的连接引脚,这个需要在给定的几种方案中选择。
对于主控STM32H743VIH6来说,有以下的引脚映射头文件。
引脚映射头文件stm32h7x3xx_pinmap.h
其中有以下内容:
#define GPIO_I2C1_SCL_1 (GPIO_ALT|GPIO_AF4|GPIO_SPEED_50MHz|GPIO_OPENDRAIN|GPIO_PORTB|GPIO_PIN6)
#define GPIO_I2C1_SCL_2 (GPIO_ALT|GPIO_AF4|GPIO_SPEED_50MHz|GPIO_OPENDRAIN|GPIO_PORTB|GPIO_PIN8)
#define GPIO_I2C1_SDA_1 (GPIO_ALT|GPIO_AF4|GPIO_SPEED_50MHz|GPIO_OPENDRAIN|GPIO_PORTB|GPIO_PIN7)
#define GPIO_I2C1_SDA_2 (GPIO_ALT|GPIO_AF4|GPIO_SPEED_50MHz|GPIO_OPENDRAIN|GPIO_PORTB|GPIO_PIN9)
#define GPIO_I2C1_SMBA (GPIO_ALT|GPIO_AF4|GPIO_SPEED_50MHz|GPIO_PUSHPULL|GPIO_PORTB|GPIO_PIN5)
所以I2C1总线的SCL引脚只能从PB6、PB8中选择,SDA引脚只能从PB7、PB9中选择。
对于数据准备完毕信号的选择,由于该信号使用的是STM32的外部中断输入功能,所以它们的外部中断号不能重复,比如PE3的外部中断号是EXTI3、PE4的外部中断号是EXTI4,如果使用了外部中断号是EXTI3的PE3,那么在之后的其他数据准备完毕信号的选择中就不能选择外部中断号是EXTI3的PA3、PB3、PC3等引脚。
PX4驱动配置
飞控板的配置文件夹结构
飞控板的配置文件夹结构为下列所示。
YanQi
├─extras
| └─UCAS_YanQi_bootloader.bin
├─init
| ├─rc.board_defaults
| └─rc.board_sensors
├─nuttx-config
| ├─bootloader
| | └─defconfig
| ├─include
| | ├─board.h
| | └─board_dma_map.h
| ├─nsh
| | └─defconfig
| ├─scripts
| | ├─bootloader_script.ld
| | └─script.ld
| ├─src
| └─Kconfig
├─src
| ├─board_config.h
| ├─bootloader_main.c
| ├─CMakeLists.txt
| ├─hw_config.h
| ├─i2c.cpp
| ├─init.c
| ├─...
| └─usb.c
├─bootloader.px4board
├─default.px4board
└─firmware.prototype
default.px4board文件
default.px4board文件是最常使用的文件,它负责配置每个串口的映射,配置哪些源码被编译到飞控固件中。由于需要使用BMP388的驱动,所以需要添加一行代码。
CONFIG_DRIVERS_BAROMETER_BMP388=y
nuttx-config/nsh/defconfig文件
nuttx-config/nsh/defconfig文件配置的是飞控固件中需要调用的底层资源,比如串口驱动、SPI驱动、I2C驱动等等。
这里使用的是I2C1总线,所以需要添加以下代码。
CONFIG_STM32H7_I2C1=y
nuttx-config/include/board.h文件
board.h文件用于配置NuttX操作系统中的时钟和引脚,对于所有具有多功能引脚(比如STM32中的有些引脚既可以作为UART也可以作为普通GPIO)的外围设备,NuttX需要知道每个引脚的设定功能,它们在芯片特定的引脚映射头文件stm32h7x3xx_pinmap.h中定义。
需要按照之前的原理图设计对应引脚映射头文件进行修改。
引脚映射头文件stm32h7x3xx_pinmap.h
I2C1的引脚定义设置的代码。
#define GPIO_I2C1_SCL GPIO_I2C1_SCL_2 /* PB8 */
#define GPIO_I2C1_SDA GPIO_I2C1_SDA_2 /* PB9 */#define GPIO_I2C1_SCL_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN8)
#define GPIO_I2C1_SDA_GPIO (GPIO_OUTPUT | GPIO_OPENDRAIN |GPIO_SPEED_50MHz | GPIO_OUTPUT_SET | GPIO_PORTB | GPIO_PIN9)
src/board_config.h文件
board_config.h文件是一些LED灯定义、ADC采样定义。需要按照之前的原理图设计的数据准备完毕信号进行配置。
#define GPIO_I2C1_DRDY1_BMP388 /* PB7 */ (GPIO_INPUT|GPIO_FLOAT|GPIO_EXTI|GPIO_PORTB|GPIO_PIN7)
src/i2c.cpp文件
需要启动I2C1总线。
constexpr px4_i2c_bus_t px4_i2c_buses[I2C_BUS_MAX_BUS_ITEMS] = {initI2CBusInternal(1),initI2CBusExternal(2),// initI2CBusExternal(3),// initI2CBusExternal(4),};
init/rc.board_sensors文件
rc.board_sensors文件作用是启动连接到板上的传感器。
-I 是 Internal I2C 启动,-X 是 External I2C 启动。
-a 后面是 I2C 地址。
# 内部 I2C 总线 BMP388 气压计
bmp388 -I -a 0x76 start
编译BootLoader和Firmware并烧录进自己的飞控板
在Firmware文件夹中输入命令即可对BootLoader和固件进行编译。
make UCAS_YanQi_bootloader
make UCAS_YanQi_default
没有安装烧录工具的先安装dfu-util烧录工具包。
sudo apt install dfu-util
按住飞控板上的BOOT键同时将USB线插入飞控板,进入DFU模式,运行命令即可进行BootLoader烧录。
dfu-util -a 0 --dfuse-address 0x08000000 -D ./build/UCAS_YanQi_bootloader/UCAS_YanQi_bootloader.bin
之后使用QGC安装UCAS_YanQi_default.px4飞控固件即可。