DSP外部中断笔记

中断原理

三部分

  注意 ,外部中断使能,PIE使能,CPU中断使能

外部中断有7个,PIE有12组,一个组有8个中断复用。只有一个CPU中断可执行。

外部中断原理

1、外部中断概述


 外部中断结构图

外部中断XINT1对应的是0到31GPIO

1经过MUX寄存器

2中断控制寄存器xint1CR  1

进入PIE

GPIO的MUX复用寄存器

 可以查到复用功能,而外部中断现在没特地说明,应该是设置成0;

外部中断寄存器;

gpio中断选择寄存器

xint1 和二只能用在0到31引脚上面

PIE结构图

 PIE组的优先级表

可以见到如下优先级:可以通过表PIEx就是INTx

每个PIE组对应的8个对应中断

INT1.1表明是PIE组第一个中断,下表还是在2.5.3章节

PIE应答寄存器

进入中断后需要写入1,相应的应答清零。等待下次中断才进入

最终送入CPU

程序

DSP2833x_XIntrupt.h  //关于外部中断寄存器

DSP2833x_PieVect.h  //关于PIE向量

DSP2833x_PieCtrl.h  //关于PIE组文件

DSP2833x_Device.h//关键字

可以在里面找到相应的寄存器

关键点,没有进不去中断
    InitPieCtrl(); // pie组初始化
    IER = 0x0000;//全局中断清零
    IFR = 0x0000;//全局中断标记清零
    InitPieVectTable();//pie向量表初始化

外部中断.c文件

#include"exti.h"
#include"led1.h"
interrupt void exti_GPIO12();
interrupt void EXTI1_IRQn(void);
void exti_init()
{
	EALLOW;
	SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;
	EDIS;

	EALLOW;
	GpioCtrlRegs.GPBDIR.bit.GPIO48 = 1;
	GpioCtrlRegs.GPBPUD.bit.GPIO48 = 0;
	GpioDataRegs.GPBCLEAR.bit.GPIO48 = 1;


	GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;//复用0
	GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
	GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;
	GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0;//与系统时钟同步
	EDIS;

	EALLOW;
	GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12;//gpio  int1中断源
	EDIS;

	EALLOW;
	XIntruptRegs.XINT1CR.bit.ENABLE = 1;//int1使能
	XIntruptRegs.XINT1CR.bit.POLARITY = 0;//下降沿触发
	EDIS;

	EALLOW;
	PieCtrlRegs.PIEIER1.bit.INTx4 = 1;//PIE组1 包含有INTx4中断
	PieVectTable.XINT1 = &exti_GPIO12;

	EDIS;

	IER |= M_INT1;//全局中断使能
	EINT;//  全局  中断屏蔽位
	ERTM;// 调式中断使能


}




interrupt void exti_GPIO12(void)
{


	LED1_TOGGLE;//LED 反转

	PieCtrlRegs.PIEACK.bit.ACK1 = 1;//PIE1应答清零
}


主函数文件

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "led1.h"
#include "key.h"
#include "epwm.h"
#include "exti.h"

int main()
{
    Uint16 temp = 0;
    InitSysCtrl();

    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    led_init();
//    key_init();
    exti_init();
//    led_all_flow_init();
//    epwm_init(1000);
//    EPWM6_set_compara(1000, 100);
    while (1)
    {

        //led_twinkle();

        //led_all_flow_twinkle();
        //key_LED();
//        DELAY_US(100000);
//        EPWM6_set_compara(1000, temp += 10);
//        if (temp > 1000)
//        {
//            temp = 0;
//        }



    }

}

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值