FR_NO_FILESYSTEM 问题解决了,不是没有文件系统,用示例都能正常写,硬件是没问题的。
归根到底还是DMA访问区域的问题
解决方法如下
1 将文件读写相关变量都分配在 0x24000000区域
2 MPU我使用了硬汉哥代码里的低速配置
[C] 纯文本查看 复制代码 /* ×î¸ßÐÔÄÜ£¬¶ÁCacheºÍдCache¶¼¿ªÆô */
#if 0 // 这里是低速
/* ÅäÖÃAXI SRAMµÄMPUÊôÐÔΪWrite back, Read allocate£¬Write allocate */
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.BaseAddress = 0x24000000;
MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER0;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;
MPU_InitStruct.SubRegionDisable = 0x00;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
/* ×îµÍÐÔÄÜ£¬¶ÁCacheºÍдCache¶¼¹Ø±Õ */
#else
/* ÅäÖÃAXI SRAMµÄMPUÊôÐÔΪWT, Read allocate£¬NO Write allocate */
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.BaseAddress = 0x24000000;
MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER0;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
MPU_InitStruct.SubRegionDisable = 0x00;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
#endif
/* Enables the MPU */
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
我的变量声明,文件操作相关的都需要分配到 0x24000000区域
FATFS fs __attribute__((section(".RAM_DATA")));
char buffer[512] __attribute__((section(".RAM_DATA"))); // 写入数据缓存
BYTE work_buffer[512] __attribute__((section(".RAM_DATA"))); // 格式化用的,还没用过功能未知,先分配个区域吧
FIL fil __attribute__((section(".RAM_DATA"))); // 文件对象,这个里面包含写入缓存,所以必须声明在DMA能访问的区域
附件是我的 *.ld 文件(文件后缀是ld,为了上传改成了txt),GCC编译器靠这个分配变量地址
关键部分代码,声明一个区域,地址是 RAM(0x24000000),4字节对齐
.RAM_AREA :
{
. = ALIGN(4);
*(.RAM_DATA)
} >RAM
|