本帖最后由 Cratial 于 2016-1-19 22:25 编辑
本次实验过程中在使用CCS软件时遇到了一个小问题,即无法连接到目标板,关键是刚开始的时候是能够连接到仿真器并进行仿真的,问题出现如下图:
其大意就是说我的仿真器没有正确配置/连接,打开PC设备管理器如下图:
可看到仿真器驱动安装正确,重启CCS后还是不能进入Debug模式,打开Target configurations,进行仿真器连接测试,测试显示仿真器没有连接到目标板。折腾一番后发现原来是仿真器初始化脚本没有正确添加
重新添加后,即可正确连接到目标板了。
本次主要利用开发板进行中断实验,与其它单片机类似,创龙公司的这款单片机拥有强大的中断功能,中断使得程序编写更加灵活,能够较大程度地提高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)
- #include "TL6748.h"
- #include "hw_types.h"
- #include "hw_syscfg0_C6748.h"
- #include "soc_C6748.h"
- #include "psc.h"
- #include "gpio.h"
- #include "interrupt.h"
- #define SW_BREAKPOINT asm(" SWBP 0 ");
- unsigned int i=1,j=1;
- void PSCInit(void);
- void GPIOBankPinMuxSet();
- void GPIOBankPinInit();
- void GPIOBankPinInterruptInit(void);
- void InterruptInit(void);
- void USER0KEYIsr(void);
- void USER1KEYIsr(void);
- int main(void)
- {
- PSCInit();
- GPIOBankPinMuxSet();
- GPIOBankPinInit();
- InterruptInit();
- GPIOBankPinInterruptInit();
- GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW); //D7
- GPIOPinWrite(SOC_GPIO_0_REGS, 2, GPIO_PIN_LOW); //D9
- GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_LOW); //D10
- GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_LOW); //D6
- GPIOPinWrite(SOC_GPIO_0_REGS, 109, GPIO_PIN_HIGH); //核心板LED
- GPIOPinWrite(SOC_GPIO_0_REGS, 110, GPIO_PIN_HIGH);
- }
- void PSCInit(void)
- {
- PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- }
- void GPIOBankPinMuxSet(void)
- {
- GPIOBank0Pin0PinMuxSetup();
- GPIOBank0Pin5PinMuxSetup();
- GPIOBank6Pin12PinMuxSetup();
- GPIOBank6Pin13PinMuxSetup();
- GPIOBank0Pin6PinMuxSetup();
- GPIOBank6Pin1PinMuxSetup();
- }
- void GPIOBankPinInit(void)
- {
- 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, 6, GPIO_DIR_OUTPUT); // D6 GPIO0[5]
- GPIODirModeSet(SOC_GPIO_0_REGS, 1, GPIO_DIR_OUTPUT); // D7 GPIO0[0]
- 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 GPIOBankPinInterruptInit(void)
- {
- // 配置 USER0 KEY GPIO0[6] 为上升沿触发
- GPIOIntTypeSet(SOC_GPIO_0_REGS, 7, GPIO_INT_TYPE_RISEDGE);
- GPIOIntTypeSet(SOC_GPIO_0_REGS, 98, GPIO_INT_TYPE_RISEDGE);
- // 使能 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);
- }
- void InterruptInit(void)
- {
- IntDSPINTCInit();
- IntGlobalEnable();
- }
- void USER0KEYIsr(void)
- {
- // 禁用 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);
- if (i)
- {
- i=0;
- GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_HIGH);
- }
- else
- {
- i=1;
- GPIOPinWrite(SOC_GPIO_0_REGS, 6, GPIO_PIN_LOW);
- }
- }
- // 使能 GPIO BANK 0 中断
- GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);
- }
- void USER1KEYIsr(void)
- {
- // 禁用 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);
- if (j)
- {
- j=0;
- GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_HIGH);
- }
- else
- {
- j=1;
- GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW);
- }
- }
- // 使能 GPIO BANK 6 中断
- GPIOBankIntEnable(SOC_GPIO_0_REGS, 6);
- }
复制代码
小结:本次实验主要对DSP的中断进行了学习,基本了解了DSP提供的中断类型,并通过简单的按键控制触发中断,在中断服务程序内实现对LED灯的控制,由于是在中断服务程序内实现的,没有按键消抖的功能,可能在某一次按键按下时会发现控制的LED只是跳变了一下而没有点亮或是熄灭,这不是本次实验的关键了^_^,关键是通过独立事件按键触发可屏蔽的硬件中断。
1
|
|
|
|