• 外设中断产生 + CPU响应中断并返回的控制流程


    假设外设为物理按键,需要连接到支持中断功能的对应的GPIO上。
    CPU型号为:三星的S5PV210
    本文所描述的中断控制流程适用性广泛,因为主流CPU的中断设计原理是相通的,只有细节的差异。


    第一部分:按键外设对应中断功能的配置
    1、按键对应的GPIO模式设置:设置为EXT_INT模式
    2、该外设对应的中断触发模式设置:电平或边沿触发
    3、该外设中断Mask和Pend寄存器位设置
    4、编写该外设中断对应的ISR中断处理函数程序


    第二部分:CPU内部响应中断的配置
    Part1:前期准备工作
    1、初始化系统异常控制器函数system_init_exception()
       功能如下:
       绑定异常向量表对应的中断服务函数;
       关闭所有中断使能;
       选择中断类型为IRQ;
       清空中断向量控制地址寄存器VICxADDR
       
    2、绑定写好的中断处理函数程序ISR到中断控制器对应的VICnVECTADDR寄存器

    3、使能对应中断向量编号的中断源,即外设按键对应的中断源编号

    Part2:外部按键产生中断后,CPU响应该中断
    1、CPU读取异常向量表信息,并跳转到IRQ函数的入口地址
    2、先进行程序现场保护(在Start.s完成),然后跳转到irq_handler()函数,
    3、该irq_handler()函数功能用于判断具体哪个中断向量寄存器VIC发生中断,并调用对应的外设按键对应的ISR中断处理函数
    4、ISR函数执行完毕后,程序现场恢复(在Start.s完成),并返回到主函数继续执行后续的程序。

    1. // 在这个汇编函数中,用来做中断模式下的现场保护和恢复,并且调用真正的中断处理程序
    2. IRQ_handle:
    3. // 设置IRQ模式下的栈
    4. ldr sp, =IRQ_STACK
    5. // 保存LR
    6. // 因为ARM有流水线,所以PC的值会比真正执行的代码+8,
    7. sub lr, lr, #4
    8. // 保存r0-r12和lr到irq模式下的栈上面
    9. stmfd sp!, {r0-r12, lr}
    10. // 在此调用真正的isr来处理中断
    11. bl irq_handler
    12. // 处理完成开始恢复现场,其实就是做中断返回,关键是将r0-r12,pc,cpsr一起回复
    13. ldmfd sp!, {r0-r12, pc}^

  • 相关阅读:
    【星海出品】C++类的学习(通过代码)
    游戏APP失踪事件,连环杀
    在Vue 3中加载本地图片和其他静态资源
    [C++随笔录] string模拟实现
    DBCO-PEG3-Maleimide,Mal-PEG3-DBCO,二苯并环辛炔-三聚乙二醇-马来酰亚胺
    【OpenCV 例程200篇】214. 绘制椭圆的参数详解
    改进方法实验测试
    北京地标-自动驾驶高精度地图特征定位数据技术规范
    Python Flask 离线环境的搭建
    本地环境搭建
  • 原文地址:https://blog.csdn.net/CAOXUN_FPGA/article/details/127755492