基于STM32的LoRa节点MB1296D通过SPI驱动MS5803的代码疑问
关于STM32+MS5803 SPI编程中宏定义的疑问解答
我来帮你拆解这些新手常遇到的疑问,咱们分两部分说清楚:
一、代码开头定义的宏具体作用是什么?
宏定义本质是给特定数值/表达式起一个易懂的“别名”,在MS5803的SPI代码里,这些宏一般分三类,作用非常实用:
- 传感器引脚/外设绑定宏:比如
#define MS5803_CS_GPIO_PORT GPIOB、#define MS5803_CS_PIN GPIO_PIN_5,这类宏是把STM32上控制MS5803片选的引脚固定下来,后续代码里直接用宏名操作,不用反复写冗长的引脚全称,而且哪天要换引脚,只需要改这两行就行,不用到处找代码修改; - 传感器命令字宏:比如
#define MS5803_RESET_CMD 0x1E、#define MS5803_READ_PRESSURE 0x40,这些十六进制数是MS5803芯片手册里明确规定的通信命令,用宏代替“魔法数字”后,别人(或者半年后的你)看代码一眼就知道这行是在发复位命令,而不是对着个0x1E一脸懵; - SPI配置相关宏:比如
#define MS5803_SPI_INSTANCE &hspi2,用来指定代码使用STM32的哪个SPI外设,后续所有SPI读写操作都基于这个宏,要是换SPI通道,改一行宏定义就搞定,不用重构大量代码。
二、其中的十六进制数值是否与所用微控制器相关?
得分两种情况看:
- 和STM32无关的数值:比如刚才提到的传感器命令字(0x1E、0x40这类),这些是MS5803硬件本身规定的通信协议,不管你用STM32、Arduino还是其他MCU,只要和这个传感器SPI通信,就必须用这些数值,和MCU型号完全没关系;
- 和STM32相关的数值:比如SPI波特率分频的宏
#define SPI_BAUDRATE_PRESCALER 0x00000003(对应HAL库的SPI_BAUDRATEPRESCALER_8),或者GPIO引脚的宏值,这些是STM32的库(HAL/标准库)定义的,和你用的STM32系列(比如F1、F4、L0)有关,不同系列的库可能会有枚举值或宏的细微差异,需要对应你MCU的官方库文档来确认。
如果你要自己编写这部分代码,记得先啃透MS5803的 datasheet 找全所有命令字,再对照STM32的参考手册或库文档确认外设配置的宏,这样踩坑会少很多~
内容的提问来源于stack exchange,提问作者user9158336
相关产品推荐
相关产品推荐

