硬汉嵌入式论坛

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

[STM32H7] STM32CUBE+H723,C程序中如何能得到终端向量的地址?

[复制链接]

7

主题

24

回帖

50

积分

初级会员

积分
50
发表于 2025-2-4 09:57:50 | 显示全部楼层 |阅读模式
程序是用户程序,为了实现配合bootloader使用:
中断向量表g_pfnVectors的地址是在链接文件里面决定的,可以是0x08000000(第一个sector,无bootloader),或者是0x08020000(第二个sector,第一个sector给bootloader用)


在程序启动的时候,读出g_pfnVectors的地址,直接写到SCB->VTOR里面,这样就可以不管它实际的位置了。是否使用bootloader,就需要修改ld文件,程序的部分不用改动。

代码

[C] 纯文本查看 复制代码
void InitNVIC()
{
    uint32_t i = 0;
    __set_PRIMASK(1); // 关闭全局中断

    /* 关闭滴答定时器,复位到默认值 */
    SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

    /* 关闭所有中断,清除所有中断挂起标志 */
    for (i = 0; i < 8; i++)
    {
        NVIC->ICER[i] = 0xFFFFFFFF;
        NVIC->ICPR[i] = 0xFFFFFFFF;
    }

    /* 设置中断向量表偏移量 */
    extern uint32_t *g_pfnVectors;
    uint32_t gvaddr = (uint32_t)g_pfnVectors;
    SCB->VTOR = gvaddr;

    __set_PRIMASK(0); // 打开全局中断
}



在编译后的文件中,可以看到中断向量表的位置在0x08000000
B.png

但是,在程序中读取,地址却是0x20020000


a.png

根据datasheet,这个地址是reserved
C.png





回复

使用道具 举报

7

主题

24

回帖

50

积分

初级会员

积分
50
 楼主| 发表于 2025-2-4 10:34:30 | 显示全部楼层
不能使用指针,而是应该使用数组

    /* 设置中断向量表偏移量 */
    extern uint32_t g_pfnVectors[];
    uint32_t gvaddr = (uint32_t)(&g_pfnVectors[0]);
    SCB->VTOR = gvaddr;

这样就能得到 gvaddr = 0x08000000
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117546
QQ
发表于 2025-2-5 05:51:51 | 显示全部楼层
谢谢分享,MDK也可以,使用这个获取
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 02:07 , Processed in 0.040859 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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