实现方式有两种:第一种 0x18处放置 在发生中断时 跳到VICVectAddr中的地址处 代码如下
EXTERN undef_handler, prefetch_handler, data_handler, fiq_handler
ARM
__vector:
;;
ldr pc,[pc,#+24] ;; Reset
ldr pc,[pc,#+24] ;; Undefined instructions
B . ;; Software interrupt (SWI/SVC)
ldr pc,[pc,#+24] ;; Prefetch abort
ldr pc,[pc,#+24] ;; Data abort
__vector_0x14:
DC32 0 ;; RESERVED
ldr pc,[pc,#-0xFF0] ;; IRQ
ldr pc,[pc,#+24] ;; FIQ
DC32 __iar_program_start ;; Reset
DC32 undef_handler ;; Undefined instructions
DC32 0 ;; Software interrupt (SWI/SVC)
DC32 prefetch_handler ;; Prefetch abort
DC32 data_handler ;; Data abort
DC32 0 ;; RESERVED
DC32 0 ;; IRQ
DC32 fiq_handler ;; FIQ
第二种 这种方式也可以称为万能的中断方式 可以用于任何一种ARM 程序先跳到一个C语言编写的函数中 然后在这个函数里找到中断服务程序的地址(找中断服务程序地址的方法会因芯片的不同而不同)
EXTERN IRQ_Handler
ARM
__vector:
;;
ldr pc,[pc,#+24] ;; Reset
B . ;; Undefined instructions
B . ;; Software interrupt (SWI/SVC)
B . ;; Prefetch abort
B . ;; Data abort
__vector_0x14:
DC32 0 ;; RESERVED
ldr pc,[pc,#+24] ;; IRQ
ldr pc,[pc,#+24] ;; FIQ
DC32 __iar_program_start ;; Reset
DC32 0 ;; Undefined instructions
DC32 0 ;; Software interrupt (SWI/SVC)
DC32 0 ;; Prefetch abort
DC32 0 ;; Data abort
DC32 0 ;; RESERVED
DC32 IRQ_Handler ;; IRQ
这种是跳到C函数IRQ_Handler中,IRQ_Handler 的代码如下,其功能也是取出 VICVectAddr中的地址进行执行
__irq __arm void IRQ_Handler(void)
{
void (*interrupt_function)();
unsigned int vector;
vector = VICVectAddr; // 取得中断服务程序地址
interrupt_function = (void(*)())vector;
(*interrupt_function)(); // Call vectored interrupt function.
VICVectAddr = 0; // 清除中断
}
上一篇:利用IAR调试Mini2440
下一篇:LPC1768 SPI 外设控制DA(PCM1796)调试记录
推荐阅读最新更新时间:2024-03-16 16:19
设计资源 培训 开发板 精华推荐
- 平头哥RVB2601开源应用方案征集来啊~100套板卡助阵,天猫精灵智能套装礼品组等你抱走~
- TI有奖创意征集,CC3200开发套件等100份礼品等你来
- NXP微控制器电路板,针对USB Type C接口设计,评测创意有奖征集,晒心得更有多重好礼!
- Mouser 新用户大礼包:你购物,我5折返E金币!
- MPS 隔离式稳压 DC/DC 模块——MIE系列首发,邀你一探究竟!
- 【世健的ADI之路主题游】 第三站:了解物联网前沿器件与方案,打卡赢Kindle、《新概念模拟电路》
- 跟帖免费申请UFUN学习板开始啦,跟着张进东学习&进阶模拟、工程技能
- 免费测评|涂鸦三明治Wi-Fi&BLE 开发板
- 【已结束】TE 直播|如何有效应对当下测试测量领域的挑战
- 免费申请评测:1.3元起的国产USB和Touchkey单片机CH554评估板