一种USER_ISP和USER_APP共用中断方法
遇到坛友提问如何在USER_ISP和USER_APP共用中断
这里借助xdata,放置标识区分程序运行环境以及APP函数指针,在USER_ISP中断里判断跳转,实测可行。
需要在USER_ISP工程isr.asm里屏蔽共用的中断。
如需扩展多个函数指针,注意结构体在xdata中内存布局。
在官网“8系列UART在线升级”基础上更改:
在嵌入式系统开发中,USERISP(用户在线编程)和USERAPP(用户应用程序)共用中断是一个常见的需求。为了实现这一功能,可以采用一种基于xdata的标识区分方法,并通过函数指针进行跳转。以下是一个详细的实现方案。
1. 基本思路
通过在xdata中放置标识符来区分当前运行的是USERISP还是USERAPP,并在中断服务例程(ISR)中根据标识符进行相应的跳转。具体步骤如下:
1. 定义标识符和函数指针:在xdata中定义一个结构体,包含标识符和函数指针。
2. 初始化标识符:在USERISP和USERAPP的初始化代码中设置相应的标识符。
3. 修改中断服务例程:在ISR中根据标识符跳转到相应的处理函数。
2. 实现步骤
2.1 定义结构体
首先,在xdata中定义一个结构体,用于存储标识符和函数指针。
c
typedef struct {
uint8t ispflag;// 标识符,0表示APP,1表示ISP
void (appisr)(void);// APP中断处理函数指针
} ISRStruct;
xdata ISRStruct isrinfo;
2.2 初始化标识符
在USERISP和USERAPP的初始化代码中,分别设置标识符和函数指针。
USERISP初始化代码:
c
isrinfo.ispflag = 1;// 设置为ISP模式
isrinfo.appisr = NULL;// ISP模式下不需要APP中断处理函数
USERAPP初始化代码:
c
isrinfo.ispflag = 0;// 设置为APP模式
isrinfo.appisr = &appisrhandler;// 设置APP中断处理函数
2.3 修改中断服务例程
在ISR中根据标识符进行跳转。
c
void commonisr(void) interrupt(INTERRUPTNUMBER) {
if (isrinfo.ispflag) {
// ISP模式下的处理逻辑
ispisrhandler();
} else {
// APP模式下的处理逻辑
if (isrinfo.appisr != NULL) {
isrinfo.appisr();
}
}
}
2.4 屏蔽共用的中断
在USERISP工程的israsm文件中,屏蔽共用的中断,以避免冲突。
assembly
; 在israsm文件中屏蔽共用的中断
; 例如,屏蔽UART中断
CLR EA; 关闭全局中断
CLR ES; 关闭串口中断
3. 扩展多个函数指针
如果需要扩展多个函数指针,可以在结构体中增加相应的字段,并注意结构体在xdata中的内存布局。
c
typedef struct {
uint8t ispflag;// 标识符,0表示APP,1表示ISP
void (appisr1)(void);// APP中断处理函数指针1
void (appisr2)(void);// APP中断处理函数指针2
} ISRStruct;
xdata ISRStruct isrinfo;
在ISR中根据需要进行跳转。
c
void commonisr(void) interrupt(INTERRUPTNUMBER) {
if (isrinfo.ispflag) {
// ISP模式下的处理逻辑
ispisrhandler();
} else {
// APP模式下的处理逻辑
if (isrinfo.appisr1 != NULL) {
isrinfo.appisr1();
}
if (isrinfo.appisr2 != NULL) {
isrinfo.appisr2();
}
}
}
4. 总结
通过上述方法,可以实现USERISP和USERAPP共用中断的功能。关键在于使用xdata中的标识符和函数指针进行跳转,并在ISR中根据标识符执行相应的处理逻辑。这种方法不仅简单高效,而且易于扩展,适用于多种嵌入式系统开发场景。
5. 注意事项
内存布局:在扩展多个函数指针时,需注意结构体在xdata中的内存布局,确保各字段正确对齐。
中断屏蔽:在USERISP工程中,务必屏蔽共用的中断,以避免冲突。
测试验证:在实际应用中,需进行充分的测试验证,确保功能稳定可靠。
通过以上步骤,开发者可以有效地实现USERISP和USERAPP共用中断的功能,提升系统的灵活性和可维护性。
[本文内容由国芯人工智能辅助生成,仅供参考]
注意:
32G8K64 是6k xdata + 2k edata。ISP&APP公共变量需要挪到xdata 6k之前。
32G8K64 是6k xdata + 2k edata。ISP&APP公共变量需要挪到xdata 6k之前。
32G8K64 是6k xdata + 2k edata。ISP&APP公共变量需要挪到xdata 6k之前。
typedef struct {
u8 isAppRunning;
void (*app_tm0_isr)(void);
void (*app_uart1_isr)(void);
void (*app_uart2_isr)(void);
}UserAppConfig;
extern UserAppConfig xdata appConfig;
volatile uint32_t xdata DfuFlag _at_ 0x0BFC;
UserAppConfig xdata appConfig _at_(0x0BE0);
//-----------------------------------------------------------------------------
void UART2_ISR_Handler() interrupt UART2_VECTOR
{
if(appConfig.isAppRunning && appConfig.app_uart2_isr != NULL)
{
((void (code *)())(appConfig.app_uart2_isr))();
}
else
{
u8 tmp=0;
if (S2CON & 0x02) //发送
{
S2CON &= ~0x02; //清中断标志
Uart2TxFlag=0;
}
if (S2CON & 0x01)
{
S2CON &= ~0x01; //清中断标志
tmp=S2BUF;
uart_receive_input(tmp);
}
}
}
//-----------------------------------------------------------------------------
LDR_SIZE EQU 4000H
MAPISR MACRO ADDR
CSEG ATADDR
LJMP LDR_SIZE + $
ENDM
MAPISR0003H
;MAPISR000BH
MAPISR0013H
MAPISR001BH
;MAPISR0023H
MAPISR002BH
MAPISR0033H
MAPISR003BH
;MAPISR0043H
MAPISR004BH
MAPISR0053H
MAPISR005BH
MAPISR0063H
APP中串口中断2代码:
//-----------------------------------------------------------------------------
//void UART2_Isr() interrupt 8
void app_uart2_isr(void)
{
u8 tmp=0;
if (S2CON & 0x02)//发送
{
S2CON &= ~0x02; //清中断标志
Uart2TxFlag=0;
}
if (S2CON & 0x01)
{
S2CON &= ~0x01; //清中断标志
tmp=S2BUF;
uart_receive_input(tmp);
}
}
//-----------------------------------------------------------------------------
您好,请教下现用STC8H3K64S2 按例程配置的共用中断的方式实现IAP升级,程序能跑起来,串口2是接的WIFI模组,数据量大的情况下,就出现异常重启复位,请问这是什么原因呢? 共用的三个中断也屏蔽了,程序从ISP跳到APP也能跑,取消ISP功能代码,单独使用APP代码都正常,还没找到是哪的问题 jieke0912 发表于 2025-9-22 11:05
共用的三个中断也屏蔽了,程序从ISP跳到APP也能跑,取消ISP功能代码,单独使用APP代码都正常,还没找到是哪 ...
什么问题?需要帮助吗?可以描述下问题,上传下完整工程
ercircle 发表于 2025-9-22 11:33
什么问题?需要帮助吗?可以描述下问题,上传下完整工程
在跑APP代码时,串口2中断数据量大时会异常重启的现象,上有贴共用中断的部分代码 jieke0912 发表于 2025-9-22 13:22
在跑APP代码时,串口2中断数据量大时会异常重启的现象,上有贴共用中断的部分代码 ...
没有显示,可以重新打包上传完整可复现问题工程
您好,工程已上传,单独共用串口2中断还是会出现复位的现象,在跑APP时程序很卡顿,取消IAP中的中断共享后就正常,因采用WIFI模组接收,需配合硬件才好复现此问题,试过IAP中采用绝对地址跳转到APP中还是一样的情况,先帮忙看下程序IAP与APP中断共享这块配置是否有问题,感谢! ercircle 发表于 2025-9-22 13:56
没有显示,可以重新打包上传完整可复现问题工程
您好,工程已上传,麻烦帮忙看看配置是否有问题,主要是串口2数据量大时容易复位重启,像是堆栈溢出程序跑飞了
页:
[1]
2