我使用DMA进行SPI传输时发现无数据,还好有个逻辑分析仪,不然有没有信号都不知道 这是总线访问权限的图。 ' f3 d! D" i/ B; _) i% r “-”表示不能访问。“D”表示直接访问。其它的都是间接访问。 ; r V8 v2 E" u % [2 k7 C& n; Q$ f1 J 发现DMA1只有ITCM和DTCM不能访问,问题就出在这。 有句“TCM 接口上的 DTCM-RAM 映射到地址 0x2000 0000,可供 Cortex®-M7 访问......”。(M7是处理器核)% Z( D# k% U# y5 x5 p+ `' R/ c 4 Y4 V9 F9 g' v7 M( j3 j l 内存分布:- ]7 J! e4 w# ?# S' d3 G2 T - U5 ~! E2 L V. T! F0 D! ~3 R DTCM-RAM(数据TCM RAM):起始地址:0x2000 0000,大小:0x20000(128KB)。 6 G/ \; _$ H, _3 Q& L4 B4 v3 t# H AXI SRAM(D1域):起始地址:0x24000000: }0 T1 X& S5 b DTCM虽然和其它的MCU的RAM起始地址一样,但是无法被DMA访问。 也就是通用RAM的地址变了,但是编译器还是会把DTCM的地址作为通用RAM的起始地址。 6 P; |+ o; L7 T! G 使用DMA传输时把内存起始地址修改为D1域。也就是把勾打在RAM2上。这是最简单的解决方法。8 V6 `* m1 @" ~! C2 Z' V2 E8 o ( C0 t0 J2 C& _. [- X% K; k" E7 ~; j Makefile工程:4 }5 |& C: x) _( q3 E7 m# T% G r ; X% h# n7 W) u) @3 ?" t# t. H 在指定位置创建内存: 在ld文件中添加:1 l% l; X% y- f% i& L6 Q .DisplayBuffer : //DisplayBuffer是名字- D9 _8 e, s/ m Q1 |' W {undefined, D/ H% H$ S- k2 { *(.DisplayBuffer)- _/ D" r5 i7 w+ ?+ k" B3 Q } >RAM_D2 //RAM_D2是所在地 使用该内存:__attribute__((section(".DisplayBuffer"))) uint16_t DisplayBuffer[ScreenH][ScreenW];。6 e! V: a8 O0 w+ e8 S4 | 也可以直接指定地址:uint16_t DisplayBuffer[100][100] __attribute__((section(".ARM.__at_0x20000000")));。只能在bss段里,bss段所在的内存区域在ld文件里看,看最后指向哪个RAM区域。 , \5 C4 e; H) H$ e. |: d 只要变量不在DTCM里就行。 8 E# C7 E# u& R) u$ S Q {" ?, a 1 e7 T6 M. B' o* Z |
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重定向实现方法及常见问题