PAGE1
PAGE1
9.定时器与中断处理
9.1定时器概述
定时器是嵌入式系统中最常用的基础模块之一,主要用于生成精确的时间间隔或计数脉冲。TivaC系列单片机(基于TM4C123)提供了多种定时器,包括通用定时器(General-PurposeTimers)、看门狗定时器(WatchdogTimers)和脉宽调制定时器(PWMTimers)。这些定时器可以用于各种应用,如延时、计数、生成周期性中断等。
9.1.1通用定时器
通用定时器是TivaC系列单片机中最为灵活的定时器类型,可以配置为16位或32位定时器,并支持多种工作模式,包括周期模式、一次性模式、上下计数模式等。通用定时器的工作原理是通过一个计数器在预设的时间间隔内递增或递减,当计数器达到预设值时,可以触发中断或停止计数。
9.1.2看门狗定时器
看门狗定时器主要用于防止程序死锁或跑飞,是一种硬件定时器。当程序运行正常时,需要定期复位看门狗定时器,否则定时器超时后会触发系统复位。看门狗定时器的配置相对简单,但其作用非常重要,可以确保系统在出现意外情况时能够恢复正常运行。
9.1.3脉宽调制定时器
脉宽调制(PWM)定时器主要用于生成PWM信号,可以用于控制电机、LED等设备的功率。PWM定时器通过配置周期和占空比来生成脉冲信号,定时器在每个周期内生成一个高电平和一个低电平,其占空比决定了高电平的持续时间。
9.2定时器的基本配置
9.2.1通用定时器的基本配置
通用定时器的基本配置包括选择定时器模块、配置工作模式、设置计数器值和使能中断。以下是一个简单的示例,展示如何配置通用定时器生成周期性中断。
9.2.1.1代码示例
#includestdint.h
#includestdbool.h
#includeinc/tm4c123gh6pm.h
#includeinc/hw_memmap.h
#includeinc/hw_types.h
#includedriverlib/sysctl.h
#includedriverlib/timer.h
#includedriverlib/interrupt.h
//定时器中断处理函数
voidTimer0IntHandler(void){
//清除定时器中断标志
TimerIntClear(TIMER0_BASE,TIMER_TIMA_TIMEOUT);
//中断处理代码
//例如:LED翻转
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1,GPIO_PIN_1^(GPIO_PIN_1GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_1)));
}
intmain(void){
//系统时钟配置
SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);
//使能定时器和GPIO模块的时钟
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
//等待时钟使能完成
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_TIMER0)){}
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF)){}
//配置GPIO
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_1);
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1,0);
//配置定时器
TimerConfigure(TIMER0_BASE,TIMER_CFG_PERIODIC);
TimerLoadSet(TIMER0_BASE,TIMER_A,SysCtlClockGet()/10);//100ms周期
//使能定时器中断
TimerIntEnable(TIMER0_BASE,TIMER_TIMA_TIMEOUT);
IntEnable(INT_TIMER0A);
TimerEna