ATMAGE64外部中断例程
ARM处理器中断处理的理解

ARM处理器中断处理的理解在发生外部中断时的处理过程如下图所示:在发生外部中断时ARM程序跳转到b HandlerIRQ;handler for IRQ interrupt根据如下语句LTORGHandlerFIQ HANDLER HandleFIQHandlerIRQ HANDLER HandleIRQHandlerUndef HANDLER HandleUndef就会调用如下HANDLER宏:HandlerIRQ HANDLER HandleIRQ ;发生外部中断时调用这个宏,跳转到IsrIRQHANDLER宏如下:MACRO$HandlerLabel HANDLER $HandleLabel;在一个标号前使用$表示程序被汇编时将使用相应的值来代替$后的标号$HandlerLabel ;可以将其想像成函数名,但这个函数名可以被不同名称(HandlerIRQ,HandlerFIQ)替代sub sp,sp,#4 ;decrement sp(to store jump address)stmfd sp!,{r0} ;PUSH the work register to stack(lr does't push because it return to original address) ldr r0,=$HandleLabel ;可以当成函数参数, HandleIRQ所指向的地址內裝的是IsrIRQ的入口地址;所以下面的語句实际上是load IsrIRQ的入口地址到r0ldr r0,[r0] ;load the contents(service routine start address IsrIRQ的入口地址) of HandleXXX to r0 str r0,[sp,#4] ;store the contents(ISR) of HandleXXX to stack, r0也就是IsrIRQ的入口地址to SPldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR) IsrIRQ的入口地址to PCMEND具体使用时用HandlerIRQ代替上面宏內的HandleLabel:HandlerIRQsub sp,sp,#4 ;decrement sp(to store jump address) ; 先假设sp=0x1014, sp-4=0x1010stmfd sp!,{r0} ;PUSH the work register to stack(lr does't push because it return to original address);sp=sp-4=0x100C,r0->sp[0x100C],ldr r0,= HandleIRQ ;load the address of HandleIRQ to r0, HandleIRQ所指向的地址內裝的是IsrIRQ的入口地址 ;所以下面的語句实际上是加载IsrIRQ的入口地址到r0ldr r0,[r0] ;load the contents(service routine start address 即IsrIRQ的入口地址) of HandleIRQ to r0 str r0,[sp,#4] ;store the contents(ISR) of HandleIRQ to stack, r0也就是IsrIRQ的入口地址to SP;r0->sp[0x100C]+4(=0x1010),but sp=0x100C不变ldmfd sp!,{r0,pc} ;POP the work register and pc(jump to ISR) IsrIRQ的入口地址to PC;sp[0x100C]->r0,sp=sp+4,sp[0x1010]->pc,sp=sp+4=0x1014,这样就实现了pc指向中断处理程序函数入口下面两张图片指示了这个过程SP内容的变化:因为程序启动时已执行如下代码將用来解析具体中断函数入口的子函数IsrIRQ地址写入HandleIRQ地址; Setup IRQ handler;初始化时將IsrIRQ地址写入HandleIRQ地址ldr r0,=HandleIRQ;This routine is neededldr r1,=IsrIRQ ;取IsrIRQ的绝对地址'str r1,[r0] ;将IsrIRQ的绝对地址写入HandleIRQ地址内则执行完HandlerIRQ宏后,程序跳转到IsrIRQ。
atmege16外部中断程序

atmege16外部中断程序/****************************************** 功能:演示ATMEGA16的3个外部中断程序编辑环境:ICCAVR******************************************/#include<iom16v.h>#include<macros.h>#define uint unsigned int#define uchar unsigned char#define beep_0 (PORTD&=~(1<<PD7)) #define beep_1 (PORTD|=(1<<PD7))//蜂鸣器响uint count;/******************************************* 三个外部中断声明,注意中断向量号*******************************/#pragma interrupt_handler Exint0:2#pragma interrupt_handler Exint1:3#pragma interrupt_handler Exint2:19/*************************************系统延时函数************************************/void delay(uint ms){uint i,j;for(i=0;i<ms;i++){for(j=0;j<1140;j++);}}/**************************************端口初始化每个外部中断端口是固定的****************************************/void port_init(){DDRA=0XFF;PORTA=0XFF;DDRB&=(0<<PB2);//INT2PORTB|=(1<<PB2);DDRD&=(0<<PD2);//INT0PORTD|=(1<<PD2);DDRD&=(0<<PD3);//INT1PORTD|=(1<<PD3);}/***********************************外部中断初始化*******************************/void INT_init(){SREG=0X80;//打开全局中断GICR|=(1<<INT0)|(1<<INT1)|(1<<INT2);//三个中断使能MCUCR=(1<<ISC11)|(0<<ISC10)|(1<<ISC01)|(0<<ISC00);//I NT0,INT1下降沿触发MCUCSR=(0<<ISC2);//INT2下降沿触发中断}/***************************************** 流水灯函数****************************************/ void LED_1(){uchar i;for(i=0;i<8;i++){PORTA=~BIT(i);delay(200);}}/*********************************** LED_2函数**********************************/void LED_2(){PORTA=0X0F;delay(500);PORTA=0XF0;delay(500);}/********************************LED_3函数************************************/ void LED_3(){PORTA=0X81;delay(500);PORTA=0X7E;delay(500);}/************************************ 外中断0函数**********************************/ void Exint0(){LED_2();}/********************************** 外中断1函数***********************************/ void Exint1(){LED_3();}/************************外中断2函数***********************/void Exint2(){DDRD=(1<<PD7);for(count=0;count<4;count++) {beep_0;delay(200);beep_1;delay(200);}}/********************************* 主函数*********************************/ void main(){port_init();//端口初始化INT_init();//中断初始化while(1)// 当非0值时执行下面函数{LED_1();//流水灯函数}}。
ARMLinux中断源码分析2中断处理流程

ARM Linux中断源码分析(2)——中断处理流程ARM支持7类异常中断,所以中断向量表设8个条目,每个条目4字回顾第一节所讲的内容,当一个异常或中断发生时,处理器会将PC设置为特定地址,从而跳转到已经初始化好的异常向量表。
因此,要理清中断处理流程,先从异常向量表开始。
对于ARM Linux而言,异常向量表和异常处理程序都存在arch/arm/kernel/entry_armv.S汇编文件中。
vector异常向量表点击(此处)折叠或打开1..globl __vectors_start2.__vectors_start:3.swi SYS_ERROR04. b vector_und + stubs_offset5.ldr pc, .LCvswi + stubs_offset6. b vector_pabt + stubs_offset7. b vector_dabt + stubs_offset8. b vector_addrexcptn + stubs_offset9. b vector_irq + stubs_offset @中断入口,vector_irq10. b vector_fiq + stubs_offset11.12..globl __vectors_end13.__vectors_end:vector_irq+stubs_offset为中断的入口点,此处之所以要加上stubs_offset,是为了实现位置无关编程。
首先分析一下stubs_offset(宏)是如何计算的:.equ stubs_offset, __vectors_start + 0x200 - __stubs_start 在第3节中已经提到,内核启动时会将异常向量表拷贝到0xFFFF_0000,将异常向量处理程序的 stub 拷贝到 0xFFFF_0200。
图5-1描述了异常向量表和异常处理程序搬移前后的内存布局。
图5-1 异常向量表和异常处理程序搬移前后对比当汇编器看到B指令后会把要跳转的标签转化为相对于当前PC 的偏移量(±32M)写入指令码。
外部中断实现按键识别实验

外部中断实现按键识别实验二、预备知识外部中断建立过程启动代码文件startup_stm32f10x yy. s用户应用主程序文件main. C中断服务程序文件stm32f10x it.cSTM32F10x的NVIC相关库函数:{uint8_t NVIC_IRQChannel;uint8_t NVIC_IRQChannelPreemptionPriority;uint8_t NVIC_IRQChannelSubPriority;FunctionalState NVIC_IRQChannelCmd;} NVIC_InitTypeDef;参数NVIC_IRQChannel用以使能或失能指定的IRQ通道。
WWDG_IRQn窗口看门狗中断PVD_IRQn PVD通过EXTI探测中断TAMPER_ IRQn篡改中断RTC_ IRQn RTC全局中断Flashltf_IRQn FLASH全局中断RCC_IRQn RCC全局中断EXTI0_IRQn外部中断线0中断EXTI1_IRQn外部中断线1中断EXTI2_IRQn外部中断线2中断EXTI3_IRQn外部中断线3中断EXTI4_IRQn外部中断线4中断DMAChannel1_IRQn DMA通道1中断DMAChannel2_IRQn DMA通道2中断DMAChannel3_IRQn DMA通道3中断DMAChannel4_IRQn DMA通道4中断DMAChannel5_IRQn DMA通道5中断DMAChannel6_IRQn DMA通道6中断DMAChannel7_IRQn DMA通道7中断ADC_IRQn ADC全局中断USB_HP_CANTX_IRQn USB高优先级或者CAN发送中断USB_LP_CAN_RX0_IRQn USB低优先级或者CAN接收0中断CAN_RXI_IRQn CAN接收1中断CAN_SCE_IRQn CAN SCE中断EXTI9_5_IRQn外部中断线9~5中断TIM1_BRK_IRQn TIM1暂停中断TIM1_UP_IRQn TIM1刷新中断TIM1_TRG_COM_IRQn TIM1触发和通信中断TIM1_CC_IRQn TIM1捕获比较中断TIM2_IRQn TIM2全局中断TIM3_IRQn TIM3全局中断TIM4_IRQn TIM4全局中断I2C1_EV_IRQn I2C1事件中断I2C1_ER_IRQn I2C1错误中断I2C2_EV_IRQn I2C2事件中断I2C2_ER_IRQn I2C2错误中断SPI1_IRQn SPI1全局中断SPI2_IRQn SPI2全局中断USART1_IRQn USART1全局中断USART2_IRQn USART2全局中断USART3_IRQn USART3全局中断EXTI15_10_IRQn外部中断线15~10中断RTCAlarm_IRQn RTC闹钟通过EXTI线中断USBWakeup_IRQn USB通过EXTI线从悬挂唤醒中断typedef struct{uint32_t EXTI_Line;EXTIMode_TypeDef EXTI_Mode; EXTITrigger_TypeDef EXTI_Trigger; FunctionalState EXTI_LineCmd;}EXTI_InitTypeDef;功能描述:程序运行后背光灯亮,按下左键背光灯灭,按下右键背光灯亮,按键是通过外部中断实现的。
第4章 ATmega 单片机的中断系统及定时器

ATmega的中断系统及定时器 第4章 ATmega的中断系统及定时器
广西大学电气工程学院 海涛
• 中断源基本上分为两种类型的中断 : 一类是时间 中断源基本上分为两种类型的中断: 触发型中断,另一类是条件中断, 触发型中断 , 另一类是条件中断 , 对于时间触发 类中断(如时钟、计数、比较等) 类中断 ( 如时钟 、 计数 、 比较等 ) , 一旦事件产 生后会将相应的中断标志位置位,申请中断处理, 生后会将相应的中断标志位置位 , 申请中断处理 , 响应中断, 当MCU响应中断,跳转到实际中断向量,开启相 响应中断 跳转到实际中断向量, 应的中断处理程序时, 应的中断处理程序时 , 硬件自动清除对应的中断 标志,这些中断标志位也可通过软件写“ 来清 标志 , 这些中断标志位也可通过软件写 “ 1”来清 除。 • 当一个符合条件的中断触发置位了中断标志位 , 当一个符合条件的中断触发置位了中断标志位, 但相应的中断允许位为“0”,此时,这个中断标 但相应的中断允许位为“ , 此时, 志将挂起为“ , 志将挂起为 “ 1”,一直保持到该中断被响应或中 断标志被软件清为“ 。 断标志被软件清为“0”。
ATmega的中断系统及定时器 第4章 ATmega的中断系统及定时器
广西大学电气工程学院 海涛
• (2) 设置中断屏蔽触发器 • 在实际系统中,往往有多个中断源 。 为了增加控 在实际系统中 , 往往有多个中断源。 制的灵活性, 制的灵活性 , 在每一个外设的接口电路中增加了 一个中断屏蔽触发器,只有当此触发器为“ 时 一个中断屏蔽触发器 , 只有当此触发器为 “ 1”时, 外设的中断请求才能被送出至CPU。可把 个外设 外设的中断请求才能被送出至 。可把8个外设 的中断屏蔽触发器组成一个端口,用输出指令来 的中断屏蔽触发器组成一个端口, 控制它们的状态。 控制它们的状态。
ARM的七种异常类型

ARM7支持六种操作模式:(1)用户模式(usr):正常的程序执行状态(2)FIQ模式(fiq):支持数据传送或通道处理(3)IRQ模式(irq):用于通用的中断处理(4)管理模式(svc):用于操作系统的保护模式(5)异常模式(abt):数据或者指令预取异常时进入(6)无定义模式(und):当无定义指令被执行时进入(7)软件控制,外部中断,异常处理都可以改变操作模式。
大部分的应用程序在用户模式下执行。
其他模式,比如管理模式,在中断、异常服务、或者访问被保护资源时进入。
ARM 的中央寄存器集是16 个用户寄存器R0 – R15。
这些寄存器均是32 位宽度,R0 – R12 没有其他特殊功能,寄存器R13 – R15在CPU中有特殊功能。
R13被用作栈指针(stack pointer,SP)。
R14被称为链接寄存器(link register, LR),当调用一个函数时返回地址被自动保存到链接寄存器,在函数返回时有效。
这使得快速进入和返回“叶”函数(不调用其他函数的函数)成为可能。
如果函数是分支的一部分(即该函数将调用另一个函数),链接寄存器必须入栈(R13)。
R15 是程序计数器(program counter, PC)。
有趣的是,许多指令也可以在R13 – R15中执行,就像它们是标准的用户寄存器。
ARM中断的问题ARM的七种异常类型---------1> 复位异常2> 数据访问中止异常3> 快速中断请求异常4> 一般中断请求5> 预取指令异常6> 软件中断异常7> 未定义异常-------------------------问题:1> 为什么除了进入复位异常模式外,在别的异常处理模式中都允许FIQ中断?2> 数据访问中止异常的优先级大于 FIQ异常,为什么在数据访问异常处理模式中,还允许 FIQ中断?这样不就成了:在高优先级异常处理中允许低优先级的中断发生?即使这样,因为FIQ中断的优先级 < 数据异常中断优先级,也不会进入 FIQ中断处理程序啊,这样不就更没有用处了??ARM体系的各种异常的分析(学习日记)- [ARM7TDMI]版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明/logs/10669519.html1.复位异常(1)当内核的nRESET信号被拉低时,ARM处理器放弃正在执行的指令,当nRESET信号再次变高时,ARM处理器进行复位操作;(2)系统复位后,进入管理模式对系统进行初始化,复位后,只有PC(0x00000000)和CPSR (nzcvqIFt_SVC)的值是固定的,另外寄存器的值是随机的。
基于单片机的公交车报站系统设计_毕业设计论文

湖南人文科技学院本科生毕业设计题目:基于单片机的公交车报站系统设计系部:通信与控制工程系专业年级:自动化2009级指导教师:职称:助教湖南人文科技学院教务处制湖南人文科技学院本科毕业设计诚信声明本人郑重声明:所呈交的本科毕业设计,是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议,除文中已经注明引用的内容外,本设计不含任何其他个人或集体已经发表或撰写过的作品成果。
对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。
本人完全意识到本声明的法律结果由本人承担。
作者签名:二○ 年月日湖南人文科技学院毕业设计基于单片机的公交车报站系统设计摘要:随着我国经济的快速发展和城市化进程的加快,城市人口日益增多,机动车数量急剧上升,城市交通压力越来越大,发展公共交通事业势在必行,是解决我国交通问题的重要措施。
公交车报站系统是公共交通系统的一个重要的组成部分,设计先进的报站系统是公共交通事业的一个重要的组成部分,能为广大居民乘车提供优质的服务,提高公交系统的服务水平。
本设计是以ATMAGE16位单片机为主控芯片,结合按键控制模块、I/O模块为一体的公交语音报站系统。
在这个设计中,采用了ISD4004语音芯片,通过单片机的I/O口连接ISD4004并且控制此芯片。
此设计采用射频识别技术实现对站台的检测,可以实现自动报站和按键报站,报站系统实现了播报语音高质量话、下载语音便捷化和报站自动化。
通过验证此系统可以极大的提高报站效率,减轻司机的工作压力,给安全行车提供了保证。
为城市公交事业的发展做出了突出的贡献。
关键词:ATMAGE16; ISD4004; 射频识别技术湖南人文科技学院毕业设计Bus Stop Announcement System Based on Single Chip Design Abstract: With the rapid development of our economy and the speeding up of urbanization, urban population increased, motor vehicle number has risen sharply, the urban traffic pressure is more and more big, the development of public transport enterprise is imperative, is an important measure to solve the traffic problems in our country. Bus stops system is the public transport system is an important part of the advanced design of the stops system is an important part of public transportation, for the majority of residents to provide quality services, improve the service level of public transport system. This design is based on ATMAGE16 bits single chip microcomputer as main control chip, combining with key control module, I/O module for the integration of voice bus stops system. ISD4004 voice chip was adopted in this design, through the MCU I/O mouth connection this chip ISD4004 and control. This design USES the rfid technology to realize detection of platform, can realize automatic stops stops and buttons, stops system realized the high quality broadcast voice message, download speech facilitation and stops are automated. By verifying this system can greatly improve the efficiency of the stops, reduce the driver's working pressure, provides guarantee for safe driving. For the development of city bus has made the prominent contribution.Key words:ATMAGE16;ISD4004;Radio Frequency Identification Technology湖南人文科技学院毕业设计目录第1章绪论 (1)1.1 选题的依据和课题的意义 (1)1.2 国内外研究现状 (1)1.2.1国内研究现状 (1)1.2.2国外研究现状 (2)1.3设计研究内容 ................................................................ 错误!未定义书签。
AVR单片机外部中断0、1、2详解

AVR单片机外部中断0、1、2 详解中断基本包含:1.中断源2.中断向量(中断入口地址)3.中断优先级4.中断函数除此之外,在单片机中,中断的执行或者中断的触发必须符合以下的规则:中断触发|执行= 全局中断使能位AND 中断源使能位AND 中断源标志位单片机内部中断的触发必须完成,全局中断使能,中断源使能,中断源标志位置一等条件。
除此之外,如果是外部中断0,1,2(INT0,1,2),必须设置引脚触发的规则。
最后呢,就是需要在程序里建立处理中断的中断函数。
在编程的时候的步骤大致如下:(无视INT2)1. 初始化PD2,PD3 为输入状态。
DDRD|=BIT(2)|BIT(3);2. 设置INT0,1 引脚触发的规则,实验中为低电平触发。
MCUCR=0xF0;3. 设置INT0,1 中断源使能位为逻辑1。
GICR|BIT(7)|BIT(6);4. 清除INT0,1 的中断标志位(软件写入,逻辑1 为清除)。
GIFR|=BIT(7);BIT(6);5. 全局中断允许位使能。
SREG|=BIT(7);6. 编辑中断处理函数。
/*ATmega16提供3个外部中断,分别由INT0、INT1和INT2引脚触发。
需要注意的是,如果将ATmega16设置为允许外部中断,则即使把INT0、INT1和INT2引脚设置为输出方式,外部中断仍然会被触发。
外部中断可选择采用上升沿触发、下降沿触发和低电平触发(INT2中断只能采用沿触发方式。
*/#include;#include;#include "smg.h"/*1.状态寄存器SREGbit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0I T H S V N Z CI:全局中断使能位。
在I置位后,单独的中断使能由不同的中断寄存器控制。
若I为0,则禁止中断。
MCU 控制寄存器- MCUCR MCU 控制寄存器包含中断触发控制位与通用 MCU 功能Bit 7 6 5 4 3 2 1 0SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00外部中断 1 由引脚 INT1 激发,如果 SREG 寄存器的 I 标志位和相应的中断屏蔽位置位的话。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ATMAGE64外部中断实例讲解
【实例】PA 端口上连接了8 个LED 灯,PD0-3 接了一组按键到地,分别对应为K7,K6,K5,K4。
要求:按下K1,K2时,灯有变化做为中断响应。
1、配置管脚。
外部中断0-3(INT0-INT3)对应IO脚的PD0-PD3;如图:
将该管脚配置为输出,设置使能上拉电阻;
2、配置触发条件。
外部中断控制寄存器A(EICRA)和B(EICRB),寄存器A配置
外部中断0-3,寄存器B配置外部中断4-7;
EICRA
因此在此例程中设置为:
3、打开外部中断使能。
通过设置(EIMSK)外部中断屏蔽寄存器来打开外部中断
使能。
例程代码
4、开全局中断。
通过AVR状态寄存器SREG打开全局中断。
例程代码
5、中断服务函数。