各位看官都知道 STM32H750超值系列提供128 KB的Flash存储器,具有以下结构的1 MB SRAM:192 KB的TCM RAM(包括64 KB的ITCM RAM和128 KB的DTCM RAM,用于时间关键型程序和数据),高达512 KB的用户SRAM,以及备份域中4 KB的SRAM,其实对于大多数工业控制实际情况,这种配置足可以了,一个实时操作系统+实际控制程序超过128KB的代码都算比较大的系统了,RAM也有128KB的DTCM空间,都足可以了,可以非常舒服的利用480MHZ的主频了,当然这也是应用于我当前着眼的一些项目,看了H750的RAM分配情况,分了2个区域,如下图:
512 KB的用户SRAM,即上面IRAM2区域,地址:0x2400 0000,大小 0X8000(512KB),发现IRAM2区域位于 D1 域,数据带宽是 64bit,挂在 AXI 总线上。除了 D3 域中的 BDMB 主控不能访问,其它都可以访问此 RAM 区。但是速度只有200MHz。而IRAM1区域为地址:0x2000 0000,大小0X2000 (128KB),为DTCM,速度可以达到480MHz,即和内核同频率,这个区域真是爽歪歪,但是DMA1和DMA2却无法访问这些区域,这个时候我们需要将DMA1和DMA2访问的数据定义的IRAM2区域,将其他的变量定义定义到IRAM1区域,这样就能使系统的性能最大化,下面以KEIL的工程来实验变量定义到指定的RAM区域。
其他的理论,网上要很多的说明,我们不过多描述,这里只写怎么做,:)
先新建一个文件,stm32-v7.sct,这个名字可以自己定义:),内容如下:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00200000 { ; load region size_region
ER_IROM1 0x08000000 0x00200000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data - 128KB DTCM
.ANY (+RW +ZI)
}
RW_IRAM2 0x24000000 0x00080000 { ; RW data - 512KB AXI SRAM
*(.RAM_D1)
}
}
文件里亦这个内容就可以了:),下一步,需要定义到IRAM2区域内的变量这样定义就可以了,其他定义到IRAM1的变量按正常方式就可以啦:),在正常变量前面加这个“attribute((section (".RAM_D1"))) ”如下面的
attribute((section (".RAM_D1"))) unsigned int ADCxValues2[64];如果不加前缀“attribute((section (".RAM_D1"))) ”就会分配在IRAM1区域,否则就会分配到IRAM2区域,另外在KEIL里面还需要配置一个选项如下图
重新编译一下,下面是编译结果演示:),定义了两个变量组,然后看分配的区域:)一个分配在0X20000000区域,一个分配在0X24000000区域。DMA传输数据必须放在0X24000000区域,否则无法操作:)