对DSP6748的按键程序进行了仔细的研究,搞定了一系列等待的问题,还有一些没有解决的bug正在调试,显示有些bug,就先侃一下一些我小小的心得:
对gpio的操作,首先要使能GPIO,使能这一部分在PSC初始化的时候完成,有一个14年的问题帖子被我找出来了,大家可以看一下:https://www.51dsp.net/forum.php?mod=viewthread&tid=137,在Power/Sleep Controller部分关闭你不用的,开启没有默认开启的,
使用函数:
- PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
复制代码
找到函数的原型:
- int PSCModuleControl (unsigned int baseAdd, unsigned int moduleId,
- unsigned int powerDomain, unsigned int flags)
复制代码
baseAdd 基本地址。moduleId 设备类型 powerDomain 是否上电 flags 上电类型
基本地址定义在soc_C6748.h 文件中 :
- #define SOC_PSC_1_REGS (0x01E27000)
复制代码
然后就该进行GPIO管脚复用配置:
- void GPIOBankPinMuxSet(void)
- {
- // 配置相应的 GPIO 口功能为普通输入输出口
- // 核心板 LED
- GPIOBank6Pin12PinMuxSetup();
- GPIOBank6Pin13PinMuxSetup();
- // 底板按键
- GPIOBank0Pin6PinMuxSetup();
- GPIOBank6Pin1PinMuxSetup();
- }
复制代码
可以去demoStarterWareApplicationPlatform文件夹下面查看:
然后就接着GPIO初始化及中断初始化:
- void GPIOBankPinInit(void)
- {
- // 核心板 LED
- GPIODirModeSet(SOC_GPIO_0_REGS, 109, GPIO_DIR_OUTPUT); // GPIO6[12]
- GPIODirModeSet(SOC_GPIO_0_REGS, 110, GPIO_DIR_OUTPUT); // GPIO6[13]
- // 底板按键
- GPIODirModeSet(SOC_GPIO_0_REGS, 7, GPIO_DIR_INPUT); // USER0 KEY GPIO0[6]
- GPIODirModeSet(SOC_GPIO_0_REGS, 98, GPIO_DIR_INPUT); // USER1 KEY GPIO6[1]
- }
复制代码
- void InterruptInit(void)
- {
- // 初始化 DSP 中断控制器
- IntDSPINTCInit();
- // 使能 DSP 全局中断
- IntGlobalEnable();
- }
复制代码
- void GPIOBankPinInterruptInit(void)
- {
- // 底板按键中断
- // 配置 USER0 KEY GPIO0[6] 为下降沿触发
- GPIOIntTypeSet(SOC_GPIO_0_REGS, 7, GPIO_INT_TYPE_FALLEDGE);
- // 配置 USER1 KEY GPIO6[1] 为上升沿及下降沿触发
- GPIOIntTypeSet(SOC_GPIO_0_REGS, 98, GPIO_INT_TYPE_BOTHEDGE);
- // 使能 GPIO BANK 中断
- GPIOBankIntEnable(SOC_GPIO_0_REGS, 0); // USER0 KEY GPIO0
- GPIOBankIntEnable(SOC_GPIO_0_REGS, 6); // USER1 KEY GPIO6
- // 注册中断服务函数
- IntRegister(C674X_MASK_INT4, USER0KEYIsr);
- IntRegister(C674X_MASK_INT5, USER1KEYIsr);
- // 映射中断到 DSP 可屏蔽中断
- IntEventMap(C674X_MASK_INT4, SYS_INT_GPIO_B0INT);
- IntEventMap(C674X_MASK_INT5, SYS_INT_GPIO_B6INT);
- // 使能 DSP 可屏蔽中断
- IntEnable(C674X_MASK_INT4);
- IntEnable(C674X_MASK_INT5);
- }
复制代码
接着就要进行中断入口函数的编写:
- // 注册中断服务函数
- IntRegister(C674X_MASK_INT4, USER0KEYIsr);
- IntRegister(C674X_MASK_INT5, USER1KEYIsr);
复制代码
- void USER0KEYIsr(void)
- {
- // 软件断点 方便调试
- //SW_BREAKPOINT;
- // 禁用 GPIO BANK 0 中断
- GPIOBankIntDisable(SOC_GPIO_0_REGS, 0);
- // 清除 GPIO BANK 0 中断状态
- IntEventClear(SYS_INT_GPIO_B0INT);
- if(GPIOPinIntStatus(SOC_GPIO_0_REGS, 7) == GPIO_INT_PEND)
- {
- // 清除 GPIO0[6] 中断状态
- GPIOPinIntClear(SOC_GPIO_0_REGS, 7);
- Flag=0;
- }
-
- // 使能 GPIO BANK 0 中断
- GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);
- }
- void USER1KEYIsr(void)
- {
- // 软件断点 方便调试
- //SW_BREAKPOINT;
- // 禁用 GPIO BANK 6 中断
- GPIOBankIntDisable(SOC_GPIO_0_REGS, 6);
- // 清除 GPIO BANK 6 中断状态
- IntEventClear(SYS_INT_GPIO_B6INT);
- if(GPIOPinIntStatus(SOC_GPIO_0_REGS, 98) == GPIO_INT_PEND)
- {
- // 清除 GPIO6[1] 中断状态
- GPIOPinIntClear(SOC_GPIO_0_REGS, 98);
-
- Flag=1;
- }
- // 使能 GPIO BANK 6 中断
- GPIOBankIntEnable(SOC_GPIO_0_REGS, 6);
- }
复制代码
这样就完成了整个中断的编写。
我后来改写了部分程序,调整了结构,但是就按了按键后没有反应,正在修改bug。
|