daxinxin12 发表于 2025-10-20 17:55:11

stc32g8k64 自己写isp和上位机软件如何映射中断向量表?

请教一下,我的stc32g8k64如果自定义协议用自己的上位机软件如何映射中断,官方例程说是上位机软件内自动映射的,有没有相关资料的。不然只能用官方的上位机和协议无法满足需求的,isp和用户app的划分也不能自行更改了。

国芯人工智能 发表于 2025-10-20 17:58:00

在使用 STC32G8K64 等带有 ISP(In-System Programming)功能的 MCU 时,若希望自行实现 ISP 协议及上位机软件,并对中断向量表进行映射,确实需要对整个启动流程、内存映射、中断机制有较为深入的理解。以下将从技术角度出发,详细阐述如何实现中断向量表的映射,以及如何在自定义 ISP 和上位机中实现这一机制。

一、理解中断向量表的基本原理

中断向量表(Interrupt Vector Table)是 MCU 启动后执行的第一批指令跳转地址集合,通常位于程序存储器的起始地址(如 0x0000)。每个中断源对应一个固定的地址偏移,MCU 在响应中断时会根据该表跳转到对应的中断服务函数。

对于 STC32G8K64 这类增强型 8051 内核 MCU,中断向量表的结构与标准 8051 类似,通常如下所示(以 16 字节对齐为例):

| 中断号 | 中断名称      | 地址偏移 |
|--------|----------------|----------|
| 0      | 复位中断      | 0x0000   |
| 1      | 外部中断 0      | 0x0003   |
| 2      | 定时器 0 中断   | 0x000B   |
| 3      | 外部中断 1      | 0x0013   |
| 4      | 定时器 1 中断   | 0x001B   |
| 5      | 串口中断      | 0x0023   |
| ...    | ...            | ...      |

二、ISP 与用户应用程序的内存划分

在自定义 ISP 方案中,通常将 MCU 的 Flash 划分为两个部分:
ISP 区域:负责接收上位机发送的固件、校验、写入 Flash,并跳转到用户程序。
用户 App 区域:运行用户应用程序,包含主逻辑和中断服务程序。

为实现中断向量表的映射,需要确保:

1. 用户程序的中断向量表被正确重定位到用户 App 区域的起始地址。
2. ISP 跳转时设置正确的中断向量基地址,以确保中断服务程序能被正确调用。

三、中断向量表的重定位方法

1. 编译器设置(以 Keil C51 为例)

Keil C51 编译器支持使用 REMAP 指令或链接器脚本(.lnk 文件)来指定中断向量表的起始地址。例如:

c
pragma REMAP 0x2000// 将中断向量表重定位到 Flash 地址 0x2000

或者在链接器配置中设置:

txt
CODE (0x2000)

这样,编译器会将中断向量表生成在用户 App 区域的起始地址。

2. ISP 跳转前设置中断向量基地址寄存器

STC32G8K64 支持通过寄存器(如 INTVEC)设置中断向量表的基地址。在 ISP 跳转至用户程序之前,需手动设置该寄存器指向用户 App 的中断向量表起始地址。

例如:

c
// 假设用户程序起始于 0x2000
INTVEC = 0x2000;

注意:具体寄存器名称和操作方式请参考 STC32G8K64 数据手册。

四、自定义 ISP 与上位机中的中断向量处理

在自定义 ISP 实现中,需注意以下几点:

1. 固件格式设计

建议将固件文件格式设计为包含以下信息:
用户程序起始地址(用于设置 INTVEC)
中断向量表偏移地址
校验信息(如 CRC)
用户代码段数据

2. 上位机软件的处理逻辑

上位机在发送固件时,需将中断向量表的偏移地址告知 ISP 程序,以便 ISP 在跳转前设置正确的中断向量基地址。

例如:

c
// 接收到的固件头中包含中断向量偏移地址
uint16t vectoroffset = getvectoroffsetfromfirmwareheader();

// 设置中断向量基地址
INTVEC = vectoroffset;

// 跳转到用户程序入口
((void ()(void))userappentrypoint)();

五、中断向量表映射的注意事项

1. 地址对齐:中断向量表必须按 16 字节对齐,否则可能导致跳转失败。
2. Flash 写保护:确保 ISP 不覆盖用户程序区域,尤其是中断向量表部分。
3. 跳转前关闭中断:在跳转前建议关闭全局中断,防止跳转过程中触发中断。
4. 兼容性处理:若用户程序可能运行在不同地址,需动态设置 INTVEC。

六、参考资料与建议
STC32G8K64 技术手册:详细说明了中断向量寄存器、Flash 分区、ISP 流程等内容。
Keil C51 编译器手册:提供中断向量重定位、链接器配置等信息。
STC 官方例程:虽然使用官方协议,但可参考其向量表映射和跳转实现方式。

七、结语

自定义 ISP 和上位机实现中断向量表映射,是实现灵活固件升级和功能扩展的关键步骤。通过合理配置编译器、设置中断向量寄存器、设计固件格式与上位机通信协议,完全可以脱离官方上位机限制,实现自主可控的升级流程。

如需进一步讨论具体实现细节(如跳转函数编写、CRC 校验算法、固件打包格式等),欢迎继续提问。

[本文内容由国芯人工智能辅助生成,仅供参考]

神农鼎 发表于 2025-10-20 19:09:02



深圳国芯人工智能有限公司-在线升级

请直接指出哪满足不了需求,我请研发来出主意

daxinxin12 发表于 2025-10-20 20:27:28

我需要能够更改APP的起始地址,范例上位机软件提供的是固定1000地址的。我可以手动把开头00H-003H的移到我指定位置,这样是可以启动的。能否在APP内程序内或者ISP程序内实现此功能。类似STM32的芯片我IAP跳转只需要更改中断向量表偏移量和KEIL编译内做相关设定即可。我们产品在现场是使用触摸屏类手持工具更新APP的,而且是同时广播对几百个芯片,上位机只发送无需应答,所以不能采用例程的上位机软件模式。我的设想是把跳转和中断向量表偏移放在芯片程序中,不知道能否实现,我暂时没有找到相关介绍。

乘风飞扬 发表于 2025-10-21 09:42:41

中断向量映射地址是在用户ISP程序里面修改:


需要在上位机软件进行映射的是用户应用程序的跳转指令。
上位机软件打开应用程序升级文件时,读取地址0000H~0002H内容复制到1000H~1002H,然后升级时将地址1000H开始的数据发送给MCU进行升级。

官方提供的上位机升级软件,打开一次,关闭后会自动生成一个配置文件:


可以添加/修改里面的配置参数调整设置,例如修改用户ISP大小调整用户ISP空间与用户APP空间的分配:

;设置串口号(1~255),默认为1(COM1)
Port=1

;设置串口波特率,默认115200
Baudrate=115200

;设置用户ISP大小(512的整倍数),默认为4096(4K字节)
IspSize=4096

;设置连接超时时间,默认为100ms
ConnectTimeout=100

;设置擦除超时时间,默认为5000ms
EraseTimeout=5000

;设置编程超时时间,默认为100ms
ProgramTimeout=100



USB接口上位机升级软件没有COM口选项,可以设置USB VID/PID:

USBVID=13503
USBPID=65281
页: [1]
查看完整版本: stc32g8k64 自己写isp和上位机软件如何映射中断向量表?