EINT |= M_INT1
时间: 2023-08-27 11:16:42 浏览: 54
EINT |= M_INT1 是设置总中断使能的代码,其中 M_INT1 是一个宏定义,表示第一组中断。该代码将使能第一组中断,包括定时器0的中断。 这样,当定时器0的中断发生时,程序将跳转到中断向量表中的 INT0 入口地址,并执行相应的中断处理函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [DSP 定时器中断](https://blog.csdn.net/u012616827/article/details/121985588)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
相关问题
PieCtrlRegs.PIEIER1.bit.INTx7 = 0; //禁止CPUTimer0中断 asm(" rpt #4 ||nop"); IFR &= (~M_INT1); PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; EINT;
这段代码是使用 C 语言编写的,它的作用是禁止 CPUTimer0 的中断,并且清除相关的中断标志位。让我解释一下:
1. `PieCtrlRegs.PIEIER1.bit.INTx7 = 0;` 这一行代码将 CPUTimer0 的中断使能位设置为 0,即禁止中断。
2. `asm(" rpt #4 ||nop");` 这是一条汇编指令,它用于延迟执行,确保中断使能位的修改已经生效。
3. `IFR &= (~M_INT1);` 这一行代码将中断标志位的相应位清零,以确保中断触发后不会立即再次触发。
4. `PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;` 这一行代码用于清除 PIE 控制器中的中断标志。它将 PIEACK 寄存器设置为 PIEACK_GROUP1,表示清除 Group 1 类别的中断标志。
5. `EINT;` 这是一个宏定义,用于使能全局中断。
总的来说,这段代码的目的是禁止 CPUTimer0 的中断,并且清除相关的中断标志位,以确保中断的正确处理。
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File #include "leds.h" #include "time.h" #include "uart.h" /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ Uint16 rx_buf[50]; int count = 0; int timeoutFlag = 0; int systick = 0; int send_flag = 0; int alarm_flag = 0; void interrupt ISR_RXD(void); void main() { int i = 0; int distance; int speed; int time; char buff[] = {0x55 ,0x5A ,0x02 ,0xD3 ,0x84,0x00}; char *msg = (char *)buff; Uint16 *p = 0; Uint16 ReceivedChar=0; InitSysCtrl(); InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); LED_Init(); TIM0_Init(150,1000);//200ms UARTa_Init(115200); EALLOW; PieVectTable.SCIRXINTA=&ISR_RXD; EDIS; IER |= M_INT9; PieCtrlRegs.PIEIER9.bit.INTx1= 1; EINT; ERTM; while(1) { if(systick-send_flag>=100) { send_flag = systick; UARTa_SendString(msg); } if(alarm_flag) { LED7_TOGGLE; alarm_flag = 0; send_flag = systick; while(systick-send_flag<=1000); LED7_TOGGLE; } if((timeoutFlag>=10)&&(count>=12)) { for(i = 0;i<count;i++) { if((rx_buf[i] == 0x55)&&((rx_buf[i+1] == 0xA5))) { p = &rx_buf[i]; break; } } if(p!=0) { distance = p[4]*256+p[5]; speed =p[6]*256+p[7]; time=distance/speed; if(time<=2) alarm_flag = 1; else alarm_flag = 0; p = 0; } count = 0; timeoutFlag = 0; } } } void interrupt ISR_RXD(void) { PieCtrlRegs.PIEACK.all = PIEACK_GROUP9; rx_buf[count] = SciaRegs.SCIRXBUF.all; count++; timeoutFlag = 0; }详细解释这段代码
这段代码是一个基于DSP2833x芯片的控制程序,主要功能是通过串口与外部设备进行通信,并通过LED灯实现报警功能。
首先,程序初始化了系统控制、中断向量表以及LED和定时器等相关硬件配置。其中,定时器的时间间隔是200ms,串口的波特率为115200。
然后,在主循环中,程序不断检查定时器的时间是否达到了发送数据的时间间隔(100ms),如果达到,则向外部设备发送数据。
同时,程序还检查是否有报警信号(alarm_flag),如果有,则通过LED灯进行报警,并在1秒后关闭报警灯。
最后,程序通过中断处理函数(ISR_RXD)接收串口传来的数据,并根据特定的数据格式解析出距离和速度等信息,如果时间小于等于2秒,则设置报警标志(alarm_flag)。如果接收数据的时间超过了10次定时器的时间间隔(2秒),则认为接收数据超时,将数据解析出距离和速度等信息,并根据时间是否小于等于2秒来设置报警标志。