你有没有在env中使能SPI?
如果使能了,你的rtconfig.h中应该如下内容。若没有,你肯定没有打开总的SPI开关。
#define RT_USING_SPI
是否在board.h中使能对应的SPIx?如下示例代码使能了SPI1和SPI2,且SPI2使用DMA
#define BSP_USING_SPI1
#define BSP_USING_SPI2
#define BSP_SPI2_TX_USING_DMA
#define BSP_SPI2_RX_USING_DMA
在RT-Thraed中使能SPI的具体过程,在board.h中有详细说明,按照步骤来不会错。以下comments代码摘自board.h
/** if you want to use spi bus you can use the following instructions.
*
* STEP 1, open spi driver framework support in the RT-Thread Settings file
*
* STEP 2, define macro related to the spi bus
* such as #define BSP_USING_SPI1
*
* STEP 3, copy your spi init function from stm32xxxx_hal_msp.c generated by stm32cubemx to the end of board.c file
* such as void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
*
* STEP 4, modify your stm32xxxx_hal_config.h file to support spi peripherals. define macro related to the peripherals
* such as #define HAL_SPI_MODULE_ENABLED
*/
你现在在链接过程中出错,大概率是你没有打开RT_USING_SPI开关。
至于在board.h中添加HAL_SPI_MspInit的原因,你可以从查找HAL_SPI_MspInit开始,逐步分析函数调用过程,最终形成个人理解的SPI初始化过程。这个函数在stm32f4xxhal_spi.c中是\\_weak 形式,即,若用户代码定义了HAL_SPI_MspInit,则调用用户撰写的函数,否则调用该文件的函数。
RTT对驱动进行了抽象处理,分层结构良好,最底层的硬件引脚初始化为SPI功能,就是在该函数中实现的。
这个函数可以不放在board.c中,可以放置到任何一个*.c中。但是,board的意思不就是电路板吗?这部分与硬件完全相关,其他部分与硬件关联不大。以后你换一个芯片的话,只需要在board部分修改对应的SPI引脚初始化代码即可,相当于软件与硬件做了一个解耦处理,软件架构更清晰,代码与硬件依赖度进一步降低,对开发者而言是一件比较方便的事情。