今天开始学习定时器了,遇到了一些问题来和大家分享一下:
定时器一般无法进入中断:是因为我们没有修改定时器终端的地址:
DCD IntDefaultHandler ; ADC Sequence 0
DCD IntDefaultHandler ; ADC Sequence 1
DCD IntDefaultHandler ; ADC Sequence 2
DCD IntDefaultHandler ; ADC Sequence 3
DCD IntDefaultHandler ; Watchdog
DCD Timer0A_ISR ; Timer 0A就是修改的这里,将定时器的地址在这里输入就可以了
DCD IntDefaultHandler ; Timer 0B
DCD IntDefaultHandler ; Timer 1A
DCD IntDefaultHandler ; Timer 1B
DCD IntDefaultHandler ; Timer 2A
DCD IntDefaultHandler ; Timer 2B
DCD IntDefaultHandler ; Comp 0
别忘了声明 extern Timer0A_ISR
下面我们就开始配置定时器了:
SysCtlClockSet(SYSCTL_OSC_MAIN|SYSCTL_XTAL_6MHZ|SYSCTL_USE_OSC|SYSCTL_SYSDIV_1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); //系统时钟设置
SysCtlPeriEnable(SYSCTL_PERIPH_TIMER0); //使能定时器0外设
TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER); // 设置定时器0为周期触发模式
TimerLoadSet(TIMER0_BASE, TIMER_A,6000000 ); // 设置定时器装载值:定时1秒
TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); // 设置定时器为溢出中断
// 使能定时器0外设
IntMasterEnable(); // 处理器使能。
TimerEnable(TIMER0_BASE, TIMER_A);
这个一般不需要修改就可以了!!!!!
写一个延时程序:
void delay()
{
IntEnable(INT_TIMER0A);
while(!(TimerIntStatus(TIMER0_BASE,false)&TIMER_TIMA_TIMEOUT));
IntDisable(INT_TIMER0A);
}
这里是利用的定时器中断的标志位来实现定时的 ,这样精确了很多,不过有点费力不讨好的感觉,不过大家将就着看吧,用起来还行的!
void Timer0A_ISR (void)
{
TimerIntClear(TIMER0_BASE,TIMER_TIMA_TIMEOUT);
}
最后来清除定时器的中断标志防止一直在执行!
哈哈 好了!写个流水灯看看吧!!! |