初始准备
- 初始化串口
初始化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)程序执行结束,跳转到汇编中恢复现场