#include "hw_types.h"<br />#include "hw_memmap.h"<br />#include "hw_ints.h"<br />#include "hw_sysctl.h"<br />#include "hw_gpio.h"<br />#include "hw_timer.h"<br />#include "interrupt.h"<br />#include "sysctl.h"<br />#include "gpio.h"<br />#include "timer.h"<br /><br />#define KEY4 GPIO_PIN_4 //PA4 按键后转为软件输出低频<br />#define LED4 GPIO_PIN_5 //PD5 CCP2/TIMER1A输出,连接上LED4来查看波形<br />#define KEY1 GPIO_PIN_4 //PD4 调整频率<br />#define KEY3 GPIO_PIN_5 //PB5 调整频率<br />void waitJTAG ( void ) //KEY4 PA.4<br />{<br /> SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOA) ; /* 使能GPIOA端口*/<br /> GPIOPinTypeGPIOInput (GPIO_PORTA_BASE,GPIO_PIN_4) ; /* 设置按键所在的PA2管脚为输入*/<br /> if (GPIOPinRead (GPIO_PORTA_BASE,GPIO_PIN_4) == 0x00) { /* 如果有键按下,则进入*/<br /> for (;;); /* 死循环,以等待JTAG连接*/<br /> }<br /> SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOA); // 禁止按键所在的GPIO端口<br />}<br /><br />void Timer1Init ( void )<br />{<br /> SysCtlPeripheralEnable ( SYSCTL_PERIPH_GPIOD ) ; /* 使能CCP2所在的GPIO端口*/<br /> GPIOPinTypeTimer ( GPIO_PORTD_BASE , GPIO_PIN_5 ) ; /* 配置CCP2管脚为PWM输出*/<br /><br /> SysCtlPeripheralEnable ( SYSCTL_PERIPH_TIMER1 ) ; /* 使能定时器模块*/<br /> TimerConfigure (TIMER1_BASE,TIMER_CFG_16_BIT_PAIR|TIMER_CFG_A_PWM) ; /* 配置定时器A为16位PWM*/<br /> TimerControlLevel ( TIMER1_BASE , TIMER_A , true ) ; /* 控制PWM输出反相*/<br /> TimerLoadSet ( TIMER1_BASE , TIMER_A , 1); /* 设置定时器初值*/<br /> TimerMatchSet ( TIMER1_BASE , TIMER_A ,0 ) ; /* 设置TimerA的PWM匹配值*/<br /> TimerEnable ( TIMER1_BASE , TIMER_A ) ; /* 使能定时器计数,PWM开始输出*/<br />}<br /><br />int main ( void )<br />{<br /> waitJTAG () ; /* 防止JTAG失效*/<br /> SysCtlLDOSet(SYSCTL_LDO_2_75V); // 内核电压设置为最高的2.75V<br /> SysCtlClockSet(SYSCTL_USE_PLL | // 配置系统时钟,采用PLL,50MHz<br /> SYSCTL_OSC_MAIN |<br /> SYSCTL_XTAL_6MHZ |<br /> SYSCTL_SYSDIV_4);<br /> Timer1Init ( ) ; /* 定时器初始化*/<br /><br /> SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);<br /> GPIODirModeSet (GPIO_PORTA_BASE,GPIO_PIN_4,GPIO_DIR_MODE_IN);<br /> while(GPIOPinRead(GPIO_PORTA_BASE,KEY4)); //等待按键KEY4<br /> <br /> TimerDisable(TIMER1_BASE,TIMER_A); //停止输出<br />//下面开始软件输出PWM---------------------------------------------------- <br /> SysCtlLDOSet(SYSCTL_LDO_2_50V); // 内核电压设置回2.50V<br /> SysCtlClockSet( SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC|SYSCTL_OSC_MAIN |SYSCTL_XTAL_6MHZ); //频率改回来<br /> <br /> <br /> IntPrioritySet(INT_TIMER1A,0x80);<br /> IntPrioritySet(INT_GPIOD,0x40);<br /> IntPrioritySet(INT_GPIOB,0x40); //按键优先级高于定时中断,以便随时调整频率<br /><br /> GPIODirModeSet(GPIO_PORTD_BASE,LED4,GPIO_DIR_MODE_OUT);<br /> TimerConfigure (TIMER1_BASE,TIMER_CFG_32_BIT_PER) ;<br /> TimerLoadSet ( TIMER1_BASE , TIMER_A , SysCtlClockGet()/2);<br /> TimerMatchSet ( TIMER1_BASE , TIMER_A , 0 );<br /> TimerIntEnable(TIMER1_BASE, TIMER_TIMA_TIMEOUT); //定时器设置<br /> <br />//----------1-------------- <br /> SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);<br /> SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);<br /> GPIODirModeSet(GPIO_PORTD_BASE,KEY1,GPIO_DIR_MODE_IN); //KEY1 in<br /> GPIODirModeSet(GPIO_PORTB_BASE,KEY3,GPIO_DIR_MODE_IN);<br /> GPIOIntTypeSet(GPIO_PORTD_BASE,KEY1,GPIO_FALLING_EDGE); <br /> GPIOIntTypeSet(GPIO_PORTB_BASE,KEY3,GPIO_FALLING_EDGE);<br /> GPIOPinIntEnable(GPIO_PORTD_BASE,KEY1);<br /> GPIOPinIntEnable(GPIO_PORTB_BASE,KEY3);<br /> IntEnable(INT_GPIOD); <br /> IntEnable(INT_GPIOB);<br />//---------2------------------<br /> IntEnable(INT_TIMER1A);<br /> IntMasterEnable();<br /> while(1);<br /> <br /> <br />}<br /><br />void TIMER1_INT(void) //定时中断,翻转PWM<br />{<br /> TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT);<br /> GPIOPinWrite(GPIO_PORTD_BASE,LED4,~GPIOPinRead(GPIO_PORTD_BASE,LED4));<br /> TimerEnable(TIMER1_BASE, TIMER_A);<br />}<br /><br />void INTKEY1(void) //KEY1中断<br />{<br /> TimerLoadSet ( TIMER1_BASE , TIMER_A , TimerLoadGet(TIMER1_BASE , TIMER_A)+20);<br />}<br /><br />void INTKEY3(void) //KEY3中断<br />{<br /> TimerLoadSet ( TIMER1_BASE , TIMER_A , TimerLoadGet(TIMER1_BASE , TIMER_A)-20);<br />}<br /><br />环境:615+IAR<br />在周公写的"定时器PWM模式发出25Mhz方波"程序上加以修改,先输出25MPWM,当按KEY4键后停止输出,改为定时器定时中断,软件翻转输出低频PWM(暂定频率为1hz) 这个已经成功实现,能看到灯一闪一闪的<br />后来我想利用KEY1和KEY3,分别用来增高和降低频率,于是就加了两个GPIO_INT中断,可是问题就出现了:去掉1和2之间的程序是正常的,一旦加上,调试时程序会自动进入KEY中断处理中,不按键就进入,而且灯也不闪了,好像进入中断后就出不来..........................<br />我还有调试另外一个看门狗程序,也是在中断中出不来........跟例程对比了,实在是没发现什么问题啊..请大虾帮我看看<br />(在startup.c中加入和修改了中断处理声明) |
|