stc32g8k64 自己写isp和上位机软件如何映射中断向量表?
请教一下,我的stc32g8k64如果自定义协议用自己的上位机软件如何映射中断,官方例程说是上位机软件内自动映射的,有没有相关资料的。不然只能用官方的上位机和协议无法满足需求的,isp和用户app的划分也不能自行更改了。 在使用 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 校验算法、固件打包格式等),欢迎继续提问。
[本文内容由国芯人工智能辅助生成,仅供参考]
深圳国芯人工智能有限公司-在线升级
请直接指出哪满足不了需求,我请研发来出主意
我需要能够更改APP的起始地址,范例上位机软件提供的是固定1000地址的。我可以手动把开头00H-003H的移到我指定位置,这样是可以启动的。能否在APP内程序内或者ISP程序内实现此功能。类似STM32的芯片我IAP跳转只需要更改中断向量表偏移量和KEIL编译内做相关设定即可。我们产品在现场是使用触摸屏类手持工具更新APP的,而且是同时广播对几百个芯片,上位机只发送无需应答,所以不能采用例程的上位机软件模式。我的设想是把跳转和中断向量表偏移放在芯片程序中,不知道能否实现,我暂时没有找到相关介绍。 中断向量映射地址是在用户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]