微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > DSP学习交流 > + 对DSP按键例程的学习

+ 对DSP按键例程的学习

时间:10-02 整理:3721RD 点击:
对DSP6748的按键程序进行了仔细的研究,搞定了一系列等待的问题,还有一些没有解决的bug正在调试,显示有些bug,就先侃一下一些我小小的心得:
对gpio的操作,首先要使能GPIO,使能这一部分在PSC初始化的时候完成,有一个14年的问题帖子被我找出来了,大家可以看一下:https://www.51dsp.net/forum.php?mod=viewthread&tid=137,在Power/Sleep Controller部分关闭你不用的,开启没有默认开启的,
使用函数:

  1. PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);

复制代码


找到函数的原型:

  1. int PSCModuleControl (unsigned int baseAdd, unsigned int moduleId,
  2.                          unsigned int powerDomain, unsigned int flags)

复制代码



baseAdd 基本地址。moduleId 设备类型 powerDomain 是否上电 flags 上电类型
基本地址定义在soc_C6748.h 文件中 :

  1. #define SOC_PSC_1_REGS                      (0x01E27000)   

复制代码


然后就该进行GPIO管脚复用配置:

  1. void GPIOBankPinMuxSet(void)
  2. {
  3.         // 配置相应的 GPIO 口功能为普通输入输出口
  4.         // 核心板 LED
  5.         GPIOBank6Pin12PinMuxSetup();
  6.         GPIOBank6Pin13PinMuxSetup();

  7.         // 底板按键
  8.         GPIOBank0Pin6PinMuxSetup();
  9.         GPIOBank6Pin1PinMuxSetup();
  10. }

复制代码

可以去demo\StarterWare\Application\Platform文件夹下面查看:
然后就接着GPIO初始化及中断初始化:

  1. void GPIOBankPinInit(void)
  2. {
  3.         // 核心板 LED
  4.     GPIODirModeSet(SOC_GPIO_0_REGS, 109, GPIO_DIR_OUTPUT);  // GPIO6[12]
  5.     GPIODirModeSet(SOC_GPIO_0_REGS, 110, GPIO_DIR_OUTPUT);  // GPIO6[13]

  6.         // 底板按键
  7.     GPIODirModeSet(SOC_GPIO_0_REGS, 7, GPIO_DIR_INPUT);     // USER0 KEY GPIO0[6]
  8.     GPIODirModeSet(SOC_GPIO_0_REGS, 98, GPIO_DIR_INPUT);    // USER1 KEY GPIO6[1]
  9. }

复制代码

  1. void InterruptInit(void)
  2. {
  3.         // 初始化 DSP 中断控制器
  4.         IntDSPINTCInit();

  5.         // 使能 DSP 全局中断
  6.         IntGlobalEnable();
  7. }

复制代码

  1. void GPIOBankPinInterruptInit(void)
  2. {
  3.     // 底板按键中断
  4.     // 配置 USER0 KEY GPIO0[6] 为下降沿触发
  5.     GPIOIntTypeSet(SOC_GPIO_0_REGS, 7, GPIO_INT_TYPE_FALLEDGE);
  6.     // 配置 USER1 KEY GPIO6[1] 为上升沿及下降沿触发
  7.     GPIOIntTypeSet(SOC_GPIO_0_REGS, 98, GPIO_INT_TYPE_BOTHEDGE);

  8.     // 使能 GPIO BANK 中断
  9.     GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);                  // USER0 KEY GPIO0
  10.     GPIOBankIntEnable(SOC_GPIO_0_REGS, 6);                  // USER1 KEY GPIO6

  11.         // 注册中断服务函数
  12.         IntRegister(C674X_MASK_INT4, USER0KEYIsr);
  13.         IntRegister(C674X_MASK_INT5, USER1KEYIsr);

  14.         // 映射中断到 DSP 可屏蔽中断
  15.         IntEventMap(C674X_MASK_INT4, SYS_INT_GPIO_B0INT);
  16.         IntEventMap(C674X_MASK_INT5, SYS_INT_GPIO_B6INT);

  17.         // 使能 DSP 可屏蔽中断
  18.         IntEnable(C674X_MASK_INT4);
  19.         IntEnable(C674X_MASK_INT5);
  20. }

复制代码


接着就要进行中断入口函数的编写:

  1. // 注册中断服务函数
  2. IntRegister(C674X_MASK_INT4, USER0KEYIsr);
  3. IntRegister(C674X_MASK_INT5, USER1KEYIsr);

复制代码

  1. void USER0KEYIsr(void)
  2. {
  3.         // 软件断点 方便调试
  4.         //SW_BREAKPOINT;

  5.     // 禁用 GPIO BANK 0 中断
  6.     GPIOBankIntDisable(SOC_GPIO_0_REGS, 0);

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

  9.     if(GPIOPinIntStatus(SOC_GPIO_0_REGS, 7) == GPIO_INT_PEND)
  10.     {
  11.                 // 清除 GPIO0[6] 中断状态
  12.                 GPIOPinIntClear(SOC_GPIO_0_REGS, 7);

  13.                 Flag=0;
  14.     }
  15.        
  16.         // 使能 GPIO BANK 0 中断
  17.     GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);
  18. }

  19. void USER1KEYIsr(void)
  20. {
  21.         // 软件断点 方便调试
  22.         //SW_BREAKPOINT;

  23.     // 禁用 GPIO BANK 6 中断
  24.     GPIOBankIntDisable(SOC_GPIO_0_REGS, 6);

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

  27.     if(GPIOPinIntStatus(SOC_GPIO_0_REGS, 98) == GPIO_INT_PEND)
  28.     {
  29.                 // 清除 GPIO6[1] 中断状态
  30.                 GPIOPinIntClear(SOC_GPIO_0_REGS, 98);
  31.        
  32.                 Flag=1;
  33.     }

  34.         // 使能 GPIO BANK 6 中断
  35.     GPIOBankIntEnable(SOC_GPIO_0_REGS, 6);
  36. }

复制代码


这样就完成了整个中断的编写。
我后来改写了部分程序,调整了结构,但是就按了按键后没有反应,正在修改bug。

我的图片怎么丢了,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top