FileX + LevelX + QSPI Flash 在STM32F746 Discovery 板上的移植与应用

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

今天开启一个新任务,在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<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值