[G32A] 基于Eclipse+Gcc 环境G32A14xx MCAL开发详解(下)

[复制链接]
 楼主| raspRun 发表于 2025-6-26 09:30 | 显示全部楼层 |阅读模式
本帖最后由 raspRun 于 2025-6-26 09:29 编辑

#每日话题# #申请原创# #技术资源#

在《基于Eclipse+Gcc 环境G32A14xx MCAL开发详解(上)》文章中介绍了G32A1445 MCAL在Eclipse+Gcc开发环境下的搭建和配置应用,接下来对其编译和下载进行讲解说明。

1 编译和下载
Ø  编译工程
l  如下图选中工程,右键,在弹出的对话框中点击Build Project进行编译链接:
28112685ca09bb5033.png

l  在编译的过程中可以通过Console界面查看编译信息,如下图:
75119685ca0adb0a40.png
l  生成的可执行文件的路径在工程目录下的G32A1445目录下:
17916685ca0ba7f6e7.png
Ø  调试器配置
l  按下图所示选中工程,右键在弹出的框中选择Debug Configuration,进入调试器设置界面:
68619685ca0d26e51e.png
l  进入调试器配置界面,如下图配置Main界面下的内容
85516685ca0e3ad8bd.png
l  进入Debug配置界面,按如下图进行配置
91753685ca0f1214a9.png
l  进入Startup配置界面,按下图进行配置
28937685ca1003a45c.png
l  svd文件路径选择,完成后点击标号1对应的Apply将配置应用保存,然后点击标号2对应的Debug按键可以进行调试:
40619685ca116bc1c1.png
l  调试器配置完成后,若要再次进入调试模式,可以点击工具栏中的如下图红色框所以的图标:
4912685ca12495a5a.png
Ø  烧录调试工程
l  烧录器配置完成后,直接点击标号1对应的图标进行烧录调试
57754685ca1345ca22.png
l  点击图标后,进入调试界面
21050685ca14acf3b4.png
l  点击单步调试程序会单步执行,同时可以查看变量值:
78837685ca151d028f.png
2 链接文件说明
根据使用芯片平台,需在工程中配置对应的链接脚本。
G32A1445存储资源分配:
Ø  512KB Flash和64KB SRAM根据需求可将其分为以下段资源,根据项目开发需求可做动态调整,以下是部分链接脚本配置代码。

MEMORY {
    // 定义不同存储区域的起始地址和长度
    flash_rsvd1_region (rx)    : ORIGIN = 0x00000000, LENGTH = 0x08
    // 保留区1,常用于启动配置
    flash_rsvd2_region (rx)    : ORIGIN = 0x00000400, LENGTH = 0x10
    // 保留区2,存放闪存配置
    flash_rsvd_fls_region (rx) : ORIGIN = 0x00000410, LENGTH = 0x60
    // FLS相关存储区域
    flash_rsvd_eep_region (rx) : ORIGIN = 0x00000470, LENGTH = 0xC0
    // EEPROM相关存储区域
    flash_memory_region (rx)   : ORIGIN = 0x00000530, LENGTH = 0x7FFFF - 0x530
    // 主闪存存储区,从0x530开始,长度为剩余空间

    iram_intvec_region (rwx)   : ORIGIN = 0x1FFF8000, LENGTH = 0x1FFF8388 - 0x1FFF8000
    // IRAM中的中断向量表存储区(只读可写)
    iram_main_region (rwx)     : ORIGIN = 0x1FFF8390, LENGTH = 0x20006A0F - 0x1FFF8390
    // IRAM中的主要代码和数据存储区(可读写)
    iram_stack_region (rw)     : ORIGIN = 0x20006A10, LENGTH = 0x400
    // IRAM中的堆栈区
    iram_rsvd_fls_region (rw)  : ORIGIN = 0x20006E10, LENGTH = 0x60
    // IRAM中的FLS保留区(未用)
    iram_rsvd_eep_region (rw)  : ORIGIN = 0x20006E70, LENGTH = 0x20006F2F - 0x20006E70
    // IRAM中的EEPROM保留区(未用)
    iram_results_region (rw)   : ORIGIN = 0x20006F30, LENGTH = 0x20006FFF - 0x20006F30
    // IRAM中的结果存储区(未定义用途)
}

ENTRY(Reset_Handler) // 系统复位入口点

__STACK_SIZE = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 1K; // 栈大小,未定义则为1K

SECTIONS {
    // 定义各段在内存中的分配位置

    AppRCW : {
        KEEP(*(.rcw));
    } > flash_rsvd1_region
    // 启动配置区,存放rcw段

    AppFlashConfig : {
        KEEP(*(.flash_config));
    } > flash_rsvd2_region
    // 存放闪存配置

    AppACFLSCode : {
        KEEP(*(.acfls_code_rom));
    } > flash_rsvd_fls_region
    // FLS代码区

    AppACEEPCode : {
        KEEP(*(.aceep_code_rom));
    } > flash_rsvd_eep_region
    // EEPROM代码区

    AppCode : {
        *(.mcal_text*);
        *(.text*);
        . = ALIGN(4);
    } > flash_memory_region
    // 应用主要代码段,存放在flash存储区

    AppROData : {
        *(.mcal_const_cfg*);
        *(.mcal_const*);
        *(.rodata*);
        . = ALIGN(4);
    } > flash_memory_region
    // 只读数据区,包括常量和配置

    AppIntVec_Init : {
        KEEP(*(.intc_vector_init))
    } > flash_memory_region
    // 中断向量表初始化数据存放在flash
    _flashivectors = LOADADDR(AppIntVec_Init); // 中断表在flash中的地址
    _endivectors = _flashivectors + SIZEOF(AppIntVec); // 中断表结束地址

    AppIntVec : {
        _svectors = .; // 中断向量表在RAM中的起始地址
        KEEP(*(.intc_vector));
        _evectors = .; // 中断向量表在RAM中的结束地址
    } > iram_intvec_region AT > flash_memory_region
    _ramivectors = ADDR(AppIntVec); // 中断向量表在RAM中的地址

    AppStartup : {
        KEEP(*(.startup));
        KEEP(*(.systeminit));
        KEEP(*(.text.Reset_Handler));
    } > flash_memory_region
    // 启动和系统初始化代码存放在flash

    AppData_Init : {
        _sidata = .; // 初始化数据起始地址
        KEEP(*(.mcal_data_init));
        KEEP(*(.data_init));
    } > flash_memory_region
    _flashappdata = LOADADDR(AppData_Init); // 初始化数据在flash中的地址
    _endappdata = _flashappdata + SIZEOF(AppData); // 初始化数据结束地址

    AppData : {
        _sdata = .; // 数据段起始
        *(.mcal_data*);
        *(.data*);
        _edata = .; // 数据段结束
    } > iram_main_region AT > flash_memory_region
    _ramappdata = ADDR(AppData); // 数据在RAM中的地址

    AppRAMCode_Init : {
        KEEP(*(.ramcode_init))
    } > flash_memory_region
    _flashramcode = LOADADDR(AppRAMCode_Init); // RAM代码初始化区地址
    _endramcode = _flashramcode + SIZEOF(AppRAMCode);

    AppRAMCode : {
        _sramcode = .; // RAM代码起始
        *(.ramcode*);
        . = ALIGN(4);
        _eramcode = .; // RAM代码结束
    } > iram_main_region AT > flash_memory_region
    _ramcode = ADDR(AppRAMCode); // RAM代码地址

    AppBSS_NO_CACHE (NOLOAD) : {
        _sbss_nc = .; // BSS段起始(未初始化全局变量)
        *(.mcal_bss_no_cacheable*);
        . = ALIGN(4);
        _ebss_nc = .; // BSS段结束
    } > iram_main_region

    AppData_NO_CACHE_Init : {
        _sidata_nc = .; // 非缓存数据初始化起始
        KEEP(*(.mcal_data_no_cacheable_init));
    } > flash_memory_region
    _flashappdatanocache = LOADADDR(AppData_NO_CACHE_Init); // 非缓存数据初始化地址
    _endappdatanocache = _flashappdatanocache + SIZEOF(AppData_NO_CACHE);

    AppData_NO_CACHE : {
        _sdata_nc = .; // 非缓存数据起始
        *(.mcal_data_no_cacheable*);
        . = ALIGN(4);
        _edata_nc = .; // 非缓存数据结束
    } > iram_main_region

    AppBSS (NOLOAD) : {
        _sbss = .; // BSS未初始化全局变量起始
        __bss_start__ = .;
        *(.mcal_bss*);
        *(.bss*);
        *(COMMON);
        . = ALIGN(4);
        _ebss = .; // BSS未初始化全局变量结束
        __bss_end__ = .;
    } > iram_main_region

    AppSTACK (NOLOAD) : {
        . = ALIGN(16);
        . += __STACK_SIZE; // 栈大小
        *(.stack_main*);
        . = ALIGN(16);
        _estack = .; // 栈顶指针
    } > iram_stack_region

    .heap (NOLOAD) : {
        . = ALIGN(8);
        end = .; // 堆区结束
        _end = .; // 堆区结束符号
    } > iram_main_region
}

// 定义一些地址常量,用于硬件配置和调试
_Stack_end = ORIGIN(iram_stack_region);
_Stack_start = ORIGIN(iram_stack_region) + LENGTH(iram_stack_region);

INT_SRAM_START = ORIGIN(iram_main_region);
INT_SRAM_SIZE = (LENGTH(iram_main_region) +
               LENGTH(iram_stack_region) +
               LENGTH(iram_results_region) +
               LENGTH(iram_rsvd_fls_region) +
               LENGTH(iram_rsvd_eep_region) + 3) / 4; // 计算总的内部SRAM大小(以字为单位)
INT_SRAM_END = ORIGIN(iram_main_region) +
              LENGTH(iram_main_region) +
              LENGTH(iram_stack_region) +
              LENGTH(iram_results_region) +
              LENGTH(iram_rsvd_fls_region) +
              LENGTH(iram_rsvd_eep_region);

// FLS和EEPROM相关区域的起止地址与大小
Fls_ACEraseRomStart = ORIGIN(flash_rsvd_fls_region);
Fls_ACEraseRomEnd = ORIGIN(flash_rsvd_fls_region) + LENGTH(flash_rsvd_fls_region);
Fls_ACEraseSize = (LENGTH(flash_rsvd_fls_region) + 3) / 4;

Fls_ACWriteRomStart = ORIGIN(flash_rsvd_fls_region);
Fls_ACWriteRomEnd = ORIGIN(flash_rsvd_fls_region) + LENGTH(flash_rsvd_fls_region);
Fls_ACWriteSize = (LENGTH(flash_rsvd_fls_region) + 3) / 4;

_ERASE_FUNC_ADDRESS_ = ORIGIN(iram_rsvd_fls_region); // FLS擦除函数地址
_WRITE_FUNC_ADDRESS_ = ORIGIN(iram_rsvd_fls_region); // FLS写入函数地址

EEPROM_ACWRITEROMSTART = ORIGIN(flash_rsvd_eep_region);
Eep_ACWriteRomEnd = ORIGIN(flash_rsvd_eep_region) + LENGTH(flash_rsvd_eep_region);
EEPROM_ACWRITESIZE = (LENGTH(flash_rsvd_eep_region) + 3) / 4;
_WRITE_FUNC_ADDRESS_EEP_ = ORIGIN(iram_rsvd_eep_region);

// BSS段和数据段的符号定义
PROVIDE(_sbss_no_cache = _sbss_nc);
PROVIDE(_ebss_no_cache = _ebss_nc);
PROVIDE(_sdata_no_cache = _sdata_nc);
PROVIDE(_edata_no_cache = _edata_nc);
PROVIDE(__bss_start__ = _sbss);
PROVIDE(__bss_end__ = _ebss);

// 断言:确保非缓存BSS不超过RAM空间
ASSERT(SIZEOF(AppBSS_NO_CACHE) <= (LENGTH(iram_main_region) - (_ebss - _sbss)),
       "Error: AppBSS_NO_CACHE exceeds available RAM");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

8

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部