我准备利用按键产生中断来控制led灯的变化,按键接在eint4567管脚上,可是我的程序运行后发现无法进入中断,希望各位大虾能够指点,不胜感激!!
init.s代码:
INTMSK EQU 0x01e0000c
WTCON EQU 0x01d30000
IMPORT HandlerEINT4567
AREA Init,CODE,READONLY
ENTRY
b ResetHandler ; 0x00 Reset
b . ; 0x04 Undef
b . ; 0x08 SWI interrupt handler
b . ; 0x0c handlerPAbort
b . ; 0x10 handlerDAbort
b . ; 0x14 handlerReserved
b . ; 0x18 IRQ
b . ; 0x1c FIQ
b . ; 0x20
b .
b .
b .
b .
ldr pc,=HandlerEINT4567
IMPORT Main
ResetHandler
; Disable all interrupt
ldr r0,=INTMSK
ldr r1,=0x07ffffff
str r1,[r0]
; Initialize Stacks
ldr r13, =SVCStack
; Disable watch dog
ldr r0, =WTCON
ldr r1, =0x0
str r1,[r0]
; Set the CPU mode if necessary
; Branch to the C program main process
BL Main
; *******************************************************
; Stack data area define
; *******************************************************
ALIGN
AREA RamData, DATA, READWRITE
; Where the stacks grows
MAP 0x0C000200
SVCStack # 256
IRQStack # 256
END
main.c代码:
#include "f:\arminclude\44b.h"
#include "f:\arminclude\option.h"
volatile char which_int=0;
__inline void enable_IRQ(void)
{
int tmp;
__asm
{
MRS tmp, CPSR
BIC tmp, tmp, #0x80
MSR CPSR_c, tmp
}
}
__inline void disable_IRQ(void)
{
int tmp;
__asm
{
MRS tmp, CPSR
ORR tmp, tmp, #0x80
MSR CPSR_c, tmp
}
}
void led_display(int m)
{
switch (m)
{
case 3:
rPDATF=rPDATF^0x20;
break;
case 4:
rPDATF=rPDATF^0x40;
break;
case 5:
rPDATF=rPDATF^0x80;
break;
case 6:
rPDATF=rPDATF^0x100;
break;
default:
break;
}
}
void __irq HandlerEINT4567(void)
{
which_int=rEXTINTPND; //获取中断源为中断4567中的哪一个
rEXTINTPND=0xf; //clear EXTINTPND reg.
rI_ISPC=BIT_EINT4567; //clear pending_bit
switch(which_int)//根据中断源,点亮led
{
case 1:
led_display(3);
which_int=0;
break;
case 2:
led_display(4);
which_int=0;
break;
case 4:
led_display(5);
which_int=0;
break;
case 8:
led_display(6);
which_int=0;
break;
default :
break;
}
}
void port_init(void)
{
rPCONF=0x09240a;
rPUPF=0x1f;
rPDATF=0x0;
}
void isr_Init(void)
{
rINTCON=0x5; // IRQ中断使能
rINTMOD=0x0; // All=IRQ mode
rPCONG=0xffff; //EINT7~0
rPUPG=0x0; //pull up enable
rEXTINT=0x0; // 使能低电平触发
rINTMSK=~(BIT_GLOBAL|BIT_EINT4567); file://start INT,去除外EINT4567的屏}
int Main(void)
{
// rSYSCFG=0x0e; //使用8K字节的指令缓存
port_init(); //IO端口功能、方向设定
isr_Init(); //中断初始化
enable_IRQ ();
while(1);
}
[em01][em01]
打赏帖 | |
---|---|
【Zephyr】使用Zephyr外设初始化过程解析被打赏30分 | |
【S32K146】S32DS watchdog 配置使用被打赏20分 | |
【Zephyr】使用 IAR 调试 Zephyr 镜像被打赏20分 | |
赚取电动螺丝刀+电源电路理论知识分享1被打赏5分 | |
我想要一部加热台+分享常见运算放大器电路的应用被打赏5分 | |
【Zephyr】MCXN947 Zephyr 开发入门适配shell被打赏20分 | |
我想要一部加热台+常见的MOS管驱动电路被打赏5分 | |
【我要开发板】6.联合MATLAB记录数据被打赏50分 | |
【换取手持数字示波器】MicrochipMPLABHarmony框架下串口调试printf输出记录被打赏29分 | |
【瑞萨RA2E1开发板】:使用ADC功能实现位移传感器采集方案被打赏20分 |