调用HAL_FLASH_OB_Unlock()直接进入 HardFaultHandler
STM32 增加 WiFi + 以太网的低成本方案
NUCLEO G474RE无法运行程序
STM32F407VGT6 开发板Beak at address "0x0" with no debug information our outside
BootLoader 与 DFU 模式的区别
调度器原子变量相关问题
运行到 WRITE_REG (FLASH->OPTKEYR, FLASH_OPTKEY1)跳转 HardFaultHandler
STM32F417IG 单端外部时钟旁路HSE Bypass问题
STM32L4A6 SDMMC 无法使用 1.8V IO 驱动 microSD 卡
STM32L4P5xx 系统内 Bootloader:RAM3 能否用作栈指针内存?
微信公众号
手机版
核心方案
GCC 方案通常分为两步:
__attribute__将变量放置到该段中。第一步:修改链接脚本 (
.ld)打开你项目中的
.ld链接脚本(通常命名为STM32XXXXXX_FLASH.ld),修改其内容以实现精确指定地址。修改内存区域 (
MEMORY)在
MEMORY块中,添加一个新的内存区域,并指定好起始地址 (ORIGIN) 和大小 (LENGTH)。 ldORIGIN和LENGTH的值需要根据你的芯片手册和需求进行修改在
SECTIONS块中,为你的变量定义一个输出段,并指定放置到上面刚创建的内存区域。 ld(NOLOAD)属性是关键,它告诉链接器不要在程序启动时初始化该段的内容,这与__no_init的作用相同。第二步:修改源代码
完成链接脚本的修改后,回到你的 C 文件,声明变量如下:
define RTP_SIZE_AR (128) // 根据实际情况定义数组长度
/ 使用 attribute 指定该变量放入 .my_noinit 段 / attribute((section(".my_noinit"))) volatile short rtp_rin_ni[RTP_SIZE_AR]; 同时,在定义中建议加上
volatile关键字,防止编译器对该内存访问进行过度优化。.noinit (NOLOAD) :
{ . = ALIGN(4);
*(.noinit) *
(.noinit*)
} > RAM
#define __no_init __attribute__((section(".noinit")))
__no_init int keep_data; // 和 IAR 一模一样!