文章目录
- SPI开发流程
- 一、新建一个RT_Thread工程
- 二、配置组件和驱动
- 三、原理图
- 四、配置宏
- 1.定义SPI总线相关的宏
- 2.打开HAL库函数对SPI总线的支持
- 五、用CubeMX生成SPI初始化函数
- 六.添加SPI总线
- 1.添加SPI初始化
- 2.执行程序
- 七、添加SPI从设备(W25Q)
- 1.新建W25Q文件
- 2.编写代码
- 3.编译,下载
- 4.测试
- 八、挂载文件系统
- 1.将W25Q抽象为块设备
- 2.挂载文件系统
- 3.编译,下载
- 九、操作
- 1.查看所有命令
- 2.列出文件目录
- 3.创建文件夹
- 4.新建文件
- 5.查看文件
- 6.删除文件
- 参考文档
官网文档
https://www.rtthread/document/site/rtthreadstudio/drivers/spi/rtthreadstudio-spi/
SPI开发流程
从官网中可以找到
一、新建一个RT_Thread工程
用RT_thread Studio工具创建一个工程,我这个使用的是ART_PI
然后在main函数中
修改为下面的代码,也就是注释掉 //LOG_D(“Hello RT-Thread!”);
二、配置组件和驱动
把下面这几个组件都开启
详细配置
三、原理图
分别对应的是
SPI1_NSS PA4
SPI1_MOSI PB5
SPI1_MISO PG9
SPI1_SCK PA5
四、配置宏
1.定义SPI总线相关的宏
2.打开HAL库函数对SPI总线的支持
五、用CubeMX生成SPI初始化函数
然后生成代码
找到SPI初始化部分
/**
* @brief SPI MSP Initialization
* This function configures the hardware resources used in this example
* @param hspi: SPI handle pointer
* @retval None
*/
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_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**SPI1 GPIO Configuration
PB5 ------> SPI1_MOSI
PG9 ------> SPI1_MISO
PA5 ------> SPI1_SCK
*/
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_9;
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(GPIOG, &GPIO_InitStruct);
GPIO_InitStruct.Pin = 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(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN SPI1_MspInit 1 */
/* USER CODE END SPI1_MspInit 1 */
}
}
六.添加SPI总线
1.添加SPI初始化
将上一步配置的SPI初始化代码添加到board.c下面
2.执行程序
编译,下载
此时SPI1添加成功
七、添加SPI从设备(W25Q)
1.新建W25Q文件
在工程下新建两个文件,别忘了添加头文件路径
2.编写代码
int rt_spi_opt_w25Q128_init(void)
{
/* 向系统注册SPI1总线上spi10从设备 */
rt_hw_spi_device_attach("spi1", "spi10", GPIOA, GPIO_PIN_4); // W25Q64的片选连接在PA4上
return 0;
}
3.编译,下载
设备挂载成功
4.测试
可以执行下面的代码去测试设备是否挂载成功。
八、挂载文件系统
1.将W25Q抽象为块设备
int rt_spi_opt_w25Q128_init(void)
{
/* 向系统注册SPI1总线上spi10从设备 */
rt_hw_spi_device_attach("spi1", "spi10", GPIOA, GPIO_PIN_4); // W25Q64的片选连接在PA4上
// return 0;
/* 将w25Q128抽象为块设备,以便后续挂载文件系统 */
if(rt_sfud_flash_probe("w25Q128", "spi10"))
{
rt_kprintf("rt sfud flash probe success\r\n");
return RT_EOK;
}else {
rt_kprintf("rt sfud flash probe fail\r\n");
return -RT_ERROR;
}
}
2.挂载文件系统
/* 挂载文件系统 */
int dfs_mount_init(void)
{
/* 指定格式化的文件系统,即将w25Q128格式化为ELM文件系统 */
dfs_mkfs("elm","w25Q128");
/* 挂载文件系统 */
if(dfs_mount("w25Q128","/","elm",0,0) == 0)
{
rt_kprintf("dfs_mount success\r\n");
return RT_EOK;
}
else {
rt_kprintf("dfs_mount fail\r\n");
return -RT_ERROR;
}
}
/* 系统启动时自动执行 */
INIT_ENV_EXPORT(dfs_mount_init); // 初始化执行顺序在注册flash之后
注意
程序设置自启动的规则
详细文档:程序自启
3.编译,下载
挂载文件系统成功。
九、操作
1.查看所有命令
help
原来系统的命令
新增的文件系统的命令
2.列出文件目录
3.创建文件夹
4.新建文件
5.查看文件
6.删除文件
参考文档
挂载文件系统:https://wwwblogs/Raowz/p/13069061.html
操作文件系统:https://blog.csdn/ylzmm/article/details/103088146
官方挂载文档:https://www.rt-thread/document/site/rtthreadstudio/drivers/spi/rtthread-studio-spi/
官方操作文档:https://www.rt-thread/document/site/programmingmanual/filesystem/filesystem/
文件系统应用:https://www.rt-thread/document/site/applicationnote/components/dfs/an0012-dfs/
文章目录
- SPI开发流程
- 一、新建一个RT_Thread工程
- 二、配置组件和驱动
- 三、原理图
- 四、配置宏
- 1.定义SPI总线相关的宏
- 2.打开HAL库函数对SPI总线的支持
- 五、用CubeMX生成SPI初始化函数
- 六.添加SPI总线
- 1.添加SPI初始化
- 2.执行程序
- 七、添加SPI从设备(W25Q)
- 1.新建W25Q文件
- 2.编写代码
- 3.编译,下载
- 4.测试
- 八、挂载文件系统
- 1.将W25Q抽象为块设备
- 2.挂载文件系统
- 3.编译,下载
- 九、操作
- 1.查看所有命令
- 2.列出文件目录
- 3.创建文件夹
- 4.新建文件
- 5.查看文件
- 6.删除文件
- 参考文档
官网文档
https://www.rtthread/document/site/rtthreadstudio/drivers/spi/rtthreadstudio-spi/
SPI开发流程
从官网中可以找到
一、新建一个RT_Thread工程
用RT_thread Studio工具创建一个工程,我这个使用的是ART_PI
然后在main函数中
修改为下面的代码,也就是注释掉 //LOG_D(“Hello RT-Thread!”);
二、配置组件和驱动
把下面这几个组件都开启
详细配置
三、原理图
分别对应的是
SPI1_NSS PA4
SPI1_MOSI PB5
SPI1_MISO PG9
SPI1_SCK PA5
四、配置宏
1.定义SPI总线相关的宏
2.打开HAL库函数对SPI总线的支持
五、用CubeMX生成SPI初始化函数
然后生成代码
找到SPI初始化部分
/**
* @brief SPI MSP Initialization
* This function configures the hardware resources used in this example
* @param hspi: SPI handle pointer
* @retval None
*/
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_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**SPI1 GPIO Configuration
PB5 ------> SPI1_MOSI
PG9 ------> SPI1_MISO
PA5 ------> SPI1_SCK
*/
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_9;
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(GPIOG, &GPIO_InitStruct);
GPIO_InitStruct.Pin = 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(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN SPI1_MspInit 1 */
/* USER CODE END SPI1_MspInit 1 */
}
}
六.添加SPI总线
1.添加SPI初始化
将上一步配置的SPI初始化代码添加到board.c下面
2.执行程序
编译,下载
此时SPI1添加成功
七、添加SPI从设备(W25Q)
1.新建W25Q文件
在工程下新建两个文件,别忘了添加头文件路径
2.编写代码
int rt_spi_opt_w25Q128_init(void)
{
/* 向系统注册SPI1总线上spi10从设备 */
rt_hw_spi_device_attach("spi1", "spi10", GPIOA, GPIO_PIN_4); // W25Q64的片选连接在PA4上
return 0;
}
3.编译,下载
设备挂载成功
4.测试
可以执行下面的代码去测试设备是否挂载成功。
八、挂载文件系统
1.将W25Q抽象为块设备
int rt_spi_opt_w25Q128_init(void)
{
/* 向系统注册SPI1总线上spi10从设备 */
rt_hw_spi_device_attach("spi1", "spi10", GPIOA, GPIO_PIN_4); // W25Q64的片选连接在PA4上
// return 0;
/* 将w25Q128抽象为块设备,以便后续挂载文件系统 */
if(rt_sfud_flash_probe("w25Q128", "spi10"))
{
rt_kprintf("rt sfud flash probe success\r\n");
return RT_EOK;
}else {
rt_kprintf("rt sfud flash probe fail\r\n");
return -RT_ERROR;
}
}
2.挂载文件系统
/* 挂载文件系统 */
int dfs_mount_init(void)
{
/* 指定格式化的文件系统,即将w25Q128格式化为ELM文件系统 */
dfs_mkfs("elm","w25Q128");
/* 挂载文件系统 */
if(dfs_mount("w25Q128","/","elm",0,0) == 0)
{
rt_kprintf("dfs_mount success\r\n");
return RT_EOK;
}
else {
rt_kprintf("dfs_mount fail\r\n");
return -RT_ERROR;
}
}
/* 系统启动时自动执行 */
INIT_ENV_EXPORT(dfs_mount_init); // 初始化执行顺序在注册flash之后
注意
程序设置自启动的规则
详细文档:程序自启
3.编译,下载
挂载文件系统成功。
九、操作
1.查看所有命令
help
原来系统的命令
新增的文件系统的命令
2.列出文件目录
3.创建文件夹
4.新建文件
5.查看文件
6.删除文件
参考文档
挂载文件系统:https://wwwblogs/Raowz/p/13069061.html
操作文件系统:https://blog.csdn/ylzmm/article/details/103088146
官方挂载文档:https://www.rt-thread/document/site/rtthreadstudio/drivers/spi/rtthread-studio-spi/
官方操作文档:https://www.rt-thread/document/site/programmingmanual/filesystem/filesystem/
文件系统应用:https://www.rt-thread/document/site/applicationnote/components/dfs/an0012-dfs/