VID_20251209_163807
学会操作GPIO后,开启定时器来精确控制LED
voidtimer_init(uint16_t ms);
intmain(void) {
Device_init();
Interrupt_initVectorTable();
timer_init(3);
EINT;
GPIO_setDirectionMode(8, GPIO_DIR_MODE_OUT);
GPIO_MuxConfig(8, GPIO_8_GPIO8, GPIO_PIN_TYPE_STD, GPIO_QUAL_ASYNC);
GPIO_writePin(8, 0);
while(1) {
}
return 0;
}
__interrupt voidtimer0_isr(void)
{
GPIO_togglePin(8);
}
voidtimer_init(uint16_t ms)
{
uint32_t SystemClock = SysCtl_getClock(DEVICE_OSCSRC_FREQ);
uint32_t prescaler = CPUTIMER_CLOCK_PRESCALER_1;
uint32_t period = SystemClock / ((prescaler + 1) * (1000 / ms));
SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_TIMER0);
CPUTimer_stopTimer(CPUTIMER0_BASE);
CPUTimer_setPeriod(CPUTIMER0_BASE, period - 1);
CPUTimer_setPreScaler(CPUTIMER0_BASE, prescaler);
CPUTimer_reloadTimerCounter(CPUTIMER0_BASE);
CPUTimer_enableInterrupt(CPUTIMER0_BASE);
CPUTimer_startTimer(CPUTIMER0_BASE);
Interrupt_register(INT_TIMER0, timer0_isr);
Interrupt_enable(INT_TIMER0);
}
几乎所有芯片开启定时器的步骤都一样,先开启定时器时钟,设置分频值、周期值,开启定时器以及中断。这里还需要绑定中断服务函数。此外在初始化完成后,要使用EINT来启用中断,否则中断无法正常运行。
这里经过调试发现默认配置的主频是100MHz
中断服务函数里调用官方的反转GPIO口的函数,初始化我设置3ms进入一次中断,肉眼观察现象不明显,使用示波器观察,周期为6ms,符合预期
|