按键中断部分的理解

初始准备

  • 初始化串口

初始化Tx、Rx对应的GPIO引脚

设置1个停止位,8位数据位

发送和接收都是polling

禁止modem、afc

波特率设置

  • 初始化按键中断(在key.c中:以中断方式处理按键)

外部中断对应的GPIO设置

中断触发模式

中断允许

清挂起,清除是写1

  • 绑定好异常向量表、初始化中断控制器

绑定异常向量表

禁止所有中断

选择中断类型为IRQ

清VICxADDR

  • 绑定isr到中断控制器硬件
  • 使能中断

运行过程:

程序运行-----> 按键按下-------->硬件自动跳转到异常向量表的IRQ中断部分 -------->由于向量表这里写的是IRQ_handle的函数地址,所以又发生一次跳转 ----------

---> 到汇编中执行IRQ_handle,具体作用为:保护现场、跳转到真正的中断处理程序、返回时的现场恢复 ---------> 到.c文件中执行IRQ_handler函数 --------->由于除了按键之外的其他的一些中断也会导致发生IRQ中断,所以不一定是按键中断------->由于S5PV210帮我们硬件实现了发生的中断位置1,所以我们只需要到vicaddr[i]中读取函数执行就可以了。

第二次理解:

S5PV210中,有异常向量表,当出现中断时会硬件会自动跳转到异常向量表中,去执行向量表中对应的代码,但是向量表中实际上每个异常只提供了4个字节,所以我们在异常向量表中存的实际上是中断处理函数的地址。

那么分析一下,按键处理的中断,首先我们做好初始工作

按键部分key.c:

  • 按键设置为中断处理模式
  • 下降沿触发
  • 中断允许
  • 清挂起
  • 写好真正的中断处理程序以便于将来和VICnADDRESS中的中断源编号绑定。

中断部分int.c:

  • 写好异常向量表中各个中断对应的异常处理代码,重点写好中断处理的代码。
  • 绑定异常中断处理函数的地址到异常向量表
  • 初始化中断控制器:禁止所有中断 VICnINTENCLEAR = 0xffffffff;选择中断类型为IRQ中断,清除清VICnVECTADDR
  • 写好绑定函数,用于绑定isr到VICnVECTADDR
  • 使能中断函数VICnINTENABLE
  • 禁止中断函数VICnINTENCLEAR
  • 中断处理程序:直接到VICnVECTADDR中取出isr函数去执行

汇编文件start.S

  • 写好中断保护现场的过程

main函数

  • 做好中断初始化 
  • 串口初始化
  • 调用绑定异常向量表函数
  • 调用绑定isr函数
  • 使能中断

按键iRQ中断执行步骤:

  • (1)按键按下
  • (2)硬件跳转到异常向量表执行对应的中断处理,同时将isr硬件自动推送到VICnVECTADDR
  • (3)异常向量表中是IRQ中断地址,指向汇编文件,在汇编文件中做好现场保护工作,比如设置IRQ模式下的栈,保存r0~r12,跳转到中断处理程序
  • (4)从汇编跳转到中断处理程序中执行,使用指针的方式间接访问VICnVECTADDR中由硬件自动推送的函数,执行。
  • (5)程序执行结束,跳转到汇编中恢复现场
原文地址:https://www.cnblogs.com/jxjl/p/7112909.html