stm32 ccmram的使用(stm32f407)

stm32 ccmram的使用(stm32f407)

stm32内存分析

  1. stm32 ram使用,例如192k的stm32f407zg,实际看总线分布图,分成了3部分
    在这里插入图片描述
  2. 112k sdram1 + 16k sdram2 + 64k ccm = 192k, 平时使用中,keil的默认设置只会用到128k,不会用到ccm,要用的话,设置工程的IRAM2即可,开了ccm会优先使用这个内存进行分配。
    在这里插入图片描述
    在这里插入图片描述
  3. 所以在设置heap和stack大小的时候要考虑RW的size不要超过128k,否则程序肯定hardfault。怎么看RW的size,用到keil工具的map,Program Size: Code=218950 RO-data=33350 RW-data=3480 ZI-data=125152, RW-DATA + ZI-DATA就是最后会加载到ram中的总大小。RW是已经初始化好的变量,ZI是未初始化的变量数据包括heap和stack也在其中。
    在这里插入图片描述
    在这里插入图片描述

如何使用ccmram

  1. 新建一个sct文件
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08020000 0x000D0000  {    ; load region size_region
  ER_IROM1 0x08020000 0x000D0000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00030000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x10000000 0x00010000  {
   .ANY (ccmram)
  }
}
  1. 配置工程,加载刚才sct在这里插入图片描述

  2. 宏定义指定区域

#define CCMRAM __attribute__((section("ccmram")))
  1. 声明变量
/** This is the actual memory used by the pools (all pools in one big block). */
CCMRAM static u8_t memp_memory[MEM_ALIGNMENT - 1 
#define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) )
#include "lwip/memp_std.h"
];

编译后的map文件中

  • map中的内存分配已经可以看到了,分配到了ccmram这个区域。
  • 相应的64K ram已经使用了,剩下原来占用的128k也会相应的释放到相同的size。
    在这里插入图片描述
### 配置STM32F407CCMRAM在IAR环境中的方法 对于STM32F407微控制器而言,内部含有一定量的紧耦合内存(CCM RAM),这部分内存可以用于存储实时性要求较高的数据。为了使能并配置此功能,在IAR开发环境下需遵循特定设置。 #### 修改启动文件以支持CCMRAM 首先,需要调整启动文件`startup_stm32f4xx.s`来定义新的栈指针位置以及初始化向量表偏移地址。具体来说: ```assembly AREA STACK, NOINIT, READWRITE, ALIGN=6 Stack_Mem SPACE 0x800 ; Stack size (example value) __initial_sp_cortex_m4_ccmram_lower: DCD __stack_end__ ``` 这段汇编代码片段展示了如何为CCM RAM分配堆栈空间[^1]。 #### 更新链接器脚本 其次,更新`.icf`链接器配置文件,指定程序段数据段放置于何处。下面是一个示例配置,它会把部分变量放入到CCM区域中去: ```plaintext define symbol __ICFEDIT_region_CCMRam_start__ = 0x10000000; define symbol __ICFEDIT_region_CCMRam_size__ = 0x00008000; place at address mem: __ICFEDIT_region_CCMRam_start__ { readonly section .ccmrdata }; ``` 通过上述方式可以在链接阶段告知工具链哪些数据应该被加载至CCM RAM里[^2]。 #### 调整项目属性 最后一步是在IAR Embedded Workbench IDE里面修改项目的选项卡下的“Linker -> Extra Options”,添加如下命令行参数以便正确处理这些特殊节名的数据: ``` --entry Reset_Handler --scatter-loading --callgraph --summary_stderr --map --info sizes --info totals --info unused --info veneers "--load_section=.ccmrdata@0x10000000" ``` 完成以上操作之后重新构建整个工程即可让应用程序利用上STM32F4系列MCU所提供的片内高速缓存资源[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值