【GD32L233C-START评测】七、TIMER
[复制链接]
使用TIMER2定时器产生1ms计时中断驱动板载LED4闪烁,同时也驱动PA6引脚产生同样的中断并利用逻辑分析仪采样验证。
一、实验资源
1、GD32L233C-START;
2、Keil V5.36.0.0;
3、逻辑分析仪 + Logic 2.3.45
二、知识准备
GD32L233C的定时器资源分为通用L0级(TIMER1、TIMER2);通用L1级(TIMER8、TIMER11);基本级(TIMER5、TIMER6),均为16位计数器。其中通用L0级的两个定时器功能较多,基本级的两个定时器功能较少,可根据具体应用进行选择。
本次实验使用了通用L0级的TIMER2定时器,虽说是通用级的定时器但功能还是非常强大的,对于多数的应用完全没有问题。
对于定时器的使用绕不开计数时钟,实验中TIMER2的计数时钟选用内部时钟源“CK_TIMER”,下面来看看“CK_TIMER”的来源:
从上面的时钟树可以看出,“CK_TIMER”来自可选的三个时钟内部16MHz、内部16MHz及外部4~32MHz时钟经“CK_PLL”处理后生成“CK_SYS”系统时钟,再经“AHB”分频后可生成高达64MHz的“CK_AHB”,这个时钟被系统分配至各个片上外设。这其中亦包括了经“TIMER”预分频后的"CK_TIMER"。
三、实验内容
1、硬件连接
TIMER2的中断用以改变GPIO引脚电平变化,实验中选用了PA6、PA7。其中PA6用于连接逻辑分析仪;PA7则是用于驱动板载的LED1,用于观察工作状态。另外,PA6、PA7还是TIMER2的两个输出通道(TIMER2_CH0、TIMER2_CH1),这样也便于在此基础上进行相关实验。
2、程序实现
主要目的就是利用TIMER2对“CK_TIMER”时钟进行计数,产生1ms中断。
void TIMER_Config(void)
{
GPIO_Config();
timer_oc_parameter_struct timer_ocintpara;
timer_parameter_struct timer_initpara;
rcu_periph_clock_enable(RCU_TIMER2);
timer_deinit(TIMER2);
/*
定时器时钟计数频率 = 64MHz/(prescaler+1) = 64MHz/(63+1)=1MHz
定时时间 = 定时器时钟计数频率/(period+1) = 1HMz/(999+1) = 1KHz = 0.001s = 1ms
*/
timer_struct_para_init(&timer_initpara);
timer_initpara.prescaler = 63; //时钟预分频系数
timer_initpara.alignedmode = TIMER_COUNTER_EDGE;//边缘对齐
timer_initpara.counterdirection = TIMER_COUNTER_UP; //向上计数
timer_initpara.period = 999; //重载计数值
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_init(TIMER2, &timer_initpara);
timer_auto_reload_shadow_enable(TIMER2);//使能TIMER2重装载
timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);//清除TIMER2向上计数中断标志位
timer_interrupt_enable(TIMER2, TIMER_INT_UP);//使能TIMER2向上计数中断
nvic_irq_enable(TIMER2_IRQn, 0);//配置TIMER2中断
timer_enable(TIMER2);//使能TIMER2
}
程序中对计数时钟进行64分频后实际的计数时钟即为 :定时器时钟计数频率 = 64MHz/(prescaler+1) = 64MHz/(63+1)=1MHz;重载计数器被配置为“999”,定时时间 = 定时器时钟计数频率/(period+1) = 1HMz/(999+1) = 1KHz = 0.001s = 1ms。
TIMER2中断程序中把LED翻转时间调整为100ms便于观察LED1的工作状态:
void TIMER2_IRQHandler(void)
{
static uint8_t num=0;
if(SET == timer_interrupt_flag_get(TIMER2, TIMER_INT_FLAG_UP))
{
timer_interrupt_flag_clear(TIMER2, TIMER_INT_FLAG_UP);//清除向上计数中断标志位
num++;
if(num==100)
{
num=0;
gpio_bit_toggle(LED1_PORT, LED1_PIN);//工作指示
gpio_bit_toggle(GPIOA, GPIO_PIN_6);//逻辑分析仪测试探针
}
}
}
3、实验结果
四、附件
TIMER.rar
(603.71 KB, 下载次数: 12)
|