我使用DMA进行SPI传输时发现无数据,还好有个逻辑分析仪,不然有没有信号都不知道! T7 G2 X1 |4 r* g! L1 W + U0 w4 ^( s1 _, F: G 这是总线访问权限的图。 “-”表示不能访问。“D”表示直接访问。其它的都是间接访问。! n3 l5 Z- w% X4 U2 J" Q , x, ?$ p, p1 f6 x Z2 d5 R; f ( a4 @* M1 _. L- H: F 发现DMA1只有ITCM和DTCM不能访问,问题就出在这。! j3 S1 ^7 _# S- @6 V ) x- i2 Z9 o7 T8 _! A 有句“TCM 接口上的 DTCM-RAM 映射到地址 0x2000 0000,可供 Cortex®-M7 访问......”。(M7是处理器核)3 O* U" w: \4 y. Q4 ^- b% w# L$ ~ / ]- e' W3 O. p" Z- N9 {- [. J 内存分布: DTCM-RAM(数据TCM RAM):起始地址:0x2000 0000,大小:0x20000(128KB)。+ D& p+ f- B! G9 L8 F& z+ Q- A3 Y9 _9 v AXI SRAM(D1域):起始地址:0x24000000% i8 p+ h% q: o2 ^ DTCM虽然和其它的MCU的RAM起始地址一样,但是无法被DMA访问。- ?6 W8 C7 _, H$ X& D % N0 q5 X3 [- H O% @ 也就是通用RAM的地址变了,但是编译器还是会把DTCM的地址作为通用RAM的起始地址。 1 y8 B C' C* D& d3 j 使用DMA传输时把内存起始地址修改为D1域。也就是把勾打在RAM2上。这是最简单的解决方法。 + a" I* l- Y7 i Makefile工程:: [, Y. ~% T b# M8 g/ ^ A) x 2 q7 [8 A8 |) [ 在指定位置创建内存:9 m( n p, Q$ H 在ld文件中添加:7 W( |! w$ G) C4 K .DisplayBuffer : //DisplayBuffer是名字 {undefined' a8 R) Y% E" L9 f *(.DisplayBuffer)4 a9 g+ T+ ]3 X7 o } >RAM_D2 //RAM_D2是所在地) `: D( x$ o. J 使用该内存:__attribute__((section(".DisplayBuffer"))) uint16_t DisplayBuffer[ScreenH][ScreenW];。 也可以直接指定地址:uint16_t DisplayBuffer[100][100] __attribute__((section(".ARM.__at_0x20000000")));。只能在bss段里,bss段所在的内存区域在ld文件里看,看最后指向哪个RAM区域。- g5 m' X" V2 u! V 只要变量不在DTCM里就行。 7 v2 f& V( w; O: A' T3 `. n |
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
【Wio Lite AI视觉开发套件】+cube.ai与食物识别
【STM32H7S78-DK】汽车仪表系统
【STM32H7S78-DK】基于 rtthread 适配 lcd 驱动移植 lvgl
【STM32H7S78-DK评测】TouchGFX (QR Code)二维码生成器
【STM32H7S78-DK】rtthread 增加 psram 内存管理
【STM32H7S78-DK】开箱与rtthread工程初体验
【STM32H7S78-DK评测】-5 LVGL&DMA2D DEMO测试
【STM32H7S78-DK评测】-4 LTDC&DMA2D 基本测试
【STM32H7S78-DK评测】CoreMark移植和优化--兼记printf重定向实现方法及常见问题