硬汉嵌入式论坛

 找回密码
 立即注册
查看: 839|回复: 6
收起左侧

[STM32H7] 请教个分段加载问题

[复制链接]

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2022-3-30 10:01:29 | 显示全部楼层 |阅读模式
我对官方例程《V7-058_内部TCM,SRAM和外部SDRAM等六块内存的超方便使用方式》中main.c文件中分段加载方式按V6编译器要求做了如下更改并移植到V6编译器,sct文件未做更改

/* MDK ----------------------------------------------*/
#elif defined ( __CC_ARM )

/* 定义在512KB AXI SRAM里面的变量 */
__attribute__((section (".bss.RAM_D1"))) uint32_t AXISRAMBuf[10];
__attribute__((section (".bss.RAM_D1"))) uint16_t AXISRAMCount;

/* 定义在128KB SRAM1(0x30000000) + 128KB SRAM2(0x30020000) + 32KB SRAM3(0x30040000)里面的变量 */
__attribute__((section (".bss.RAM_D2"))) uint32_t D2SRAMBuf[10];
__attribute__((section ("RAM_D2"))) uint16_t D2SRAMount = 1000;

/* 定义在64KB SRAM4(0x38000000)里面的变量 */
__attribute__((section (".bss.RAM_D3"))) uint32_t D3SRAMBuf[10];
__attribute__((section (".bss..RAM_D3"))) uint16_t D3SRAMCount;

/* 定义在32MB SDRAM(0xC0000000)里面的变量 */
__attribute__((section (".bss.RAM_SDRAM"))) uint16_t SDRAMSRAMCount;
__attribute__((section (".bss.RAM_SDRAM"))) uint32_t SDRAMSRAMBuf[10];


结果出现两个问题:
1、D2SRAMount 的内存被分配0x24000000处,但是在进入main函数后,D2SRAMount 的值不是1000,是0,再往下运行后其值变为一个随机数
2、SDRAMSRAMCount的值并没有加载到SDRAM存储器内,直接加载到0x2000 0000段内,即默认的SRAM内,如果改为__attribute__((section (".RAM_SDRAM"))) uint16_t SDRAMSRAMCount,则直接死在__main函数中
请教一下硬汉哥是什么原因?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2022-3-30 10:56:26 | 显示全部楼层
1、D2域的SRAM时钟初始化没
2、option选项里面分散加载文件设置没。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2022-3-30 16:49:32 来自手机 | 显示全部楼层
第一个问题找到了,是需要把d2域时钟开启放在_main之前,第二个问题暂时没找到,分散加载文件设置了
回复

使用道具 举报

3

主题

75

回帖

84

积分

初级会员

积分
84
发表于 2022-3-30 21:37:43 | 显示全部楼层
周立功出了一本书,可以在群里搜一下。分散加载文件
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2022-3-31 06:22:38 | 显示全部楼层
gjeoi 发表于 2022-3-30 21:37
周立功出了一本书,可以在群里搜一下。分散加载文件

浏览了一遍周立功的文章,也看了下V6编译器的手册,但是也没找到确切原因
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2022-3-31 09:13:36 | 显示全部楼层
迎着风雨走 发表于 2022-3-30 16:49
第一个问题找到了,是需要把d2域时钟开启放在_main之前,第二个问题暂时没找到,分散加载文件设置了

可以对比参考下。

像使用内部SRAM一样定义使用STM32H7的外部SDRAM,含MDK和IAR两版
https://www.armbbs.cn/forum.php? ... 8697&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2022-3-31 22:10:47 | 显示全部楼层
问题找到了,在V6编译器下,需要更改为如下: image.png
image.png
第1个问题是因为D2SRAMount属于RW数据,需要在_main函数中将其从ROM复制到相应SRAM中,所以需要在_main函数之前打开D2域时钟才可正常复制
第2个问题是需要在代码和sct文件中均加入”.bbs“
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-12 18:53 , Processed in 0.200769 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表