第5版硬件出炉,外挂了W25Q64在stm32 的SPI1上,引脚如下。
CS->PA15
SCK->PB3
MISO->PB4
MOSI->PB5
注意以上引脚也有SPI3,应该区别不大。
1.生成SPI引脚初始化。这里有个坑,不要初始化CS脚。
按照官方说明,在board.c的最后面添加SPI这些IO的初始化过程,有说从CubeMX里拷的,其实自己玩过HAL库的也不用那么麻烦,只是GPIO初始化而已,自己写一个,随便找个地方初始化也可以的。
注意,函数的hspi在里面我在生成的时候初始化CS了,后来又注掉了。我是把这个函数放在board.c的最前面了,可以用,也有说可以放在drv_spi.c里面,应该都一样。
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(hspi->Instance==SPI1)
{
/* USER CODE BEGIN SPI1_MspInit 0 */
/* USER CODE END SPI1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_SPI1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**SPI1 GPIO Configuration
PA15 ------> SPI1_NSS
PB3 ------> SPI1_SCK
PB4 ------> SPI1_MISO
PB5 ------> SPI1_MOSI
*/
/*
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
*/
GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* USER CODE BEGIN SPI1_MspInit 1 */
/* USER CODE END SPI1_MspInit 1 */
}
}
2.加宏定义。
设置里面打开SPI驱动,SFUD驱动。
board.h打开#define BSP_USING_SPI1。这里打开的上面也有写打开SPI的步骤。
stm32f4xx_hal_config.h 打开#define HAL_SPI_MODULE_ENABLED
3.main函数初始化
前面
#include "drv_spi.h"
#include "spi_flash_sfud.h"
下面函数里面:
rt_hw_spi_device_attach("spi1","spi10",GPIOA,GPIO_PIN_15);
if(rt_sfud_flash_probe("w25q64","spi10"))
{
rt_kprintf("rt sfud flash success");
}
else {
rt_kprintf("rt sfud flash error");
}
SPI1是你把这flash挂到哪个SPI总线上了。
spi10是你准备叫这个挂载的设备的名字,这里的含义是spi1的第0个设备。片选CS脚是GPIOA,Pin 15。
下一句是sfud设备的名字是w25q64,在spi10设备上,挂好了就打印 success,其实他挂载好了会在后台打很多很多东西。
其他坑:
undefined reference to rt_hw_spi_device_attach
看我上一篇笔记:
https://blog.csdn.net/qq_35593582/article/details/119064608?spm=1001.2014.3001.5501
我在这个过程中总共遇到2次这个坑,解决方法相同。
下一步:
挂到EasyFlash上用,等我慢慢看看如何配置。