1649|0

1702

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

TMS320F28335项目开发记录9_28335中断系统 [复制链接]

本帖最后由 火辣西米秀 于 2019-8-18 11:29 编辑

       

1.中断系统

   在这里我们要十分清楚DSP的中断系统。

C28XX一共同拥有16个中断源,当中有2个不可屏蔽的中断RESET和NMI、定时器1和定时器2分别使用中断13和14。这样还有12个中断都直接连接到外设中断扩展模块PIE上。

说的简单一点就是PIE通过12根线与28335核的12个中断线相连。而PIE的另外一側有12*8根线分别连接到外设,如AD、SPI、EXINT等等。

 

   PIE共管理12*8=96个外部中断。这12组大中断由28335核的中断寄存器IER来控制,即IER确定每一个中断究竟属于哪一组大中断(如IER |= M_INT12; 说明我们要用第12组的中断,可是第12组里面的什么中断CPU并不知道须要再由PIEIER确定 )。

   接下来再由PIE模块中的寄存器PIEIER中的低8确定该中断是这一组的第几个中断,这些配置都要告诉CPU(我们不难想象到PIEIER共同拥有12总即从PIEIER1-PIEIER12)。

另外。PIE模块还有中断标志寄存器PIEIFR,相同它的低8位是来自外部中断的8个标志位,相同CPU的IFR寄存器是中断组的标志寄存器。由此看来。CPU的全部中断寄存器控制12组的中断,PIE的全部中断寄存器控制每组内8个的中断。

除此之外,我们用到哪一个外部中断。对应的还有外部中断的寄存器,须要注意的就是外部中断的标志要自己通过软件来清零。而PIE和CPU的中断标志寄存器由硬件来清零。

 

  1. EALLOW; // This is needed to write to EALLOW protected registers

  2. PieVectTable.XINT2 = &ISRExint; //告诉中断入口地址

  3. EDIS; // This is needed to disable write to EALLOW protected registers

  4. PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block使能PIE

  5. PieCtrlRegs.PIEIER1.bit.INTx5= 1; //使能第一组中的中断5

  6. IER |= M_INT1; // Enable CPU 第一组中断

  7. EINT; // Enable Global interrupt INTM

  8. ERTM; // Enable Global realtime interrupt DBGM


    也就是说,12组中的每一个中断都要完毕上面的同样配置,剩下的才是去配置自己的中断。如我们提到的EXINT,即外面来个低电平我们就进入中断。完毕我们的程序。在这里要介绍一下,DSP的GPIO口都能够配置为外部中断口,其配置方法例如以下:     


 
  1. GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 0; //选择他们是GPIO口

  2. GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 0;

  3. GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 0;

  4. GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 0;

  5.  
  6. GpioCtrlRegs.GPBDIR.bit.GPIO54 = 0;//选择他们都是输入口

  7. GpioCtrlRegs.GPBDIR.bit.GPIO55 = 0;

  8. GpioCtrlRegs.GPBDIR.bit.GPIO56 = 0;

  9. GpioCtrlRegs.GPBDIR.bit.GPIO57 = 0;

  10.  
  11. GpioCtrlRegs.GPBQSEL2.bit.GPIO54= 0;//GPIO时钟和系统时钟一样且支持GPIO

  12. GpioCtrlRegs.GPBQSEL2.bit.GPIO55= 0;

  13. GpioCtrlRegs.GPBQSEL2.bit.GPIO56= 0;

  14. GpioCtrlRegs.GPBQSEL2.bit.GPIO57= 0;

  15.  
  16. GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL = 54;//中断3选择GPIO

  17. GpioIntRegs.GPIOXINT4SEL.bit.GPIOSEL = 55;

  18. GpioIntRegs.GPIOXINT5SEL.bit.GPIOSEL = 56;

  19. GpioIntRegs.GPIOXINT6SEL.bit.GPIOSEL = 57;

  20.  
  21. XIntruptRegs.XINT3CR.bit.POLARITY= 0;//触发模式为下降沿触发

  22. XIntruptRegs.XINT4CR.bit.POLARITY= 0;

  23. XIntruptRegs.XINT5CR.bit.POLARITY= 0;

  24. XIntruptRegs.XINT6CR.bit.POLARITY= 0;

  25.  
  26. XIntruptRegs.XINT3CR.bit.ENABLE = 1;//使能中断

  27. XIntruptRegs.XINT4CR.bit.ENABLE = 1;

  28. XIntruptRegs.XINT5CR.bit.ENABLE = 1;

  29. XIntruptRegs.XINT6CR.bit.ENABLE = 1;

注意一点就是外部中断1和2仅仅能对GPIO0—GPIO31配置;外部中断3和4、5、6、7仅仅对GPIO32—GPIO63配置。

GPIO分为A(0-31)、B(32-63)、C(64-87);C组的不能配置为外部中断;

 

2.怎样开启某个中断?

  • 设置中断向量。比如:PieVectTable.ADCINT = &adc_isr;等
  • 打开PIE控制器。PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
  • 使能PIE中对应外设的中断(对应group的对应pin)。

    比如:PieCtrlRegs.PIEIER1.bit.INTx8 = 1; PieCtrlRegs.PIEIER1.bit.INTx6 = 1;等

  • 使能CPU的对应中断(INT1~INT12)IER |= M_INT1;
  • 使能CPU响应中断EINT、ERTM;;

 

3.中断标志有几级?作用是什么?

中断标志主要有三级CPU(有16个标志位)、PIE(有12组每组有12个标志位)和外设(有的外设没有)。

标志位在中断发生后锁存中断状态。即表示中断发生。在CPU响应中断后。会自己主动清除cpu级别的标志位IFR bit,同一时候将INTM bit 置位,以防止其他中断的发生。

CPU在从PIE中取中断向量时PIE会自己主动清除PIE级别的标志位PIEIFRx.y。所以在进入中断处理程序后除了外设全部中断位都已经清除。

 

而中断处理程序中须要清除PIEACKx和外设的中断标志位(假设有的话)。

在CPU响应一个中断后。在进入ISR的时候,默认会关断全局中断。即在运行中断服务程序时,不会有其它中断来打断CPU,包含本次的中断事件。另外,假设外设的中断标志位不清除,不会循环进入这个中断服务函数。这个外设中断被阻断了。所以仅仅有清除外设的中断服务程序。才干响应下一次的外设中断。PIEACK同理,假设没有PIEACK。这组全部中断都被阻断。

点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表