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 标志位和相应的中断屏蔽位置位的话。
ARM处理器中断处理的编程实现
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.中断服务程序的编写中断服务程序负责处理中断的具体逻辑。
当中断发生时,处理器会跳转到对应中断号的中断服务程序进行处理。
中断服务程序必须具有固定的格式和规范,以确保在中断发生时能正常执行。
中断服务程序的编写一般包括以下几个步骤:-保存寄存器状态:由于中断服务程序会暂时打断正在执行的程序,需要在进入中断服务程序时保存当前的寄存器状态,以便中断处理完成后能够正确恢复现场。
Atmega16中断(dhl)获奖课件
知识回忆与新课引入
C语言旳控制流? 单片机开发程序旳一般构造和程序执行 顺序? C语言中函数旳定义和调用规则? 当我们在做某事时,电话或门铃响了, 我们会怎样处理和回应?
外部中断及应用
中断原理 ATmage16旳外部中断 外部中断应用
中断原理
单片机中断旳概念 中断旳功能 中断源 中断旳检测与中断旳响应条件 CPU对中断旳响应 ATmega16旳中断系统
if((GIFR&0x40)!=0) PORTB=0x3f,GIFR=0x40;}
中断法和查询法旳特点及差别:
中断法特点: ▲ 需要开放中断旳“总开关”和“分开关”; ▲ 中断响应速度快; ▲ 需要定义中断服务程序才干进行有关处理。 ▲ 不需要软件清中断标志位
查询法特点:
▲ 不需要开放中断旳“总开关”和“分开关”; ▲ 标志位检测不及时,因而响应速度慢; ▲ 不需要定义中断服务程序也能进行有关处理。 ▲ 需要软件清中断标志位(写“1”清零)
中断旳概念
CPU在处理某一事件A时,发生了另一事 件B祈求CPU迅速去处理(中断发生);
CPU临时中断目前旳工作,转去处理事件 B(中断响应和中断服务);
待CPU将事件B处理完毕后,再回到原来事 件A被中断旳地方继续处理事件A(中断返 回),这一过程称为中断 。
AVR单片机旳中断系统构造
主程序
中断响应
人们想对运营旳计算机进行干预,必须先经过键盘发出中断祈求, 在取得了机器准许后,方可进行。中断技术使得人们能够随时进行 人机联络,而不用先停机处理,然后再重新开机。
中断源
● 外部中断 AT90LS8535单片机旳外部中断祈求由外设发出。 外设可经过在PD2、PD3上施加低电平、下降沿脉冲或上升沿脉冲触发 该中断。 ● 定时/计时器中断 定时/计时器中断发生在单片机内部旳3个定时/计时器上,当某个定时/ 计时器旳计数值溢出、输出比较器匹配或输入捕获事件发生,且相应 旳控制寄存器被设置为中断允许时,单片机响应中断。 ● 串行口中断 串行口中断是为串行数据旳发送或接受设置旳。每当串行口发送或接 受完一种串行数据帧时,其相应旳状态位被置位。假如此时该类型旳 中断为允许,则单片机响应该中断。
atmege16外部中断程序
atmege16外部中断程序/****************************************** 功能:演示ATMEGA16的3个外部中断程序编辑环境:ICCAVR******************************************/#include;#include;#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) ;//INT0,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();//流水灯函数}}。
ATEMAGE16中断初值计算方法
AVR 定时器中断初值计算方法使用芯片 AT Mega16 外部晶振 4.00MHz定时器1 (16位定时器)寄存器TCCR1B = 0x04 设定256预分频要利用定时器定时1秒1,4000000 / 256 = 15625 说明定时器每当1/15625 秒就会触发一次中断2,65535 - 15625 = 49910 计算出要累加多少次才能在1秒后出发定时器1的溢出中断3,49910 <==> C2 F6 将计算后的值换算成16进制4,TCNT1H = 0xC2 ; 对寄存器赋值TCNT1L = 0xF6 ;=================================================例如用16位定时器TIMER1,4MHZ晶振,256分频,100ms定时,如何求得初值赋给TCNT1?65536-(4M/256)*0.1=63973.5其中,4M是晶体频率,0.1是定时时长单位秒。
对于8位的定时器T=(2^8-计数初值)*晶振周期*分频数=(2^8-计数初值)/晶振频率*分频数计数初值=2^8-T/晶振周期/分频数=2^8-T*晶振频率/分频数因为AVR一指令一周期IAR For AVR 精确延时C语言中,想使用精确的延时程序并不容易。
IAR 中有这样的一个函数__delay_cycles(),该函数在头文件intrinsics.h中定义,函数的作用就是延时N个指令周期。
根据这个函数就可以实现精确的延时函数了(但不能做到100%精确度)。
实现的方法:建立一个delay.h的头文件:#ifndef __IAR_DELAY_H#define __IAR_DELAY_H#include <intrinsics.h>#define XTAL 8 //可定义为你所用的晶振频率(单位Mhz)#define delay_us(x) __delay_cycles ( (unsigned long)(x * XTAL) ) #define delay_ms(x) __delay_cycles ( (unsigned long)(x * XTAL*1 000) )#define delay_s(x) __delay_cycles ( (unsigned long)(x * XTAL*100 0000) )#endif注意: __delay_cycles(x),x必须是常量或则是常量表达式,如果是变量则编译报错!关于溢出中断不管是哪个单片机都是不断累加,使其寄存器溢出触发中断,然后跳转到中断函数处执行中断服务程序。
DM642外部中断的实现总结
DM642外部中断的实现总结-)在含有操作系统DSP/BIOS的程序中实现外部中断比较简单,只需要进行如下操作:(1) 在源程序文件中,假设为main.c,在其中添加一个中断处理函数,若要使用外部中断4,可添加函数,这里不需要在前面加入interrupt关键字void int_isp4(){//添加中断处理代码}(2)打开DSP/BIOS配置文件xxx.cdb,选择“Scheduling”下的“HWI - Hardware Interrupt Service Routine Manager”项,即HWI模块,它管理着DSP/BIOS中的硬件中断向量表,提供基本的中断控制函数(如图1所示),列出了DM642的所有中断向量表,其中HWI_INT4, HWI_INT5, HWI_INT6, HWI_INT7是外部中断,这里选择HWI_INT4,在其选项上点击右键,选择”Propert i es”,弹出如图2所示:图1图2在function中输入在程序文件中定义的中断处理函数,如第一步所定义的int_isp4,注意在这里记得在其函数名前面加上下划线。
由此即可完成对外部中断的配置。
(二)在非DSP/BIOS中使用CSL API进行设置相对来说比较复杂一些,主要进行如下操作:(1)定义描述DM642中断的向量表文件,这里使用TI公司提供的一个中断向量表文件模板:ves_dm642.asm,内容如下:* Copyright (C) 2003 Texas Instruments Incorporated* All Rights Reserved*---------vecs_edma1.asm---------* Assembly file to set up interrupt service table (IST)*------------------------------------------------------------------------------* Global symbols defined here and exported out of this file*------------------------------------------------------------------------------.global _vectors.global _c_int00.global _vector1.global _vector2.global _vector3.global _ int_isp4.global _vector5.global _vector6.global _vector7.global _ vector8.global _vector9.global _vector10.global _vector11.global _vector12.global _vector13.global _vector14.global _vector15*------------------------------------------------------------------------------* Global symbols referenced in this file but defined somewhere else.* Remember that your interrupt service routines need to be referenced here.*------------------------------------------------------------------------------.ref _c_int00*------------------------------------------------------------------------------* This is a macro that instantiates one entry in the interrupt service table.*------------------------------------------------------------------------------VEC_ENTRY .macro addrSTW B0,*--B15MVKL addr,B0MVKH addr,B0B B0LDW *B15++,B0NOP 2NOPNOP.endm*------------------------------------------------------------------------------* This is a dummy interrupt service routine used to initialize the IST.*------------------------------------------------------------------------------_vec_dummy:B B3NOP 5*------------------------------------------------------------------------------* This is the actual interrupt service table (IST). It is properly aligned and* is located in the subsection .text:vecs. This means if you don't explicitly* specify this section in your linker command file, it will default and link* into the .text section. Remember to set the ISTP register to point to this* table.*------------------------------------------------------------------------------.sect ".text:vecs".align 1024_vectors:_vector0: VEC_ENTRY _c_int00 ;RESET_vector1: VEC_ENTRY _vec_dummy ;NMI_vector2: VEC_ENTRY _vec_dummy ;RSVD_vector3: VEC_ENTRY _vec_dummy_vector4: VEC_ENTRY _ int_isp4_vector5: VEC_ENTRY _ vec_dummy_vector6: VEC_ENTRY _vec_dummy_vector7: VEC_ENTRY _vec_dummy_vector8: VEC_ENTRY _HWIEdma_vector9: VEC_ENTRY _vec_dummy_vector10: VEC_ENTRY _vec_dummy_vector11: VEC_ENTRY _vec_dummy_vector12: VEC_ENTRY _vec_dummy_vector13: VEC_ENTRY _vec_dummy_vector14: VEC_ENTRY _vec_dummy_vector15: VEC_ENTRY _vec_dummy*------------------------------------------------------------------------------(2)在源程序文件main.c中添加外部中断处理函数定义,假设还是使用外部中断4,则在程序中如下定义:interrupt void int_isp4(){//中断处理代码}注意这里要在函数定义前面添加interrupt关键字,同时将函数名添加进中断向量表文件的对应位置,如上面程序所示,这里需要在其前面添加下划线(汇编程序调用C语言函数需要在函数加上下划线)。
(精)atmega16寄存器笔记整理汇编
一、中断寄存器中断是指微处理器在程序执行期间响应外部的事务请求,暂停当前的处理器工作转而处理外部事件,外部事件处理完成之后返回原来工作暂停的地方继续执行程序。
Atmega16具有21个中断源,每个中断源都有独立的中断向量作为中断服务程序的入口地址,而且所有的中断源都有自己独立的使能位。
如果中断位I和中断向量使能位都置位,则中断发生,中断标志位置位,并执行中断服务程序。
中断向量表见表2,处于越低地址的中断具有更高优先级。
表2 中断向量表向量号程序地址中断源描述1 0x00 RESET 外部引脚电平引发的复位,上电复位,掉电检测复位,看门狗复位,以及JTAG AVR复位2 0x02 INT0 外部中断请求03 0x04 INT1 外部中断请求14 0x06 TIMER2 COMP 定时器/计数器2比较匹配5 0x08 TIMER2 OVF 定时器/计数器2溢出6 0x0a TIMER1 CAPT 定时器/计数器1事件捕捉7 0x0c TIMER1 COMPA 定时器/计数器1比较匹配 A8 0x0e TIMER1 COMPB 定时器/计数器1比较匹配B9 0x10 TIMER1 OVF 定时器/计数器1溢出10 0x12 TIMER0 OVF 定时器/计数器0溢出11 0x14 SPI,STC SPI 串行传输结束12 0x16 USART, RXC USART,Rx 结束13 0x18 USART, UDRE USART数据寄存器空14 0x1a USART, TXC USART,Tx 结束15 0x1c ADC ADC 转换结束16 0x1e EE_RDY EEPROM 就绪17 0x20 ANA_COMP 模拟比较器18 0x22 TWI 两线串行接口19 0x24 INT2 外部中断请求220 0x26 TIMER0 COMP 定时器/ 计数器0 比较匹配21 0x28 SPM_RDY 保存程序存储器内容就绪<一> 全局中断控制位1、状态寄存器SREGbit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0I T H S V N Z C I:全局中断使能位。
(2)STM32使用HAL库操作外部中断——理论讲解
(2)STM32使⽤HAL库操作外部中断——理论讲解1.中断触发过程对主程序压栈——把中断服务函数的地址写⼊到程序计数器(PC)——执⾏中断服务函数2.中断向量表中断服务函数的地址在STM32的⼿册上的中断向量表中(如下是⼀部分):如上表所⽰,EXTI0中断服务函数的地址是0x00000058。
意思就是如果触发了外部中断那么就从0x00000058地址开始执⾏,这个地址的函数可以在HAL库的启动⽂件中找到。
很明显,EXTI0的中断服务函数的函数名是:EXTI0_IRQHandlerEXTI0~EXTI4是独⽴的,9~5共⽤中断源,15~10共⽤中断源,9~5和15~10的中断需要在中断函数中判断是哪个中断引脚。
3.HAL库中的中断服务函数。
这⾥我们要⽤PD10引脚触发外部中断,根据向量表,EXTI10的中断服务函数是:EXTI15_10_IRQHandler。
HAL库中代码是这样执⾏的:(1)⾸先是中断服务函数PD10外部中断触发之后程序计数器被写⼊0x000000E0(EXTI15_10_IRQHandler函数的地址)然后程序开始执⾏EXTI15_10_IRQHandler函数:EXTI15_10_IRQHandler函数只是调⽤了另⼀个函数HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);在这个函数中清楚中断标志位然后⼜调⽤了⼀个HAL_GPIO_EXTI_Callback(GPIO_Pin)函数。
根据函数名Callback也能看出来这⾥才是真正执⾏具体功能的函数,该函数需要⽤户在mian.c⽂件中重写:4.NVIC中断控制器步骤1-3说明了⼀个最基本的中断过程。
然⽽还有⼀个重要的概念没有讲到,NVIC中断控制器。
STM32⽀持中断嵌套,为了更好的更强⼤的实现中断嵌套,ST给出了⼀个NVIC中断控制器来专门管理中断。
我们都知道⾼优先级的中断能打断低优先级的中断优先执⾏,等⾼优先级中断执⾏完之后在返回去执⾏被打断的中断,这就是中断嵌套。
ATMAGE64定时器中断例程
Atmage64定时器中断例程以定时器0为例【实验要求】使LED灯间隔一秒钟变化一次【程序】PORTC=0xF0;TCNT0=61;//定时25msTCCR0|=(1<<CS02)|(1<<CS01)|(1<<CS00);// T/C0工作于普通模式,1024分频【寄存器说明】1、第一步先初始化计数器初值,通过T/C寄存器TCNT0配置。
定时器计数器付初始值,此例程设TCNT0=61。
TCNT0位8位寄存器,计数范围为0-255,付初始值61后,从61开始计数到255时产生溢出中断。
付初值打开相关中断后就开始工作。
【定时时间计算】:每个计数时钟脉冲的时间T=1/f,f=晶振频率/分频系数,如晶振为8MHZ ,分频系数为1024,则定时器器时钟频率为f=8000000HZ/1024 =7812.5HZ,单个时钟脉冲时间:T=1/f=1/7812.5=0.128ms(毫秒),T/C0最大的计数值为256,最大计时时间为56*0.128ms=32.768ms 。
定时器初值计算公式:定时器初值=256- 定时时间/单个时钟脉冲时间如定时25ms,初值=256- 25ms/0.128ms=256-195=61注:1MHZ=1000KHZ=1000000HZ,1s(秒)=1000ms(毫秒)2、第二步设定定时器的分频系数和工作模式,控制寄存器TCCR0在第一步的定时时间是按照1024的分频系数设计的,因此这里配置寄存器相关位,设置分频系数为1024;工作模式为普通模式。
【控制寄存器TCCR0】【工作模式】【分频系数设置】【代码】3、第三步:使能定时器中断。
由中断屏蔽寄存器TIMSK设置。
【TIMSK寄存器】【代码】4、第四步:使能全局中断。
由AVR状态寄存器SREG设置5、第五步:中断服务函数。
inux 混杂设备外部中断和输入子系统
Linux 混杂设备、外部中断和输入子系统Linux驱动开发2010-08-14 10:59:59 阅读22 评论0字号:大中小混杂设备也是一种字符设备,主设备号固定为10。
相对于普通字符设备驱动,它不需要自己去生成设备文件。
1、声明使用的头文件#include <linux/miscdevice.h>2、定义一个混杂设备:static struct miscdevice miscDevice = {.minor = MISC_DYNAMIC_MINOR, //自动分配从设备号.name = "设备名称",.fops = &dev_fops, //设备文件操作指针};3、注册混杂设备:misc_register(&miscDevice) //成功返回04、注销混杂设备:misc_deregister(&miscDevice);在驱动中使用外部中断1、声明头文件#include <linux/interrupt.h>#include <mach/irqs.h>2、申明中断处理程序static irqreturn_t handler(int irq,void *dev_ID){... ....return IRQ_RETV AL(IRQ_HANDLED);}中断处理程序不能用户空间发送或接收数据,以及使用引起阻塞或调度的函数。
在中断处理函数中分配内存要使用GFP_ATOMIC标志,避免中断处理函数进入睡眠。
3、注册中断request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void*dev) //成功返回返回0irq:中断号handler:中断处理程序flags:与中断相关的标志IRQF_TRIGGER_RISING:上升沿触发IRQF_TRIGGER_FALLING:下降沿触发IRQF_TRIGGER_HIGH:高电平触发IRQF_TRIGGER_LOW:低电平触发IRQF_SAMPLE_RANDOM:为系统随机发生器提供支持IRQF_SHARED:中断可在设备间共享IRQF_DISABLED:是否快速中断name:中断名称dev:主要用于共享中断,可通过该参数向中断处理程序传递设备号或其它参数4、注销中断:free_irq(unsigned int irq)5、其它:disable_irq(unsigned int irq)enable_irq(unsigned int irq)输入子系统input子系统:1、头文件:#include <asm/bitops.h>#include <linux/input.h>2、申明static struct input_dev *input_Dev3、初始化input_Dev = input_allocate_device();input_Dev->name = "名称";input_Dev->id.bustype = BUS_HOST; //总线类型BUS_PCIBUS_ISAPNPBUS_USBBUS_HILBUS_BLUETOOTHBUS_VIRTUALBUS_ISABUS_I8042BUS_XTKBDBUS_RS232BUS_GAMEPORTBUS_PARPORTBUS_AMIGABUS_ADBBUS_I2CBUS_HOSTBUS_GSCBUS_ATARIinput_Dev->id.vendor = 供应商代码;input_Dev->id.version = 版本;set_bit(EV_KEY,input_Dev->evbit); //支持按键事件类型EV_KEY :按键EV_REL :相对坐标EV_ABS:绝对坐标EV_SND:声音EV_FF:力反馈... ...set_bit(KEY_A,input_Button->keybit); //设置支持按键A4、注册输入设备input_register_device(struct input_dev *dev);5、报告输入事件input_report_key(struct input_dev *dev, unsigned int code, int value) code:事件代码,可在input.h中查询相关值value:事件值,如果是按键类型,按下为1,松开为0事件同步,告知input core,驱动已发出一次完整的报告。
- 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、中断服务函数。