博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《tiny6410裸机程序》第七章:S3C6410外部中断简介
阅读量:4180 次
发布时间:2019-05-26

本文共 2289 字,大约阅读时间需要 7 分钟。

====================================================================================================================================

  本章内容是为下面要进行的按键裸机驱动做准备,主要讲解tiny6410的外部中断:涉及GPIO复用引脚设置为特殊功能作为中断源、子(外部)中断源设置寄存器EINT以及VIC总中断控制器等。

  说明:VIC是ARM的总中断控制器,EINT是外部子中断源控制器,GPIO复用作为中断产生源。EINT外部子中断源控制器和VIC总中断控制器相关寄存器的设置,决定了ARM核是否响应外部GPIO中断源信号以及响应的优先级。

按键的硬件连接如下:

  KEY1 KEY3 KEY5
GPIO GPN0/xEINT0 GPN2/xEINT2 GPN4/xEINT4

以下讲解都将以按键为例:

一、GPIO作为中断源

1.介绍

在以前常见的GPIO作为中断源使用的时候,需要首先设置GPIO复用功能为特殊功能、即EINT(外部中断引脚);同时该引脚可以捕捉什么类型的输入信号。

2.相应GPIO寄存器

rGPIONCON = 0x7F00 8830   //GPN设置,此时设置为EINT(外部中断)模式

rGPIONPUD = 0x7F00 8838   //上拉/下拉使能

//注意该种模式下,我们就不需要设置rGPIODAT寄存器了。

二、对应的EINT即外部(子)中断源设置寄存器(注意区别“三“中的总中断控制寄存器)

rEINT0CON0 = 0x7F00 8900  //上述GPIO设置为EINT模式后,需要设置外部(子)中断类型、GPIO的上升沿或下降沿等。

rEINT0MASK = 0x7F00 8920  //上述GPIO设置为EINT模式后,需要设置外部(子)中断源屏蔽寄存器、取消屏蔽。

rEINT0PEND = 0x7F00 8924  //上述GPIO设置为EINT模式后,当有某个外部中断产生时、相应位自动变0;我们在中断服务程序中可以通过判断位为0来看是共用总中断号中的那个外部子中断发生,进而做细化处理。当然,处理完后、这位必须由程序员软件置1。

三、S3C6410的中断控制器(也叫中断总控制器,注意区分上述"二"中讲解的子(外部)中断源控制寄存器)

1.介绍

  S3C6410中断控制器由两个VIC(Vectored Interrupt Controller, ARM PrimeCell)组成和两个TZIC’s(TrustZone Interrupt Controller SP890),两个TZIC’s和VIC’s很好的接合起来支持64个中断源。

  S3C6410的向量中断控制器的特性如下:每个VIC控制器包含32向量中断,固定的硬件中断优先级别,可编程的中断优先级,支持硬件的中断优先级屏蔽,可编程的硬件的中断优先级屏蔽,可产生一般中断和快速中断,可产生软件中断,原生的中断状态,中断请求状态,支持特权模式来限制访问。

2.VIC(全部中断;包括内部中断和外部总段)中断控制器常用寄存器

向量中断处理程序地址寄存器VIC0的地址是:

rVIC0INTENABLE = 0x7120 0010

//中断使能寄存器;使能对应的中断信号,使能中断信号只能通过该寄存器,如果禁用中断使用VICxINTENCLEAR寄存器,在系统重置后,所有中断都默认被禁用。

//我们要设置该寄存器,让它响应外部EINT中断

rVIC0VECTADDR = 0x7120 0100 ~ 0x7120 017C

//向量中断处理程序地址寄存器:每个寄存器对应一个中断源的ISR处理程序地址。

rVIC0ADDR = 0x7120 0F00

//向量地址寄存器:该寄存器里存放的是当前正在处理的ISR中断服务例程的地址。当前正在处理中断时,只能从该寄存器里读取其值,在处理完中断时向该寄存器里写入任何值都可以清除其值。

向量中断处理程序地址寄存器VIC1的地址是:

rVIC1INTENABLE = 0x7130 0010

//中断使能寄存器;使能对应的中断信号,使能中断信号只能通过该寄存器,如果禁用中断使用VICxINTENCLEAR寄存器,在系统重置后,所有中断都默认被禁用。

rVIC1VECTADDR = 0x7130 0100 ~ 0x7130 017C

//向量中断处理程序地址寄存器:每个寄存器对应一个中断源的ISR处理程序地址。

rVIC1ADDR = 0x7130 0F00

//向量地址寄存器:该寄存器里存放的是当前正在处理的ISR中断服务例程的地址。当前正在处理中断时,只能从该寄存器里读取其值,在处理完中断时向该寄存器里写入任何值都可以清除其值。

四、总结

步骤:

1.设置rGPIONCON寄存器,让GPN复用口为xEINT即外部中断模式;

2.设置rGPIONPUD寄存器,让GPN口使能上升和下降沿信号捕捉;

3.设置子(外部)中断源控制器寄存器rEINT0CON0,设置中断类型是GPN复用口xEINT的上升或下降沿;

4.设置子(外部)中断源屏蔽寄存器rEINT0MASK,不要屏蔽我们使用的GPN口;

5.设置总中断控制器VIC的rVIC0INTENABLE寄存器,已使能对该外部子中断EINT对应总中断的支持;

6.设置总中断控制器VIC的rVICTADDR寄存器,即是中断服务程序的入口地址。

转载地址:http://pegai.baihongyu.com/

你可能感兴趣的文章
Recycler表格(excelPanel)
查看>>
android一行代码实现沉浸式布局效果
查看>>
json, recyclerView问题
查看>>
cmake处理多源文件目录的方法
查看>>
Service Intent must be explicit
查看>>
android studio SDK开发
查看>>
studio 统计代码的行数
查看>>
字符数组和16进制互换
查看>>
PHP项目中出现致命错误: Class 'Redis' not found
查看>>
There is no tracking information for the current branch.
查看>>
fatal: refusing to merge unrelated histories
查看>>
Git命令还原未提交的变更
查看>>
Linux系统中环境变量的配置
查看>>
Linux系统中配置脚本程序开机启动
查看>>
让Linux系统上的nginx支持php程序
查看>>
源码编译安装LNMP环境之Nginx篇
查看>>
源码编译安装LNMP环境之PHP篇
查看>>
Linux中rpm工具使用教程
查看>>
Linux中yum工具使用教程
查看>>
C++字符串函数
查看>>