今天开启一个新任务,在STM32F746 Discovery 板上,移植FileX文件系统,使用QSPI Flash作为存储媒介。板上QSPI Flash型号为 W25Q128A, 在STCube的固件库中,已有该器件的应用例程,编译运行例程来验证该Flash芯片读写正常后,按照FileX的驱动框架,实现驱动设计。
设计实现过程中,会记录相关的设计流程与技术细节,并持续更新,直到完成。
软件开发基于IAR 9.1,已正常运行了 ThreadX,并编译通过了 FileX核心文件,现在开始QSPI 驱动设计。
Flash需要读写操作,因此不能工作在内存映射模式,只能使用中断或DMA,通过接口来实现读写操作。
1. 创建驱动文件
- 参考SD卡驱动文件,创建QSPI驱动文件 “fx_stm32_qspi_driver.c”,并实现空的驱动入口函数:
VOID _fx_stm32_qspi_driver(FX_MEDIA *media_ptr)
{
}
- 驱动中,主要实现 ⑴初始化、⑵读取、⑶写入、⑷Boot读取、⑸Boot写入、⑹Flush等几个重要访问操作
- 驱动中打算基于DMA来做读写传输,因此需要在传输过程中,阻塞下一次操作,并挂起访问线程,因此使用信号量来对QSPI访问加锁
- 开发板资源中,已在驱动文件 “stm32746g_discovery_qspi.c” 中提供了底层的QSPI访问函数,因此第一步,仅在驱动中调用这几个访问函数:
VOID _fx_stm32_qspi_driver(FX_MEDIA *media_ptr)
{
UINT status;
uint8_t QSPI_Status;
ULONG partition_start;
ULONG partition_size;
switch(media_ptr -> fx_media_driver_request)
{
case FX_DRIVER_READ:
{
QSPI_Status = BSP_QSPI_Read(media_ptr -> fx_media_driver_buffer, (media_ptr -> fx_media_driver_logical_sector + media_ptr -> fx_media_hidden_sectors)*256, media_ptr -> fx_media_driver_sectors * media_ptr -> fx_media_bytes_per_sector);
if(QSPI_Status==QSPI_OK)
{
media_ptr -> fx_media_driver_status = FX_SUCCESS;
}
else
{
media_ptr -> fx_media_driver_status = FX_IO_ERROR;
}
break;
}
case FX_DRIVER_WRITE:
{
QSPI_Status = BSP_QSPI_Write(media_ptr -> fx_media_driver_buffer, (media_ptr -> fx_media_driver_logical_sector + media_ptr -> fx_media_hidden_sectors)*256, media_ptr -> fx_media_driver_sectors * media_ptr -> fx_media_bytes_per_sector);
if(QSPI_Status==QSPI_OK)
{
media_ptr -> fx_media_driver_status = FX_SUCCESS;
}
else
{
media_ptr -> fx_media_driver_status = FX_IO_ERROR;
}
break;
}
case FX_DRIVER_FLUSH:
{
media_ptr -> fx_media_driver_status = FX_SUCCESS;
break;
}
case FX_DRIVER_ABORT:
{
media_ptr -> fx_media_driver_status = FX_SUCCESS;
break;
}
case FX_DRIVER_INIT:
{
if(tx_semaphore_create(&semaphore_transfer, "QSPI transfer semaphore", 0) != TX_SUCCESS)
{
media_ptr -> fx_media_driver_status = FX_IO_ERROR;
break;
}
if(BSP_QSPI_Init()==QSPI_OK)
media_ptr -> fx_media_driver_status = FX_SUCCESS;
else
media_ptr -> fx_media_driver_status = FX_IO_ERROR;
break;
}
case FX_DRIVER_UNINIT:
{
tx_semaphore_delete(&semaphore_transfer);
media_ptr -> fx_media_driver_status = FX_SUCCESS;
break;
}
case FX_DRIVER_BOOT_READ:
{
QSPI_Status = BSP_QSPI_Read(media_ptr -> fx_media_driver_buffer,0,media_ptr -> fx_media_driver_sectors * 256);
if(QSPI_Status!=QSPI_OK)
{
media_ptr -> fx_media_driver_status = FX_IO_ERROR;
return;
}
partition_start = 0;
status = _fx_partition_offset_calculate(media_ptr -> fx_media_driver_buffer, 0,
&partition_start, &partition_size);
if (status)
{
media_ptr -> fx_media_driver_status = FX_IO_ERROR;
return;
}
if (partition_start)
{
QSPI_Status = BSP_QSPI_Read<

本文详细记录了在STM32F746 Discovery板上移植FileX文件系统,使用QSPIFlash作为存储媒介的过程。涉及驱动设计、DMA传输、中断处理、LevelX集成及问题解决。作者通过调试和配置,解决了根目录限制、文件命名问题和Flash写入错误,确保了文件系统的稳定性和兼容性。
最低0.47元/天 解锁文章
1935

被折叠的 条评论
为什么被折叠?



