历史上的今天
今天是:2025年03月04日(星期二)
2020年03月04日 | AVR单片机IAR AVR C语言中断编程
2020-03-04 来源:eefocus
一、AVRmega16中断向量表
向量号 程序地址 中断源 描述 IAR AVR中的定义 1 000 RESET 外部引脚电平引发的复位,上电复位,掉电检测复位,看门狗复位,以及JTAG AVR 复位 RESET_vect 2 002 INT0 外部中断请求0 INT0_vect 3 004 INT1 外部中断请求1 INT1_vect 4 006 TIMER2 COMP 定时器/计数 2 比较匹配 TIMER2_COMP_vect 5 008 TIMER2 OVF 定时器/计数 2 溢出 TIMER2_OVF_vect 6 00A TIMER1 CAPT 定时器/计数 1事件捕捉 TIMER_ CAPT_vect 7 00C TIMER1 COMPA 定时器/计数 1比较匹配 A TIMER1_COMPA_vect 8 00E TIMER1 COMPB 定时器/计数 1比较匹配 B TIMER1_COMPB_vect 9 010 TIMER1 OVF 定时器/计数 1 溢出 TIMER1_OVF_vect 10 012 TIMER0 OVF 定时器/计数 0 溢出 TIMER0_OVF_vect 11 014 SPI,STC SPI串行传输结束 SPI_STC_vect 12 016 USART,RXC USART, Rx 结束 USART_RXC_vect 13 018 USART,UDRE USART数据寄存器空 USART_UDRE_vect 14 01A USART,TXC USART, Tx 结束 USART_TXC_vect 15 01C ADC ADC转换结束 ADC_vect 16 01E EE_RDY EEPROM 就绪 EE_RDY_vect 17 020 ANA_COMP 模拟比较器 ANA_COMP_vect 18 022 TWI 两线串行接口 TWI_vect 19 024 INT2 外部中断请求2 INT2_vect 20 026 TIMER0_COMP 定时器/计数 0 比较匹配 TIMER0_COMP_vect 21 028 SPM_RDY 保存程序存储器内容就绪 SPM_RDY_vect
二、AVR 状态寄存器 -SREG
7 6 5 4 3 2 1 0 I T H S V N Z C 初始值 0 0 0 0 0 0 0 0
Bit 7 – I: 全局中断使能
I 置位时使能全局中断。单独的中断使能由其他独立的控制寄存器控制。如果 I 清零,则不论单独中断标志置位与否,都不会产生中断。任意一个中断发生后 I 清零,而执行 RETI指令后 I 恢复置位以使能中断。 I 也可以通过 SEI 和 CLI 指令来置位和清零。
三、MCU控制寄存器-MCUCR
7 6 5 4 3 2 1 0 SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00 初始值 0 0 0 0 0 0 0 0
Bit 3, 2 – ISC11, ISC10: 中断触发方式控制 1 Bit1 与 Bit 0
外部中断 1 由引脚 INT1 激发,如果 SREG 寄存器的 I 标志位和相应的中断屏蔽位置位的话。触发方式如下表 所示。在检测边沿前 MCU首先采样INT1引脚上的电平。如果选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发中断,过短的脉冲则不能保证触发中断。如果选择低电平触发方式,那么低电平必须保 持到当前指令执行完成。
ISC11 ISC10 说明 0 0 INT1 为低电平时产生中断请求 0 1 INT1 引脚上任意的逻辑电平变化都将引发中断 1 0 INT1 的下降沿产生异步中断请求 1 1 INT1 的上升沿产生异步中断请求
Bit 1, 0 – ISC01, ISC00: 中断 0 触发方式控制 Bit 1与 Bit 0
外部中断 0 由引脚 INT0 激发,如果 SREG 寄存器的 I 标志位和相应的中断屏蔽位置位的话。触发方式如 Table 35 所示。在检测边沿前 MCU首先采样INT0引脚上的电平。如果选择了边沿触发方式或电平变化触发方式,那么持续时间大于一个时钟周期的脉冲将触发中断,过短的脉冲则不能保证触发中断。如果选择低电平触发方式,那么低电平必须保持到当前指令执行完成。
ISC01 ISC00 说明 0 0 INT0 为低电平时产生中断请求 0 1 INT0 引脚上任意的逻辑电平变化都将引发中断 1 0 INT0 的下降沿产生异步中断请求 1 1 INT0 的上升沿产生异步中断请求
四、MCU控制与状态寄存器-MCUCSR
7 6 5 4 3 2 1 0 JTD ISC2 - JTRF WDRF BORF EXTRF PORF 初始值 0 0 0
Bit 6 – ISC2: 中断 2 触发方式控制
异步外中断 2 由外部引脚 INT2 激活,如果 SREG 寄存器的 I 标志和 GICR 寄存器相应的中断屏蔽位置位的话。若 ISC2 写 0, INT2 的下降沿激活中断。 若 ISC2 写 1,INT2 的上升沿激活中断。 INT2 的边沿触发方式是异步的。只要INT2引脚上产生宽度大于50nS的脉冲就会引发中断。若选择了低电平中断,低电平必须保持到当前指令完成,然后才会产生中断。而且只要将引脚拉低,就会引发中断请求。改变 ISC2 时有可能发生中断。因此建议首先在寄存器 GICR 里清除相应的中断使能位 INT2,然后再改变 ISC2。最后,不要忘记在重新使能中断之前通过对 GIFR 寄存器的相应中断标志位 INTF2 写 '1’使其清零。
五、通用中断控制寄存器-GICR
7 6 5 4 3 2 1 0 INT1 INT0 INT2 - - - IVSEL IVCE 初始值 0 0 0 0 0 0 0 0
Bit 7 – INT1: 使能外部中断请求 1
当 INT1 为 '1’,而且状态寄存器 SREG 的 I 标志置位,相应的外部引脚中断就使能了。MCU通用控制寄存器– MCUCR的中断敏感电平控制1位 1/0(ISC11与ISC10)决定中断是由上升沿、下降沿,还是 INT1 电平触发的。只要使能,即使 INT1 引脚被配置为输出,只要引脚电平发生了相应的变化,中断可将产生。
Bit 6 – INT0: 使能外部中断请求 0
当 INT0 为 '1’,而且状态寄存器 SREG 的 I 标志置位,相应的外部引脚中断就使能了。MCU通用控制寄存器– MCUCR的中断敏感电平控制0位 1/0(ISC01与ISC00)决定中断是由上升沿、下降沿,还是 INT0 电平触发的。只要使能,即使 INT0 引脚被配置为输出,只要引脚电平发生了相应的变化,中断可将产生。
Bit 5 – INT2: 使能外部中断请求 2
当 INT2 为 '1’,而且状态寄存器 SREG 的 I 标志置位,相应的外部引脚中断就使能了。MCU通用控制寄存器– MCUCR的中断敏感电平控制2位 1/0 (ISC2与ISC2)决定中断是由上升沿、下降沿,还是 INT2 电平触发的。只要使能,即使 INT2 引脚被配置为输出,只要引脚电平发生了相应的变化,中断可将产生。
Bit 1 – IVSEL: 中断向量选择
当 IVSEL 为 "0“ 时,中断向量位于 Flash存储器的起始地址;当 IVSEL 为 "1“ 时,中断向量转移到 Boot 区的起始地址。实际的 Boot 区起始地址由熔丝位BOOTSZ确定。在写的同时可以读 (RWW, Read-While-Write) 的自我编程能力 ” 。 为了防止无意识地改变中断向量表,修改 IVSEL 时需要遵照如下过程:
1. 置位中断向量修改使能位 IVCE
2. 在紧接的 4 个时钟周期里将需要的数据写入 IVSEL,同时对 IVCE 写 ”0”
执行上述序列时中断自动被禁止。其实,在置位 IVCE 时中断就被禁止了,并一直保持到写 IVSEL 操作之后的下一条语句。如果没有 IVSEL 写操作,则中断在置位 IVCE 之后的4个时钟周期保持禁止。需要注意的是,虽然中断被自动禁止,但状态寄存器的位I的值并不受此操作的影响。
Note: 若中断向量位于Boot区,且Boot锁定位BLB02被编程,则执行应用区的程序时中断被禁止;若中断向量位于应用区,且 Boot 锁定位 BLB12 被编程, 则执行 Boot 区的程序时中断被禁止。有关 Boot 锁定位的细节请参见 P234“ 支持引导装入程序 – 在写的同时可以读(RWW, Read-While-Write)的自我编程能力 ” 。
Bit 0 – IVCE: 中断向量修改使能
改变 IVSEL 时 IVCE 必须置位。在 IVCE 或 IVSEL 写操作之后 4 个时钟周期, IVCE 被硬件清零。如前面所述,置位 IVCE 将禁止中断。
六、通用中断标志寄存器-GIFR
7 6 5 4 3 2 1 0 INTF1 INTF0 INTF2 - - - - - 初始值 0 0 0 0 0 0 0 0
Bit 7 – INTF1: 外部中断标志 1
INT1引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF1。如果SREG的位I以及GICR寄存器相应的中断使能位INT1为”1”,MCU即跳转到相应的中断向量。进入中断服务程序之后该标志自动清零。此外,标志位也可以通过写入 ”1” 来清零。
Bit 6 – INTF0: 外部中断标志 0
INT0引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF0。如果SREG的位I以及GICR寄存器相应的中断使能位INT0为”1”,MCU即跳转到相应的中断向量。进入中断服务程序之后该标志自动清零。此外,标志位也可以通过写入 ”1” 来清零。
Bit 5 – INTF2: 外部中断标志 2
INT2引脚电平发生跳变时触发中断请求,并置位相应的中断标志INTF2。如果SREG的位I以及GICR寄存器相应的中断使能位INT2为”1”,MCU即跳转到相应的中断向量。进入中断服务程序之后该标志自动清零。此外,标志位也可以通过写入 ”1” 来清零。注意,当INT2中断禁用进入某些休眠模式时,该引脚的输入缓冲将禁用。这会导致INTF2标志设置信号的逻辑变化,详见 P52“ 数字输入使能和休眠模式 ” 。
七、IAR AVR中断程序
以TIMER2溢出为例,中断处理程序应该写成入下的样子。其它中断处理程序只需要改变为相应的中断向量即可
#pragma vector=TIMER2_OVF_vect
__interrupt void Timer2(void)
{}
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:29 编辑 A题 直流稳定电源一、任务 设计并制作交流变换为直流的稳定电源。 二、要求 1.基本要求 (1)稳压电源 在输入电压220V、50Hz、电压变化范围+15%~-20%条件下: a.输出电压可调范围 ...… 查看全部问答> |
|
初始化SD卡时,等待卡退出空闲状态超时错误,总是在这里卡住,都快郁闷死了,高人指点一下! 在ZLG的SmartARM2200上做SD卡的读卡器实验,用的是uC/OS系统和ZLG_SD驱动。总是在卡初始化时返回“SD_ERR_TIMEOUT_WAITIDLE 0x34”错误,不知道为什么?SD卡是Kingstone 2G的。 … 查看全部问答> |
|
要求: 当一个按健按下时,执行所要完成的动作,而当此动作完成后,按健还继续按着的话,不执行原重复的动作,也就是说按健按下执行一次动作,当按健一直按下时,不重复执行原动作,直到按健断开为止, 以 ...… 查看全部问答> |
|
各位前辈们,你们好。 我刚刚毕业不久,目前正在新公司负责tuner的驱动移植。采用的平台为st5105,demod芯片为stv0297E,tuner为thomson的dct70704。现在的问题是:iic上始终找不到tuner的存在,可以保证的是tuner的地址正确(0xC0), ...… 查看全部问答> |
|
Appendix A - Instrumentation Amplifier Specifications 本帖最后由 dontium 于 2015-1-23 13:37 编辑 Appendix A - Instrumentation Amplifier Specifications … 查看全部问答> |
|
各位大侠,谁有PCF8591的程序 并有详细的说明啊,本人是刚学单片机的 ,时序图也看不懂,实验室叫我们做一个用单片机采集一个电压,并输出一个相同的电压,谁有什么好的主意给我说一下哈,谢谢!!… 查看全部问答> |




