参考链接
链接1 https://community.st.com/s/question/0D50X00009XkbPxSAJ/stm32f407-teif-dma-transfer-error-interrupt
链接2 http://www.stmcu.org.cn/module/forum/thread-604814-1-1.html
使用的芯片
stm32f407vgt6
遇到的问题
在使用sdio驱动wifi模块88W8801时,使用dma传输数据。从内存到外设,发现启动之后就产生了DMA TE 错误,LISR寄存器的TEIF位(传输错误中断标志)置位。但是发现一个数据都没有传输,在一开始就出错。
原因
从参考链接1上了解到是因为f407的 CCM 问题。从参考链接2知道CCM(Core Coupled Memory)是给F4内核专用的全速64KB RAM, 而DMA是无法访问到这的地址的,所以会产生transfer error。
在红框处打钩代表使用了ccm。
而因为我的要传输的数据就在这个ccm中,所以dma直接出错。
解决方法
所以只要使要传输的变量处于RAM1处就行。要么取消红框处的钩(但这会产生 No space in execution regions with .ANY selector matching 问题,因为一般会先将IRAM1用完再使用IRAM2)。第二是将内存占用降下来,我发现是我的使用的rt_thread 设置的heap过大,将它改小。其实这两个方法都是一样的意思。