完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
疯狂的大柚柚带你玩转MSP-ESP430G2(基础篇)
(十三)中断系统 中断是暂停CPU正在运行的程序,转去执行相应的中断服务程序,完毕后返回被中断的程序继续运行的现象和技术。 中断源(中断分类) 中断首先要有中断源发出中断请求,并征得系统允许(屏蔽、优先权)后才会发生。转去执行中断服务程序前需要保护中断现场,执行完终端服务程序后恢复中断现场。 中断分为软件中断(内中断)和硬件中断(外中断) 而硬件中断又分为 非屏蔽中断和可屏蔽中断 中断种类 按中断源的响应是否受控
**可屏蔽中断的控制机制(分控位、总控位) 按中断源来自MCU外部引脚还是内部
**状态寄存器SR(Status Register) [tr]15-9876543210[/tr]
置位1:允许所有可屏蔽中断 置位2:禁止所有可屏蔽中断 开/关总中断控制位指令 (Disable/enable general interrupt bit) [tr]指令格式执行操作VZNC[/tr]
// Interrupt Vectors (offset from 0xFFE0) #define PORT1_VECTOR (2*2u)/*0xFFE4 Port 1 */ #define PORT2_VECTOR (3*2u) /*0xFFE6 Port 2 */ #define ADC10 VECTOR (5*2u) /*0xFFEA ADC10 */ #define USCIAB0TX VECTOR (6*2u) /*0xFFEC USCI A0/B0 Transmit */ #define USCIABORX VECTOR (7*2u) /*0xFFEE USCI A0/B0 Receive */ #define TIMERO A1_VECTOR (8*2u) /*0xFFF0 Timer0)A CC1, TA0 */ #define TIMERO A0 VECTOR (9*2u) /*0xFFF2 Timer0 A CCO */ #define WDT VECTOR (10 *2u) /*0xFFF4 Watchdog Timer */ #define COMPARATORA_VECTOR (11 *2u)/* 0xFFF6 Comparator A */ #define TIMER1_A1_VECTOR (12*2u) /*0xFFF8 Timer1_A CC1-4, TA1 */ #define TIMER1 A0 VECTOR (13 *2u) /*0xFFFA Timer1_A CCO */ #define NMI_VECTOR (14*2u) /*0xFFFC Non-maskable */ #define RESET VECTOR (15*2u)/*0xFFFE Reset [Highest Priority] */ 作为中断申请的端口P1和P2引脚,应设置下列相应寄存器:
编程前应了解可屏蔽硬中断的响应过程,了解有关的寄存器和引脚与中断响应过程的关系 a. 主程序做好相关设置:中断源发出中断申请时CPU能够响应的准备工作 b. 中断程序:处理与中断源有关的关键任务 c. 设置中断向量:根据中断源在中断向量表的相应位置,设置中断向量 C语言中的中断程序结构 _interrupt void intName(void) { }
在中断程序前使用#pragma vector=偏址语句 将中断程序的入口地址放入到FFE0+偏址中断向量表中 #pragam vector=N*2 //使用中断类型号计算偏址 _interrupt void intName(void) { } #pragma vector=PORT1_VECTOR//使用符号表示的中断偏址 _interrupt void intName(void) { } C语言:开关总中断控制位函数 (disable/enable general interrupt bit) [tr]函数名称功能包含在[/tr]
#include"in430.h" #include "intrinsics.h" int main( void ) { //Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; _disable_interrupt(); //关总中断控制(非必要) … //主程序初始化准备工作 … _enable_interrupt(); //开总中断控制 while(1){ }; //主程序循环 } #pragma vector=数字或符号表示的偏址//中断向量设置 _interrupt void port_int(void) //中断子程 { .... } .... #include "instrinsics.h" .... /*Deprecated,please use "_disable_interrupt"instead.*/ #define _DINT() _disable_interrupt() /*Deprecated,please use "_disable_interrupt"instead.*/ #define _EINT() _disable_interrupt() /*Deprecated,please use "_disable_interrupt"instead.*/ #define _NOP() _disable_interrupt() .... 用C语言编写中断程序方法2 包含in430.h文件 使用DINT()和EINT() #include"in430.h" int main( void ) { //Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; _DINT( ); //关总中断控制(非必要) //主程序初始化准备工作 ….… _EINT( ); //开总中断控制 while(1){ }; //主程序循环 } #pragma vector=数字或符号表示的偏址//中断向量设置 interrupt void port_int(void) //中断子程 { .... } |
|||||||||
|
|||||||||
只有小组成员才能发言,加入小组>>
3314 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9059 浏览 16 评论
4088 浏览 18 评论
1180浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 22:47 , Processed in 1.373475 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号