
GD32篇 二、GD32TIMER输出PWM
可以在中文手册里面找到相关的资料通用定时器L0(定时器1/2/3/4)是4通道定时器,支持输入捕获,输出比较,产生PWM信号控制电机和电源管理。通用定时器L0计数器是16位无符号计数器。通用定时器L0是可编程的,可以被用来计数,其外部事件可以驱动其他定时器。定时器和定时器之间是相互独立,但是他们可以被同步在一起形成一个更大的定时器,这些定时器的计数器一致地增加。总之就是,一,先确定使用哪一个定时器
GD32篇 记录
一、GD32开发版程序设置读保护,防止程序被读取
二、GD32TIMER输出PWM
文章目录
- [GD32篇 记录](https://blog.csdn.net/qq_41930631/category_12031278.html)
- 前言
- 一、GD32F103 的TIMER特点
- 二、通用定时器 L0(TIMERx, x=1,2,3,4)
- 三、输出比较模式
-
- 配置步骤如下:
-
- timer_enable(TIMER1);
- timer_auto_reload_shadow_enable(TIMER1);
- timer_channel_output_config(TIMER1,TIMER_CH_1,&timer_ocintpara);//选择通道1
- timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1,500 );// 设置占空比50%
- timer_channel_output_mode_config(TIMER1,TIMER_CH_1,TIMER_OC_MODE_PWM0);
- timer_channel_output_shadow_config(TIMER1,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE);
- 四、总结
前言
一、GD32F103 的TIMER特点
可以在中文手册里面找到相关的资料
二、通用定时器 L0(TIMERx, x=1,2,3,4)
简介
通用定时器L0(定时器1/2/3/4)是4通道定时器,支持输入捕获,输出比较,产生PWM信号控
制电机和电源管理。通用定时器L0计数器是16位无符号计数器。
通用定时器L0是可编程的,可以被用来计数,其外部事件可以驱动其他定时器。
定时器和定时器之间是相互独立,但是他们可以被同步在一起形成一个更大的定时器,这些定
时器的计数器一致地增加。
2.主要特征
总通道数:4; 计数器宽度:16位;
时钟源可选:内部时钟,内部触发,外部输入,外部触发;
多种计数模式:向上计数,向下计数和中央对齐计数;
正交编码器接口:被用来追踪运动和分辨旋转方向和位置;
霍尔传感器接口:用来做三相电机控制;
可编程的预分频器:16位,运行时可以被改变;
每个通道可配置:输入捕获模式,输出比较模式,可编程的PWM模式,单脉冲模式;
自动重装载功能;
中断输出和DMA请求:更新事件,触发事件,比较/捕获事件;
多个定时器的菊型链接使得一个定时器可以同时启动多个定时器;
定时器的同步允许被选择的定时器在同一个时钟周期开始计数;
定时器主/从模式控制器。
三、输出比较模式
在输出比较模式,TIMERx可以产生时控脉冲,其位置,极性,持续时间和频率都是可编程的。
当一个输出通道的CxCV寄存器与计数器的值匹配时,根据CHxCOMCTL的配置,这个通道的
输出可以被置高电平,被置低电平或者反转。当计数器的值与CxCV寄存器的值匹配时,CHxIF
位被置1,如果CHxIE = 1则会产生中断,如果CxCDE=1则会产生DMA请求。
配置步骤如下:
第一步:时钟配置:
配置定时器时钟源,预分频器等。
第二步:比较模式配置:
设置CHxCOMSEN位来配置输出比较影子寄存器;
设置CHxCOMCTL位来配置输出模式(置高电平/置低电平/反转);
设置CHxP/CHxNP位来选择有效电平的极性;
设置CHxEN使能输出。
第三步:通过CHxIE/CxCDE位配置中断/DMA请求使能。
第四步:通过TIMERx_CAR寄存器和TIMERx_CHxCV寄存器配置输出比较时基:
CxCV可以在运行时根据你所期望的波形而改变。
第五步:设置CEN位使能定时器。
代码如下:
void timer_config(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_AF);
/*Configure PA1 PA2 PA3(TIMER1 CH1 CH2 CH3) as alternate function*/
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1);
timer_oc_parameter_struct timer_ocintpara;
timer_parameter_struct timer_initpara;
rcu_periph_clock_enable(RCU_TIMER1);
timer_deinit(TIMER1);
/* TIMER1 configuration */
timer_initpara.prescaler = 107; //预分频 108M / 107 + 1 = 1M
timer_initpara.alignedmode = TIMER_COUNTER_EDGE; //无中央对齐计数模式(边沿对齐模式),DIR位指定了计数方向
timer_initpara.counterdirection = TIMER_COUNTER_UP; //向上计数
timer_initpara.period = 1000; // 1M / 1000 = 1000Hz
timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
timer_initpara.repetitioncounter = 0;
timer_init(TIMER1,&timer_initpara);
/* CH1,CH2 and CH3 configuration in PWM mode1 */
timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
timer_channel_output_config(TIMER1,TIMER_CH_1,&timer_ocintpara);//选择通道1
/* CH1 configuration in PWM mode1,duty cycle 25% */
timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1,500 );// 设置占空比50%
timer_channel_output_mode_config(TIMER1,TIMER_CH_1,TIMER_OC_MODE_PWM0);
timer_channel_output_shadow_config(TIMER1,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE);
/* auto-reload preload enable */
timer_auto_reload_shadow_enable(TIMER1);
/* auto-reload preload enable */
timer_enable(TIMER1);
}
int main(void)
{
timer_config();
while (1);
}
几个用到的函数说明
timer_enable(TIMER1);
timer_auto_reload_shadow_enable(TIMER1);
timer_channel_output_config(TIMER1,TIMER_CH_1,&timer_ocintpara);//选择通道1
timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1,500 );// 设置占空比50%
timer_channel_output_mode_config(TIMER1,TIMER_CH_1,TIMER_OC_MODE_PWM0);
timer_channel_output_shadow_config(TIMER1,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE);
四、总结
总之就是,
一,先确定使用哪一个定时器,哪一个通道
二、去找到定时器对应的GPIO
三、设置定时器的参数,预分频系数,周期,向上向下计数等等
四、选择通道输出
五、选择输出比较值,即占空比
六、使能定时器
七、在主函数调用定时器初始化函数
更多推荐
所有评论(0)