ATMAGE64外部中断例程
- 格式:docx
- 大小:262.74 KB
- 文档页数:3
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外部中断程序/****************************************** 功能:演示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();//流水灯函数}}。
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;功能描述:程序运行后背光灯亮,按下左键背光灯灭,按下右键背光灯亮,按键是通过外部中断实现的。
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 详解中断基本包含: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 标志位和相应的中断屏蔽位置位的话。
ARM处理器中断处理的编程实现中断是指外部事件打断正在执行的程序,并暂时转去执行与该事件有关的处理程序。
在ARM处理器上,中断处理是通过中断向量表和中断服务程序来实现的。
下面是ARM处理器中断处理的编程实现的主要内容。
1.中断向量表的设置在ARM处理器中,中断向量表是一个保存中断服务程序地址的表。
每个中断号对应一个中断服务程序的地址,当发生中断时,处理器会跳转到相应中断号对应的中断服务程序。
中断向量表必须存储在内存中,并且要先设置好才能使得中断处理正常工作。
为了设置中断向量表,需要将每个中断号对应的中断服务程序的地址写入到相应的中断向量表项中。
具体的实现方式根据不同的ARM架构有所不同。
以ARM Cortex-M系列处理器为例,中断向量表的每个向量表项占用4个字节,存储中断服务程序的地址。
下面是使用C语言设置中断向量表的示例代码:```c//声明中断向量表typedef void (*interrupt_handler_t)(void);//中断服务程序声明void interrupt_handler1(void);void interrupt_handler2(void);...//中断向量表__attribute__ ((section(".isr_vector")))const interrupt_handler_t interrupt_vector_table[] =interrupt_handler1, // 中断号0对应的中断服务程序interrupt_handler2, // 中断号1对应的中断服务程序...```2.中断服务程序的编写中断服务程序负责处理中断的具体逻辑。
当中断发生时,处理器会跳转到对应中断号的中断服务程序进行处理。
中断服务程序必须具有固定的格式和规范,以确保在中断发生时能正常执行。
中断服务程序的编写一般包括以下几个步骤:-保存寄存器状态:由于中断服务程序会暂时打断正在执行的程序,需要在进入中断服务程序时保存当前的寄存器状态,以便中断处理完成后能够正确恢复现场。
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、中断服务函数。