STM32/GD32F4 在SDIO工作模型下DMA工作不正常总结

最近在使用GD32F407片子做快速读取的一个项目,借用了正点原子的内存管理方法,使用中发现了几个问题:

问题1.SDIO模式下,调试发现总是进入while(((DMA2->LISR&(1<<27))==RESET)&&timeout)timeout--;//等待传输完成 

解决办法:单步跟踪调试,发现硬件逻辑一切正常,最后怀疑是内存问题,果然发现,STM32/GD32在DMA操作时,访问内存时不能对CCM进行直接的访问

最后,将设计对CCM内存访问的函数

//为exfuns申请内存
//返回值:0,成功
//1,失败
uint8_t exfuns_init(void)
{
uint8_t i;
for(i = 0; i < _VOLUMES; i++)
{
fs[i] = (FATFS*)mymalloc( SRAMIN,sizeof(FATFS) ); //为磁盘i工作区申请内存
if( !fs[i] )
break;
}
file = (FIL*)mymalloc(SRAMIN,sizeof(FIL)); //为file申请内存
// ftemp = (FIL*)mymalloc(SRAMCCM,sizeof(FIL)); //为ftemp申请内存
fatbuf = (uint8_t*)mymalloc(SRAMIN,512); //为fatbuf申请内存
// if(i == _VOLUMES && file && ftemp && fatbuf)
if(i == _VOLUMES && file && fatbuf)
return 0; //申请有一个失败,即失败.
else
return 1;
}

改为SRAMIN,解决问题

posted @   求隐  阅读(2295)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示