共2条
1/1 1 跳转至页
2104IRQ 关于2104IRQ中断C语言编程的一点心得。

问
使用EasyARM2104试验板,使用外部中断1实现LED点亮/熄灭控制,与EINT1连接的是KEY1,当有键按下时,即可触发外部中断。
方法1:
中断向量
CODE32
AREA vectors,CODE,READONLY
ENTRY
;interrupt vectors
;中断向量表
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0] ;注意
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
主程序
/********************************************************************************************************
*File : EINT0_LED.C
*功能 : 使用外部中断1进行LED的控制,没当有一次中断时,即取反LED,以便指示中断输入
*说明 : 无
********************************************************************************************************/
#include "config.h"
#define LEDCON 0x00002000 /* P0.13引脚控制LED4,低电平点亮 */
/*******************************************************************************************************
*名称 : IRQ_Eint1()
*功能 : 外部中断0处理函数
*入口参数 : 无
*出口参数 : 无
*******************************************************************************************************/
void __irq IRQ_Eint1(void)
{
uint32 i;
i = VICIRQStatus; //读出VICIRQStatus的值
i = IOSET; //读出当前LED控制值
if((i&LEDCON)==0) //控制LED输出
{
IOSET = LEDCON;
}
else
{
IOCLR = LEDCON;
}
while((EXTINT&0x02)!=0) //等待外部中断恢复为高电平
{
EXTINT = 0x02; //清除EINT1中断标志
}
VICVectAddr = 0;
}
/******************************************************************************************************
*名称 : main()
*功能 : 初始化外部中断1及I/O连接等
******************************************************************************************************/
int main (void)
{// add user source code
PINSEL0 = 0x20000000; //设置I/O口工作模式,P0.14为EINT1
PINSEL1 = 0x00000000;
IODIR = LEDCON; //设置LED控制口为输出,其它I/O为输入
/* 打开EINT0中断(不设置向量控制器,即使用非向量IRQ) */
VICDefVectAddr = (uint32)IRQ_Eint1;
VICIntSelect = 0x00000000;
VICIntEnable = 0x00008000;
EXTINT = 0x07; //清除外部中断标志
while(1); //等待中断
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
方法2:
中断向量
IMPORT IRQ_Eint1
CODE32
AREA vectors,CODE,READONLY
ENTRY
;interrupt vectors
;中断向量表
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD IRQ_Eint1
FIQ_Addr DCD FIQ_Handler
主程序:
主程序
/********************************************************************************************************
*File : EINT0_LED.C
*功能 : 使用外部中断1进行LED的控制,没当有一次中断时,即取反LED,以便指示中断输入
*说明 : 无
********************************************************************************************************/
#include "config.h"
#define LEDCON 0x00002000 /* P0.13引脚控制LED4,低电平点亮 */
/*******************************************************************************************************
*名称 : IRQ_Eint1()
*功能 : 外部中断0处理函数
*入口参数 : 无
*出口参数 : 无
*******************************************************************************************************/
void __irq IRQ_Eint1(void)
{
uint32 i;
i = VICIRQStatus; //读出VICIRQStatus的值
i = IOSET; //读出当前LED控制值
if((i&LEDCON)==0) //控制LED输出
{
IOSET = LEDCON;
}
else
{
IOCLR = LEDCON;
}
while((EXTINT&0x02)!=0) //等待外部中断恢复为高电平
{
EXTINT = 0x02; //清除EINT1中断标志
}
VICVectAddr = 0;
}
/******************************************************************************************************
*名称 : main()
*功能 : 初始化外部中断1及I/O连接等
******************************************************************************************************/
int main (void)
{// add user source code
PINSEL0 = 0x20000000; //设置I/O口工作模式,P0.14为EINT1
PINSEL1 = 0x00000000;
IODIR = LEDCON; //设置LED控制口为输出,其它I/O为输入
/* 打开EINT0中断(不设置向量控制器,即使用非向量IRQ) */
VICIntSelect = 0x00000000;
VICIntEnable = 0x00008000;
EXTINT = 0x07; //清除外部中断标志
while(1); //等待中断
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
注:以上两种方法都要求系统模式下开IRQ中断
即
;设置系统模式堆栈
MSR CPSR_c, #0x5f
LDR SP, =StackUsr
答 1: 这不是例程吗?看不出楼主的心得在那里! 答 2: 是指中断向量表IRQ处有两种写法吧 答 3: 第一种在红皮书上面一样有写,第二种就完全是例程。 答 4: 画个圈报道 答 5: 收 答 6: 摘抄~~~~
方法1:
中断向量
CODE32
AREA vectors,CODE,READONLY
ENTRY
;interrupt vectors
;中断向量表
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0] ;注意
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
主程序
/********************************************************************************************************
*File : EINT0_LED.C
*功能 : 使用外部中断1进行LED的控制,没当有一次中断时,即取反LED,以便指示中断输入
*说明 : 无
********************************************************************************************************/
#include "config.h"
#define LEDCON 0x00002000 /* P0.13引脚控制LED4,低电平点亮 */
/*******************************************************************************************************
*名称 : IRQ_Eint1()
*功能 : 外部中断0处理函数
*入口参数 : 无
*出口参数 : 无
*******************************************************************************************************/
void __irq IRQ_Eint1(void)
{
uint32 i;
i = VICIRQStatus; //读出VICIRQStatus的值
i = IOSET; //读出当前LED控制值
if((i&LEDCON)==0) //控制LED输出
{
IOSET = LEDCON;
}
else
{
IOCLR = LEDCON;
}
while((EXTINT&0x02)!=0) //等待外部中断恢复为高电平
{
EXTINT = 0x02; //清除EINT1中断标志
}
VICVectAddr = 0;
}
/******************************************************************************************************
*名称 : main()
*功能 : 初始化外部中断1及I/O连接等
******************************************************************************************************/
int main (void)
{// add user source code
PINSEL0 = 0x20000000; //设置I/O口工作模式,P0.14为EINT1
PINSEL1 = 0x00000000;
IODIR = LEDCON; //设置LED控制口为输出,其它I/O为输入
/* 打开EINT0中断(不设置向量控制器,即使用非向量IRQ) */
VICDefVectAddr = (uint32)IRQ_Eint1;
VICIntSelect = 0x00000000;
VICIntEnable = 0x00008000;
EXTINT = 0x07; //清除外部中断标志
while(1); //等待中断
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
方法2:
中断向量
IMPORT IRQ_Eint1
CODE32
AREA vectors,CODE,READONLY
ENTRY
;interrupt vectors
;中断向量表
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD IRQ_Eint1
FIQ_Addr DCD FIQ_Handler
主程序:
主程序
/********************************************************************************************************
*File : EINT0_LED.C
*功能 : 使用外部中断1进行LED的控制,没当有一次中断时,即取反LED,以便指示中断输入
*说明 : 无
********************************************************************************************************/
#include "config.h"
#define LEDCON 0x00002000 /* P0.13引脚控制LED4,低电平点亮 */
/*******************************************************************************************************
*名称 : IRQ_Eint1()
*功能 : 外部中断0处理函数
*入口参数 : 无
*出口参数 : 无
*******************************************************************************************************/
void __irq IRQ_Eint1(void)
{
uint32 i;
i = VICIRQStatus; //读出VICIRQStatus的值
i = IOSET; //读出当前LED控制值
if((i&LEDCON)==0) //控制LED输出
{
IOSET = LEDCON;
}
else
{
IOCLR = LEDCON;
}
while((EXTINT&0x02)!=0) //等待外部中断恢复为高电平
{
EXTINT = 0x02; //清除EINT1中断标志
}
VICVectAddr = 0;
}
/******************************************************************************************************
*名称 : main()
*功能 : 初始化外部中断1及I/O连接等
******************************************************************************************************/
int main (void)
{// add user source code
PINSEL0 = 0x20000000; //设置I/O口工作模式,P0.14为EINT1
PINSEL1 = 0x00000000;
IODIR = LEDCON; //设置LED控制口为输出,其它I/O为输入
/* 打开EINT0中断(不设置向量控制器,即使用非向量IRQ) */
VICIntSelect = 0x00000000;
VICIntEnable = 0x00008000;
EXTINT = 0x07; //清除外部中断标志
while(1); //等待中断
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
注:以上两种方法都要求系统模式下开IRQ中断
即
;设置系统模式堆栈
MSR CPSR_c, #0x5f
LDR SP, =StackUsr
答 1: 这不是例程吗?看不出楼主的心得在那里! 答 2: 是指中断向量表IRQ处有两种写法吧 答 3: 第一种在红皮书上面一样有写,第二种就完全是例程。 答 4: 画个圈报道 答 5: 收 答 6: 摘抄~~~~
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 |