创龙TMS320C6748开发板———按键中断学习

来源:互联网 发布:侠盗飞车作弊软件 编辑:程序博客网 时间:2024/05/19 20:21
本次主要利用开发板进行中断实验,与其它单片机类似,创龙公司的这款单片机拥有强大的中断功能,中断使得程序编写更加灵活,能够较大程度地提高CPU的功率。
中断可分为四类
1.复位中断(REST):在上电时就会执行一次,也就是我们熟悉的上电复位功能,起到初始化各寄存器的作用。其优先级最高,在程序运行过程中执行复位中断时可使CPU停止操作并回到程序初始运行状态,初始化所有寄存器回复默认状态;
2.12个可屏蔽硬件中断(INT4-INT15)
该类中断是在满足一定条件时才能发生的中断,需满足的条件:全局中断使能、不可屏蔽中断使能、可屏蔽中断使能、中断标志寄存器相应位置1(没有更高级的中断在执行中);
3.不可屏蔽中断/异常(NMI)不可屏蔽中断使能时,该中断即可发生;
4.可屏蔽硬件异常(EXCEP)某一可屏蔽中断不发生即产生可屏蔽中断异常
本次实验是由独立事件(按键触发)产生的可屏蔽硬件中断来控制LED灯的亮与灭
按键硬件电路:USER0 KEY 对应GPIO0[6]、USER1 KEY 对应GPIO6[1] 应用此按键分别控制LED D6、D7
 
软件设计:
中断配置过程:使能DSP全局中断、配置按键中断触发方式(包括没有边沿的触发、上升沿、下降沿、双边触发共四种触发方式)、使能GPIO BANK 中断、注册中断服务函数、映射中断到12个可屏蔽硬件中断、最后使能可屏蔽硬件中断。
中断事件引发中断后根据引起中断产生的事件类型转去执行相应的中断服务程序,中断服务程序处理过程:
进入中断服务程序后首先关闭中断,停止该中断响应;然后清除GPIO BANK中断标志,并根据按键中断状态执行相关操作控制LED灯的亮、灭;执行完成后就打开之前关闭的GPIO BANK中断。


程序设计代码如下所示:(此次程序设计参考了创龙提供的官方源代码GPIO_KEY)
  1. #include "TL6748.h"
  2. #include "hw_types.h"
  3. #include "hw_syscfg0_C6748.h"
  4. #include "soc_C6748.h"
  5. #include "psc.h"
  6. #include "gpio.h"
  7. #include "interrupt.h"

  8. #define SW_BREAKPOINT   asm(" SWBP 0 ");
  9. unsigned int i=1,j=1;

  10. void PSCInit(void);
  11. void GPIOBankPinMuxSet();
  12. void GPIOBankPinInit();
  13. void GPIOBankPinInterruptInit(void);
  14. void InterruptInit(void);
  15. void USER0KEYIsr(void);
  16. void USER1KEYIsr(void);

  17. int main(void)
  18. {
  19.         PSCInit();
  20.         GPIOBankPinMuxSet();
  21.         GPIOBankPinInit();
  22.         InterruptInit();
  23.         GPIOBankPinInterruptInit();

  24.         GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW);    //D7
  25.         GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_LOW);        //D9
  26.         GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_LOW);        //D10
  27.         GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_LOW);        //D6
  28.         GPIOPinWrite(SOC_GPIO_0_REGS, 109, GPIO_PIN_HIGH);   //核心板LED
  29.         GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH);

  30. }

  31. void PSCInit(void)
  32. {
  33.     PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
  34. }

  35. void GPIOBankPinMuxSet(void)
  36. {
  37.         GPIOBank0Pin0PinMuxSetup();
  38.         GPIOBank0Pin5PinMuxSetup();
  39.         GPIOBank6Pin12PinMuxSetup();
  40.         GPIOBank6Pin13PinMuxSetup();

  41.         GPIOBank0Pin6PinMuxSetup();
  42.         GPIOBank6Pin1PinMuxSetup();
  43. }


  44. void GPIOBankPinInit(void)
  45. {
  46.     GPIODirModeSet(SOC_GPIO_0_REGS, 109, GPIO_DIR_OUTPUT);  // GPIO6[12]
  47.     GPIODirModeSet(SOC_GPIO_0_REGS, 110, GPIO_DIR_OUTPUT);  // GPIO6[13]

  48.     GPIODirModeSet(SOC_GPIO_0_REGS, 6, GPIO_DIR_OUTPUT);    // D6  GPIO0[5]
  49.     GPIODirModeSet(SOC_GPIO_0_REGS, 1, GPIO_DIR_OUTPUT);    // D7  GPIO0[0]

  50.     GPIODirModeSet(SOC_GPIO_0_REGS, 7, GPIO_DIR_INPUT);     // USER0 KEY GPIO0[6]
  51.     GPIODirModeSet(SOC_GPIO_0_REGS, 98, GPIO_DIR_INPUT);    // USER1 KEY GPIO6[1]
  52. }


  53. void GPIOBankPinInterruptInit(void)
  54. {

  55.     // 配置 USER0 KEY GPIO0[6] 为上升沿触发
  56.     GPIOIntTypeSet(SOC_GPIO_0_REGS, 7, GPIO_INT_TYPE_RISEDGE);
  57.     GPIOIntTypeSet(SOC_GPIO_0_REGS, 98, GPIO_INT_TYPE_RISEDGE);

  58.     // 使能 GPIO BANK 中断
  59.     GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);                  // USER0 KEY GPIO0
  60.     GPIOBankIntEnable(SOC_GPIO_0_REGS, 6);                  // USER1 KEY GPIO6

  61.         // 注册中断服务函数
  62.         IntRegister(C674X_MASK_INT4, USER0KEYIsr);
  63.         IntRegister(C674X_MASK_INT5, USER1KEYIsr);

  64.         // 映射中断到 DSP 可屏蔽中断
  65.         IntEventMap(C674X_MASK_INT4, SYS_INT_GPIO_B0INT);
  66.         IntEventMap(C674X_MASK_INT5, SYS_INT_GPIO_B6INT);

  67.         // 使能 DSP 可屏蔽中断
  68.         IntEnable(C674X_MASK_INT4);
  69.         IntEnable(C674X_MASK_INT5);
  70. }

  71. void InterruptInit(void)
  72. {
  73.         IntDSPINTCInit();
  74.         IntGlobalEnable();
  75. }

  76. void USER0KEYIsr(void)
  77. {
  78.     // 禁用 GPIO BANK 0 中断
  79.     GPIOBankIntDisable(SOC_GPIO_0_REGS, 0);

  80.     // 清除 GPIO BANK 0 中断状态
  81.     IntEventClear(SYS_INT_GPIO_B0INT);

  82.     if(GPIOPinIntStatus(SOC_GPIO_0_REGS, 7) == GPIO_INT_PEND)
  83.     {
  84.                 // 清除 GPIO0[6] 中断状态
  85.                 GPIOPinIntClear(SOC_GPIO_0_REGS, 7);
  86.                         if (i)
  87.                         {
  88.                                 i=0;
  89.                                 GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_HIGH);
  90.                         }
  91.                         else
  92.                         {
  93.                                 i=1;
  94.                                 GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_LOW);
  95.                         }
  96.     }

  97.         // 使能 GPIO BANK 0 中断
  98.     GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);
  99. }

  100. void USER1KEYIsr(void)
  101. {
  102.     // 禁用 GPIO BANK 6 中断
  103.     GPIOBankIntDisable(SOC_GPIO_0_REGS, 6);

  104.     // 清除 GPIO BANK 6 中断状态
  105.     IntEventClear(SYS_INT_GPIO_B6INT);

  106.     if(GPIOPinIntStatus(SOC_GPIO_0_REGS, 98) == GPIO_INT_PEND)
  107.     {
  108.                 // 清除 GPIO6[1] 中断状态
  109.                 GPIOPinIntClear(SOC_GPIO_0_REGS, 98);
  110.                 if (j)
  111.                 {
  112.                         j=0;
  113.                         GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_HIGH);
  114.                 }
  115.                 else
  116.                 {
  117.                         j=1;
  118.                         GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW);
  119.                         }
  120.     }

  121.         // 使能 GPIO BANK 6 中断
  122.     GPIOBankIntEnable(SOC_GPIO_0_REGS, 6);
  123. }
复制代码
小结本次实验主要对DSP的中断进行了学习,基本了解了DSP提供的中断类型,并通过简单的按键控制触发中断,在中断服务程序内实现对LED灯的控制,由于是在中断服务程序内实现的,没有按键消抖的功能,可能在某一次按键按下时会发现控制的LED只是跳变了一下而没有点亮或是熄灭,这不是本次实验的关键了^_^,关键是通过独立事件按键触发可屏蔽的硬件中断。
0 0
原创粉丝点击