一、通用定时器介绍
1.1、GD32F10x中定时器一共分为五种类型
1.2、下面我们来介绍通用定时器L0
1.2.1、通用定时器L0(定时器1/2/3/4)每个定时器都有四个通道,每个通道都支持输入捕获,输出比较,产生PWM信号控制电机和电源管理。通用定时器L0计数器是16位无符号计数器。
定时器和定时器之间是相互独立,但是他们可以被同步在一起形成一个更大的定时器,这些定时器的计数器一致地增加。
1.2.2、主要特征
总通道数:4个;
计数器宽度:16位;
时钟源可选:内部时钟,内部触发,外部输入,外部触发;
多种计数模式:向上计数,向下计数和中央对齐计数;
正交编码器接口:被用来追踪运动和分辨选择方向和位置;
霍尔传感器接口:用来做三相电机控制;
可编程的预分频器:16位,运行时可以被改变;
每个通道可配置:输入捕获模式,输出比较模式,可编程的PWM模式,单脉冲模式;
自动重装载功能;
中断输出和DMA请求:更新事件,触发事件,比较/捕获事件;
多个定时器的菊型连接使得一个定时器可以同时启动多个定时器;
定时器的同步运行被选择的定时器在同一个时钟周期开始计数;
定时器主-从管理。
1.2.3、结构框图
图中1:4个输入通道,用于接收外部信号
图中2:4个输出通道,定时器输出引脚
CK_TIMER:计数器的时钟输入,也就是从(APB1过来的时钟)
TIMERx_ETI:外部触发输入信号源,
TIMERx_CH0~3:计数器模块的输出信号经过输出屏蔽和极性控制,比较模式/PWM等多种模式下输出信号的产生模块处理后得到的额定通道输出信号。
二、寄存器介绍
2.1、参考GD32F10x用户手册
下载地址:https://blog.csdn.net/weixin_44501991/article/details/143715172?spm=1001.2014.3001.5502
三、函数汇总
四、程序编写
程序实现的功能是,每隔一段时间使LED翻转
4.1、TIMER2_Init初始化编写
//psc是预分频系数,arr是计数
//定时器周期=系统主频/预分频系数/周期值
// =72MHz/psc/arr
void TIMER2_Init(uint16_t psc,uint16_t arr)
{
timer_parameter_struct timer_init_struct;
rcu_periph_clock_enable(RCU_TIMER2);//使能TIMER2定时器
timer_deinit(TIMER2); //复位外设TIMERx
timer_init_struct.prescaler = psc;//设置分频系数
timer_init_struct.period = arr;//自动重装载值
timer_init_struct.alignedmode = TIMER_COUNTER_EDGE;//对齐方式
timer_init_struct.clockdivision = TIMER_CKDIV_DIV1;//时钟分频因子
timer_init_struct.counterdirection = TIMER_COUNTER_UP;//向上计数
timer_init(TIMER2,&timer_init_struct);
timer_counter_value_config(TIMER2,0);//配置外设TIMERx的计数值
timer_enable(TIMER2);//使能定时器
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);//设置优先级组,
nvic_irq_enable(TIMER2_IRQn,2,0);//使能优先级中断,并配置抢占和响应优先级
timer_interrupt_enable(TIMER2,TIMER_INT_UP);//使能更新中断
}
4.2、定时器中断服务函数编写
bit_status temp=SET;
void TIMER2_IRQHandler(void)
{
if(RESET != timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_UP))//判断是否获取TIMER2外设中断标志
{
if(SET == temp)
{
temp=RESET;
}
else
{
temp=SET;
}
gpio_bit_write(GPIOA,GPIO_PIN_4,temp);
timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_UP);//清除TIMER2外设中断标志
}
}
4.3、主函数编写
int main(void)
{
SystemClock_Config();//系统时钟配置
systick_config();//systick配置
LED_Init();
TIMER2_Init(7200-1,10000-1);
while(1)
{
}
return 0;
}