ARM中断分析之二:裸机下面的中断处理

EINT4中断的裸机处理

这是基于S3C2410的EINT4中断的裸机处理,当中断发生时就把LED灯取反显示。下面是电路图。

上面是外部KEY连接到CPU的EINT4引脚上面,即:按下键就会产生一个中断。

 

按照先前介绍的,中断处理流程来介绍,包括:初始化中断、处理中断、处理完毕恢复中断。

一、引导代码

int main(void)
{
    EINT_init();   // 外部中断初始化、中断控制器初始化
    IRQEnable(); // 使能IRQ中断 (清零CPSR寄存器的I位)

    while(1);       // 等待外部中断
}

二、初始化代码函数:EINT_init。

    EINT_init包括:外部中断初始化、中断控制器初始化。设置GPF4引脚为外部中断EINT4功能,下降沿触发模式,并使能中断允许。
void EINT_init(void)
{
    rGPFCON = (rGPFCON & 0xFFFFFCFF) | (0x02<<8); // 设置GPF4引脚为外部中断EINT4功能
    rEXTINT0 = (0x2<<16); // 外部中断EINT4设置为下降沿触发

    VICVectAddr[4] = (uint32) IRQ_Eint4; // 中断向量地址设置

    rPRIORITY = 0x00000000; // 使用默认的固定的优先级
    rINTMOD = 0x00000000; // 所有中断均为IRQ中断
    rINTMSK = ~0x0000010; // 使能EINT4中断(第一级)

    rEINTMASK = ~0x0000010; // 使能第二级中断
}

三、使能IRQ中断函数:IRQEnable。

    功能是:使能IRQ中断 (清零CPSR寄存器的I位),代码如下:
; 开IRQ中断
MRS R0, SPSR
BIC R0, R0, #I_BIT
MSR SPSR_c, R0
MOVS PC, LR

四、IRQ_Exception中断异常处理程序(实现向量中断处理),用户无需改动,代码如下:
void __irq IRQ_Exception(void)     // 注意这个函数名之前的 __irq ,编译器会有特别动作。
{
    void (*__Handler)(void);
    int irq_no;
    uint32 bak;

    // 找出当前中断号
    bak = rINTPND; // 读取INTPND的值
    for(irq_no=0; irq_no<32; irq_no++)
    {
        bak = bak>>1;
        if(bak == 0) break; // 获得最高的优先级
    }

    // 取得中断服务程序地址并执行
    __Handler = (void (*)(void)) VICVectAddr[irq_no];
    __Handler();
}

五、EINT4的中断处理函数:IRQ_Eint4。

    功能:把LED1控制口输出信号取反。
void IRQ_Eint4(void)
{
    // 把LED1控制口输出信号取反
    // 省略...

    // 清除中断标志
    rEINTPEND = (1<<4); // 清除第二级的中断标识
    rSRCPND = (1<<4); // 清除第一级的中断标识
    rINTPND = rINTPND; // 清除mask过滤后的中断标识
}

从上面的代码中,大约可以得出每个阶段的流程:初始化时要一级一级的设置好mask,中断服务之后要一级一级的清理中断标识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Zynq是赛灵思(Xilinx)公司推出的一款SoC(System on a Chip),集成了ARM处理器和可编程逻辑部分。裸机是指在没有操作系统支持的情况下,直接在硬件平台上进行编程的方式。USB(Universal Serial Bus)是一种用于连接外部设备和计算机的通信接口。 在Zynq裸机环境中进行USB分析时,需要对USB通信协议和硬件接口有一定的了解。USB协议包括传输、设备和主机之间的通信规则和规范。在编程中,需要通过读取和写入USB寄存器来控制USB设备的数据传输和状态管理。 首先,需要初始化USB控制器和连接的设备。通过设置相应的寄存器,将USB控制器切换到USB主机模式,并与USB设备进行握手和通信。 然后,需要进行USB数据传输的配置和管理。通过设置传输控制和配置寄存器,选择数据传输的类型(如控制、批量、中断或等时传输),并设置数据包的大小和方向。 进行USB数据传输时,可以按照USB协议的规定,使用同步、异步或中断方式读取和写入数据。通过读取状态和中断寄存器,可以获取USB设备的状态和处理中断事件。 对于USB外设的驱动程序开发,还需根据具体的应用场景和需求进行功能扩展。例如,可以实现USB的热插拔支持,通过检测设备的插入和拔出事件,动态地进行设备的识别和初始化。 总之,Zynq裸机环境下的USB分析需要熟悉USB协议和硬件接口,并通过操作相关寄存器进行设备的初始化、数据传输和状态管理。这样可以实现基于Zynq的USB设备控制和数据交互,满足特定应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值