[ZLG-MCU] 为什么中断处理会出错呢

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

进入中断后要记得清除呀

  
 楼主| Andy1990zx 发表于 2008-3-14 13:56 | 显示全部楼层

自动进入

问题是他自动进入啊&nbsp;我不按键他就进去了INTKEY1中.....
 楼主| Andy1990zx 发表于 2008-3-14 17:46 | 显示全部楼层

好的

谢谢,下次有问题我会直接发邮件的~<br />这个问题我昨天被困扰了很久,今天下午被我解决啦&nbsp;<br />1.进入中断后没有清除中断<br />2.自动进入中断是因为调试时候IAR软件的问题,后来我用按键来硬件复位,不在软件里调试,就正常跑起来了<br />3.IAR调试的时候我还有一点小问题,需要自己再摸索
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

37

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部