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