740 likes | 1.01k Views
主讲人:鞠 雷 山东大学 计算机科学与技术学院. 微机原理与接口技术 第五章 ARM 接口设计技术. 内容提要. 键盘接口. LED 显示器. LCD 显示器与触摸屏接口(了解). 通讯与 中断接口. A/D 和 D/A 转换器接口. ARM 的 JTAG 接口. 2. 中断接口概述. CPU 与外设之间传输数据的控制方式通常有 3 种 查询方式、中断方式和 DMA 方式。 中断方式在嵌入式系统中应用极为广泛 节省 CPU 时间,提高 CPU 的利用率
E N D
主讲人:鞠 雷 山东大学 计算机科学与技术学院 微机原理与接口技术第五章 ARM接口设计技术
内容提要 键盘接口 LED显示器 LCD显示器与触摸屏接口(了解) 通讯与中断接口 A/D和D/A转换器接口 ARM的JTAG接口 2
中断接口概述 • CPU与外设之间传输数据的控制方式通常有3种 • 查询方式、中断方式和DMA方式。 • 中断方式在嵌入式系统中应用极为广泛 • 节省CPU时间,提高CPU的利用率 • 最初ARM7TDMl内核只有FIQ(快速中断请求)和IRQ(通用中断请求)两种中断,各芯片厂家在设计芯片时为满足外设的需求,又定义、扩充了若干个中断源。 3
S3C44B0X的中断控制器可接受来自30个中断源的中断请求S3C44B0X的中断控制器可接受来自30个中断源的中断请求 IRQ矢量中断模式,硬件加速、缩短中断反应时间。 矢量中断 为30个中断源分配26个中断向量(外部中断4~7共用一个,两个串口错误共用一个)。 非矢量中断 30个中断源共用一个地址0x18,软件查询INTPND确定中断源。 中断控制器的任务就是经过优先级判定选择,再通过FIQ或IRQ向内核发出中断请求 4
中断控制器 • ARM7TDMI有2种类型的中断模式:FIQ和IRQ • IRQ和FIQ之间的区别是: • 对于FIQ必须尽快处理事件并离开这个模式; • IRQ可以被FIQ中断,但IRQ不能中断FIQ • 为了使FIQ更快,FIQ模式具有更多的私有寄存器。 主要寄存器: 1.中断控制寄存器INTCON F、I和矢量模式允许和禁止 2、中断请求寄存器INTPND 30个中断源中断请求状态 3、中断模式寄存器INTMOD 30个中断源的F或I模式选择 4、中断屏蔽寄存器INTMSK 30个中断源的允许或禁止 5
CPSR的F位和I位 • CPSRARM7TDMI处理器的程序状态寄存器 • 如果CPSR的F位被设置为1,处理器将不接受来自中断控制器的FIQ; • 如果CPSR的I位被设置为1,处理器将不接受来自中断控制器的IRQ。 • 为使能相应中断机制,CPSR的F位或I位必须被清0,同时中断屏蔽寄存器INTMSK的相应位也必须被清0。 • 允许某个中断必要条件:CPSR的I或F清0 6
中断请求寄存器INTPND • INTPND的各位指示了某个中断请求是否还未被处理。在INTPND中被置位的中断位称为pending位 • INTPND是一个只读寄存器,若清除pending位,需对中断服务寄存器I_ISPC(interrupt service pending clear)或F_ISPC的相应位写入1实现 • INTPND寄存器中的26个位对应着每一个中断源 • 当某个中断产生时,INTPND中的相应位就会置1 • 当处理结束后必须用软件清除该pending位 7
中断屏蔽寄存器INTMSK • 该寄存器的某位被置1,与该位对应的中断源被禁止 • 如果全局屏蔽位( INTMSK 第26位)被置1并且当任一中断发生时,中断请求位会置位,但是所有的中断都不会得到服务。 • 如果 • 某个中断在INTMSK寄存器中的对应位为1, • 这个中断发生它的pending位还是会置位,只是不会自动转入中断服务程序 8
中断控制器原理 I_ISPR/F_ISPR INTPND
发生中断 假设CPSR的I、F位置零。 Pending位置1(有请求) 全局屏蔽置1? Y 屏蔽服务 N INTMSK寄存器对应位为1 Y N 转入中断服务程序 10
中断源 在30个中断源中有26个中断源提供给中断控制器,4个外部中断(EINT4/5/6/7)请求是通过“或”的形式合成为1个中断源送至中断控制器,2个UART错误中断(UERRORO/1)也是如此。 EINT4, EINT5, EINT6和EINT7分享同一个中断请求源,中断服务程序ISR要通过读取EXTINTPND寄存器来区别这4个中断源,并在处理结束时通过将EXTINTPND中对应位写1来清除该位。 EXTINTPND寄存器既是状态寄存器,又是控制寄存器,用于指示请求状态和清除请求位。 11
中断优先级产生模块 S3C44BOX两种方式中断确定: (通过配置INTCON确定 ) • 非矢量中断模式:通过软件查询决定中断优先级,该方式在跳到相应服务程序之前需要一个较长的延迟时间; 非矢量中断模式下,ARM7TDMI内核收到来自中断控制器的IRQ中断请求,在0x00000018地址处执行一条指令,转IRQ中断服务程序。中断优先级由软件确定。 • 矢量中断模式:通过硬件决定中断优先级,此模式具有中断优先级产生模块。 中断矢量 12
矢量中断模式 26个中断源分别对应26个矢量地址0x20—0xc0,中断响应时直接转此地址执行 矢量中断模式下,当ARM7TDMI从Ox00000018地址处取指令时,中断控制器会在数据总线上加载分支指令,此分支指令转到此中断源的向量地址 在各个中断源对应的中断向量地址中,存放着跳转到相应中断服务程序的程序代码,由此可转中断服务程序去执行 13
举例 分支指令使跳转到0x60处执行 TIMER0中断信号 0X18 BhandlerTIMRE0 转中断服务程序执行。 0X60 handleTIMER0就是相应中断处理函数的地址 以TIMER0中断为例: 14
中断矢量地址表 分支指令机器代码为 0xea000000 + [(<destination address> -<vector address> - 0x8)>>2] 其中目标地址为中断服务线程ISR的开始地址,矢量地址为中断源在中断相量表中的地址,即分支指令所在地址,分支指令机器代码由硬件自动产生。 例:INT_TIMER1矢量地址为0x60,其中断服务线程HanderTIMER1的开始地址为0x10000,存放在0x60处的机器代码为: 0xea000000+((0x10000-0x60-0x8)〉〉2) = 0xea000000+0x3FE6 = 0xea003FE6 ;相对偏移量3FE6,B的操作码0xea B HanderTIMER1 ; 15
中断优先级产生模块组成 四个辅模块 一个主模块 确定4个主单元信号和2个中断源的优先级 一个辅模块确定6个中断源优先级,包括4个优先级次序可编程的中断源和2个固定优先级源 两个中断源 16
中断优先级 FIQ中断不被优先级模块处理, 且FIQ中断总是高于IRQ中断的优先级 MGKA和mGKB在所有中断源之中优先级是最低的,低于主单元优先级 主模块的mGA、 mGB、 mGC、 mGD的优先级的是可编程。 优先级高的主单元信号中的中断源优先级高于优先级低的主单元中的中断源 辅单元信号sGA,sGB,sGC和sGD的优先级的是可编程的,或者通过Round一Robin(轮转)方式来决定 17
每个中断源对应的矢量地址 中断源 矢量地址 中断源 矢量地址 EINT0 0x00000020 INT_TIMER1 0x00000064 EINT1 0x00000024 INT_TIMER2 0x00000068 EINT2 0x00000028 INT_TIMER3 0x0000006c EINT3 0x0000002c INT_TIMER4 0x00000070 EINT4/5/6/7 0x00000030 INT_TIMER5 0x00000074 TICK 0x00000034 INT_URXD0 0x00000080 INT_ZDMA0 0x00000040 INT_URXD1 0x00000084 INT_ZDMA1 0x00000044 INT_IIC 0x00000088 INT_BDMA0 0x00000048 INT_SIO 0x0000008c INT_BDMA1 0x0000004c INT_UTXD0 0x00000090 INT_WDT 0x00000050 INT_UTXD1 0x00000094 INT_UERR0/1 0x00000054 NT_RTC 0x000000a0 INT_TIMER0 0x00000060 INT_ADC 0x000000c0 18
控制中断的寄存器 1.中断控制寄存器: 对中断控制寄存器进行读取和设置来实现对中断的响应和控制。中断控制寄存器INTCON的地址为0x01E00000,可读写,初始值为0x07 2.中断请求寄存器INTPND INTPND寄存器的地址为0x01E00004,用来指示中断请求状态 19
控制中断的寄存器(续) • 3. 中断模式寄存器INTMOD • INTMOD中的26位分别对应着每个中断源 • 当INTMOD中的某个位设置为1,则ARM7TDM1内核将以FIQ(快速中断)模式操作那个中断;否则,将以IRQ(普通中断)模式操作 • 中断模式寄存器INTMOD的地址为0x01E00008,可读写 20
控制中断的寄存器(续) 4 中断屏蔽寄存器INTMSK 中断屏蔽寄存器INTMSK的地址为0x01E0000C,可读写,用以确定哪个中断源被屏蔽,屏蔽的中断源将不被服务。 21
控制中断的寄存器(续) • 5.IRQ矢量模式寄存器 • 主优先级产生单元通过I_PMST寄存器决定4个辅单元和2个中断源之间的优先级 • 2个中断源INT_RTC和INT_ADC在26个中断源中优先级是最低的. 22
控制中断的寄存器(续) • 6.IRQ/FIQ中断服务寄存器(I_ISPC/F_ISPC): • 1、中断挂起清零寄存器I_ISPC/F_ISPC:主要用来清除中断挂起位,即中断请求寄存器INTPND中的请求位。 • 只能在ISR中操作一次 • 2、中断服务寄存器I_ISPR/F_ISPR:表示了正在被响应的中断,如果几个中断请求同时发生,在I_ISPR寄存器中将其中具有最高优先级的中断源对应位置1。 23
控制中断的寄存器(续) • 7.外部中断控制寄存器EXTINT: • 外部中断控制寄存器EXTINT用来设置外部中断的触发模式。 • 8.外部中断请求寄存器EXTINTPND: • EINT4,EINT5,EINT6和EINT7分享同一个中断请求源 • 中断服务程序要通过读取EXTINTPND寄存器来区别这4个中断源 • 它们的中断处理程序(ISR)必须在处理结束时,通过将EXTINTPND中对应位写1来清除该位 • EXTINTPND既是状态又是控制寄存器。 24
外部中断的应用 1.I/O口设置 首先对PG口的工作模式进行设置,使得PG4-7工作在外部中断输入状态。选择EXTINT4~7 将PG口设置为功能3模式,采用语句:rPCONG = 11 11 11 11 xx xx xx xxB; 若使能上拉电阻,则语句为: rPUPG = 0000xxxxB 25
外部中断的应用(续) 2.外部中断触发模式设置 • 利用外部中断控制寄存器来设置外部中断的触发模式,建议采用下降沿或上升沿触发。 • 不同触发方式的语句如下: • ①采用下降沿触发时: rEXTINT=01x 01x 01x 01x xxx xxx xxx xxxB; • ②采用上升沿触发时: rEXTINT=10x 10x 10x 10x xxx xxx xxx xxxB; • ③采用边沿触发时: rEXTINT=11x 11x 11x 11x xxx xxx xxx xxxB; • ④采用低电平触发时: rEXTINT=000 000 000 000 xxx xxx xxx xxxB; 26
外部中断的应用(续) 非矢量中断模式,禁止FIQ中断,使能IRQ中断 3 中断寄存器设置 • 将EINT4-7设置为IRQ中断模式的语句为: rINTCON=0x5 • 采用以下语句开启中断: rINTMSK= ~(BIT_GLOBAL|BIT_EINT4567)。 #define BIT_EINT4567 (0x1<<21) #define BIT_EINT3 (0x1<<22) #define BIT_EINT2 (0x1<<23) #define BIT_EINT1 (0x1<<24) #define BIT_EINT0 (0x1<<25) #define BIT_GLOBAL (0x1<<26) 27
外部中断的应用(续) volatile char which_int=0; void Test_Eint(void) { rINTCON=0x5; // 禁能FIQ,使能IRQ pISR_EINT4567=(int)irq_Eint4567lsr; //修改中断处理函数指针 Uart_Printf("选择触发方式;\n“ ;在lcd显示 1 .下降沿触发\n" 2. 上升沿触发\n" 3. 边沿触发\n" 4.低电平触发\n"); rPCONG=11 11 11 11 xx xx xx xxB;//工作在外部中断功能状态 rPUPG 0000xxxxB; //内部上拉使能 4.主程序编写 28
外部中断的应用(续) switch (Uart_Getch()) { case ‘1’: rEXTINT=01x 01x 01x 01x xxx xxx xxx xxxB; //下降沿触发 break; case ‘2’: rEXTINT=10x 10x 10x 10x xxx xxx xxx xxxB;//上升沿触发 break; case ‘3’: rEXTINT=11x 11x 11x 11x xxx xxx xxx xxxB; //边沿触发 break; case ‘4’: rEXTINT=000 000 000 000 xxx xxx xxx xxxB; //低电平触发 break; default: return; } Uart_Printf ("请按中断键\n”); rINTMSK = ~(BIT_GLOBAL|BIT_EINT4567); //中断使能 while(!which_int); 29
外部中断的应用(续) switch (which_int) { case 1: Uart_Printf(“外部中断4发生了\n”); break; case 2: Uart_Printf(“外部中断5发生了\n”); break; case 4: Uart_Printf(“外部中断6发生了\n”); break; case 8: Uart_Printf(“外部中断7发生了\n”); break; default: break; } rINTMSK= BIT_GLOBAL; //禁止中断 which_int=0; rINTCON=0x5; } 30
外部中断的应用(续) void irq_Eint4567lsr(void) { which_int = rEXTINTPND; 读取外部中断请求寄存器,取得中断源对应整数 rEXTINTPND = Ox0f; //清除EXTINTPND寄存器 rl_lSPC= BIT_EINT4567; //清除INTPND对应位 p208 Delay(1000);//延时1s } 5 中断处理程序 31
中断模式寄存器INTMOD: p213 INTMOD中的26位分别对应着每个中断源,当INTMOD中的某个位设置为1,则ARM7TDM1内核将以FIQ(快速中断)模式操作那个中断;否则,将以IRQ(普通中断)模式操作。中断模式寄存器INTMOD的地址为0x01E00008,可读写。
中断请求寄存器INTPND: p205 INTPND寄存器的地址为0x01E00004,用来指示中断请求状态。(各中断源的含义参见表5-34)
中断屏蔽寄存器INTMSK: p214 中断屏蔽寄存器INTMSK的地址为0x01E0000C,可读写,用以确定哪个中断源被屏蔽,屏蔽的中断源将不被服务。
在30个中断源中有26个中断源提供给中断控制器,4个外部中断(EINT4/5/6/7)请求是通过“或”的形式合成为1个中断源送至中断控制器,2个UART错误中断(UERRORO/1)也是如此。( UART-通用异步收发器) 每个中断源分别 属于一个主单元 信号和辅单元信号,主和辅单元信号可设置优先级.
注意:EINT4, EINT5, EINT6和EINT7分享同一个中断请求源,中断服务程序ISR要通过读取EXTINTPND3-0寄存器来区别这4个中断源,并在处理结束时通过将EXTINTPND3-0中对应位写1来清除该位。
中断源 矢量地址 中断源 矢量地址 EINT0 0x00000020 INT_TIMER1 0x00000064 EINT1 0x00000024 INT_TIMER2 0x00000068 EINT2 0x00000028 INT_TIMER3 0x0000006c EINT3 0x0000002c INT_TIMER4 0x00000070 EINT4/5/6/7 0x00000030 INT_TIMER5 0x00000074 TICK 0x00000034 INT_URXD0 0x00000080 INT_ZDMA0 0x00000040 INT_URXD1 0x00000084 INT_ZDMA1 0x00000044 INT_IIC 0x00000088 INT_BDMA0 0x00000048 INT_SIO 0x0000008c INT_BDMA1 0x0000004c INT_UTXD0 0x00000090 INT_WDT 0x00000050 INT_UTXD1 0x00000094 INT_UERR0/1 0x00000054 NT_RTC 0x000000a0 INT_TIMER0 0x00000060 INT_ADC 0x000000c0 矢量中断模式中断源对应的矢量地址(p211 表5-35,每个矢量地址对应存储单元,存放转至相应服务程序的指令。 )
INTCON 位 描述 初始状态 保留 3 0 0 V 2 禁止/使能IRQ中断的“矢量中断模式” 0:矢量中断模式 1:非矢量中断模式 1 I 1 禁止/使能CPU响应IRQ中断请求 0:IRQ中断使能 1:IRQ中断禁止 1 F 0 禁止/使能CPU响应FIQ中断请求 0:FIQ中断使能 1:FIQ中断禁止 1 控制中断的寄存器 P212 1.中断控制寄存器: 在实际编程中,对中断控制寄存器进行读取和设置来实现对中断的响应和控制。中断控制寄存器INTCON的地址为0x01E00000,可读写,初始值为0x07。
辅单元优先级设置 sGA-sGD,sGKA,sGKB 主单元优先级设置 mGA-mGD,mGKA,mGKB 辅单元优先级状态 主单元优先级状态
寄存器 地址 R/W 描述 复位值 F_ISPR 0x01E00038 R 未经中断处理的FIQ中断寄存器(只有1位置位,最高优先级) 0x00000000 F_ISPC 0x01E0003C W FIQ中断服务清除寄存器(一旦被置位,INTPND中的相应位被清0) 未定义 表5-40
EXTINT 位 描述 EINT7 [30:28] 设置EINT7触发模式 000:低电平中断 001:高电平中断 01X:下降沿触发 10X:上升沿触发 11X边沿触发 EINT6 [26:24] 设置EINT6触发模式 000:低电平中断 001:高电平中断 01X:下降沿触发 10X:上升沿触发 11X边沿触发 EINT5 [22:20] 设置EINT5触发模式 000:低电平中断 001:高电平中断 01X:下降沿触发 10X:上升沿触发 11X边沿触发 EINT4 [18:16] 设置EINT4触发模式 000:低电平中断 001:高电平中断 01X:下降沿触发 10X:上升沿触发 11X边沿触发 EINT3 [14:12] 设置EINT3触发模式 000:低电平中断 001:高电平中断 01X:下降沿触发 10X:上升沿触发 11X边沿触发 EINT2 [10:8] 设置EINT2触发模式 000:低电平中断 001:高电平中断 01X:下降沿触发 10X:上升沿触发 11X边沿触发 EINT1 [6:4] 设置EINT1触发模式 000:低电平中断 001:高电平中断 01X:下降沿触发 10X:上升沿触发 11X边沿触发 EINT0 [2:0] 设置EINT0触发模式 000:低电平中断 001:高电平中断 01X:下降沿触发 10X:上升沿触发 11X边沿触发 7.外部中断控制寄存器EXTINT: 外部中断控制寄存器EXTINT用来设置外部中断的触发模式。
EXTINTPND 位 描述 EXTINTPNDO 0 如果中断发生在EINT4上,该位置1,同时INTPND21也置1 EXTINTPND1 1 如果中断发生在EINT5上,该位置1,同时INTPND21也置1 EXTINTPND2 2 如果中断发生在EINT6上,该位置1,同时INTPND21也置1 EXTINTPND3 3 如果中断发生在EINT7上,该位置1,同时INTPND21也置1 8.外部中断请求寄存器EXTINTPND: EINT4,EINT5,EINT6和EINT7分享同一个向量,因此,中断服务程序要通过读取EXTINTPND寄存器来区别这4个中断源。它们的中断处理程序(ISR)必须在处理结束时,通过将EXTINTPND中对应位写1来清除该位。
作业(下周上课前交) 1. 课本p225页第七题 2. 使用中断控制课本p144-p148页所描述的4*4的键盘(假设其使用F端口不变)。具体要求: a. 使用G端口的PG0引脚的EINT0功能实现中断式的键盘控制功能。即当任意一个键被按下时触发EINT0。 b. 当EINT0被触发时,调用p147页的函数实现读取键的功能。 c. 每次读取键后需将EINT0相关的寄存器复位 画出电路图(包括键盘,PF端口,PG0端口和其他需要的附加电路),并写出中断初始化及控制程序。
内容提要 键盘接口 LED显示器 LCD显示器与触摸屏接口(了解) 通讯与中断接口 A/D和D/A转换器接口 ARM的JTAG接口 50