Files
stc32g128k/App/isr_jump.asm

35 lines
2.4 KiB
NASM
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; =========================================================================
; STC32G 端口中断硬件中转绝对定位汇编模块 (A251 语法格式)
; =========================================================================
; 【技术原理分析】:
; 1. Keil C251 编译器为了节省硬件资源,默认的 `interrupt` 关键字只支持 0 ~ 31 范围的软件中断向量号。
; 2. 然而STC32G 单片机拥有大量的扩展硬件外设,其 Port0 端口中断物理向量号为 37Port2 端口中断物理向量号为 39
; 超出了编译器的直接定义范畴。如果直接在 C 语言中声明 `interrupt 37`,编译器会报错。
; 3. 为此,本汇编模块采用“绝对地址跳转重定向”技术:
; - 直接在硬件物理中断向量入口地址Port0: 0x00012B, Port2: 0x00013B处放置一条长跳转 `LJMP` 汇编指令。
; - 将触发的物理中断强行重定向引导至 Keil C251 所能合法编译生成的较小编译向量入口地址(例如 13 号和 15 号中断服务程序入口)。
; - 由此,我们在 C 语言中声明 `interrupt 13` 和 `interrupt 15`,就能够成功被硬件 Port0 和 Port2 端口中断触发调用。
; =========================================================================
NAME ISR_JUMP ; 定义当前汇编模块的名字为 ISR_JUMP
; -------------------------------------------------------------------------
; 端口 0 掉电唤醒中断跳转配置
; -------------------------------------------------------------------------
; 硬件 Port0 中断向量号 37 对应的绝对闪存入口地址为 0x00012B
CSEG AT 00012BH
; 当硬件触发 Port0 中断时,程序计数器 (PC) 定位到 00012BH此处 LJMP 指令强行将 PC 指向 00006BH
; 0x00006B 即为 C 语言声明的 `interrupt 13` 所对应的中断服务函数入口地址
LJMP 00006BH
; -------------------------------------------------------------------------
; 端口 2 掉电唤醒中断跳转配置
; -------------------------------------------------------------------------
; 硬件 Port2 中断向量号 39 对应的绝对闪存入口地址为 0x00013B
CSEG AT 00013BH
; 当硬件触发 Port2 中断时,程序计数器 (PC) 定位到 00013BH此处 LJMP 指令强行将 PC 指向 00007BH
; 0x00007B 即为 C 语言声明的 `interrupt 15` 所对应的中断服务函数入口地址
LJMP 00007BH
END ; 汇编文件结束标志