赞
踩
定时器分为普通和高级定时器 他们最大的区别就是在结构体参数的配置上
普通少了一个参数 他们的计算范围都差不多一样 也就是 2的16次方 0-65535
定时器适用的场合
用于测量输入脉冲宽度 (输入捕获)或者是测 产生输出波形(输出比较)
每个定时器都是独立的 没有任何共享资源
计数寄存器 (TIMx_CNT)
自动装载值寄存器 (TIMx_ARR)
预分频系数寄存器 (TIMx_PSC)
计数 器
计算定时器的时间 很好理解
自动装载值
自动装载就是预先装载好的 也就是设定好的值 每一次到了某个设定的值
定时器就会清零 并且发生一次溢出事件。
这个元素和 计数值 差不多意思 在字面意思 看出 只不过他是可以自动装载的
也就是 可以变化 他们存放的地址都是一样的。
预分频系数
在我们预分频如果是为1 倍频是不起作用的,如果想加快计算频率 必须改变预分频系数
可以看出 他们的计算频率明显加快了
占空比就是整个周期高电平占的比列
IO配置的主要的三大组成部分
1 定义结构体
2 RCC :对应的时钟使能
3 GPIO :配置 对应定时通道的 IO 3 又细分了 三部分
{
1 模式
2 io
3 频率
}
4 INIT :初始化 GPIOx
定时器
1 结构体定义
2 RCC:对应的时钟使能
3 TIM 配置 (普通定时器 除了TIM1 TIM8)
{
1 模式 TIM_CounterMode
2 时钟分割线 TIM_ClockDivision
3 自动装载值 TIM_Period
4 预分频系数 TIM_Prescaler
5 TIM_RepetitionCounter (5 是高级定时器 普通定时器不用配置)
/*****************************************************
6 使能放在最后面 TIM_Cmd(TIM2, ENABLE);
**************************************************/
}
定时器配置注意
3 自动装载值 TIM_Period
4 预分频系数 TIM_Prescaler
特别注意 这个两个参数 不要 混乱了
4 预分频系数 TIM_Prescaler =0 预分频就是为0+1(因为从零开始算 ) 倍频不起作用
例如 TIM_Prescaler =1 我们的定时器是36mhz的 如果预分频是1+1 (TIM_Prescaler =1)倍频起到作用 即得到了 36*2MHZ的频率
再例如 TIM_Prescaler =2 我们的定时器是36mhz的 如果预分频是2+1 (TIM_Prescaler =2)倍频起到作用 也是得到了 36*2M HZ的频率
再例如 TIM_Prescaler =3 我们的定时器是36mhz的 如果预分频是3+1 (TIM_Prescaler =3)倍频起到作用 也是得到了 36*2M HZ的频率
只要不为1 倍频就起作用 得到的频率是 之前的 两倍 (36*2 M HZ)
输出比较
输出模式 : 1 TIM_OCMode
单向输出使能 : 2TIM_OutputState
输出极性 : 3TIM_OCPolarity
使能自动装载值 : 4TIM_OC2PreloadConfig
初始化 : 5 TIM_OC2Init(x,&xxxxx);
可能会出现的问题
定时器使能不放在最后 假设定时器提前开了 就会导致 输出 模式 卡在后面了
也就是 我们把最重要的部分给忽略了
解决
最后把定时器使能放在最后面
6 TIM_Cmd(TIM2, ENABLE);
以PA1为例
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct; TIM_OCInitTypeDef TIM_OCInitstruct; GPIO_InitTypeDef GPIO_Initstruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); GPIO_Initstruct.GPIO_Pin=GPIO_Pin_1; //对应了TIM2_CH2 GPIO_Initstruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Initstruct.GPIO_Mode =GPIO_Mode_AF_PP;//复用推挽就行 GPIO_Init(GPIOA,&GPIO_Initstruct); TIM_TimeBaseInitstruct.TIM_Period=999; //自动装载值为0- 999 即1000 TIM_TimeBaseInitstruct.TIM_Prescaler=71;//预分频 71+1 TIM_TimeBaseInitstruct.TIM_CounterMode =TIM_CounterMode_Up;//向上计数 TIM_TimeBaseInitstruct.TIM_ClockDivision =TIM_CKD_DIV1;//时钟分割线 不分割 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitstruct);//初始化 TIM_OCInitstruct.TIM_OCMode =TIM_OCMode_PWM2; //输出pwm波形模式 TIM_OCInitstruct.TIM_OutputState=TIM_OutputState_Enable;//单向输出 使能 TIM_OCInitstruct.TIM_OCPolarity =TIM_OCPolarity_Low;//输出极性为低 TIM_OC2Init(TIM2,&TIM_OCInitstruct);//初始化 TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);//使能PSC TIM_Cmd(TIM2,ENABLE);//使能ARR
main.c
void main(){
LCD_Clear(White); //清屏为白色
LCD_SetBackColor(White);
LCD_SetTextColor(Blue); //字体为 蓝色
sprintf((unsigned char *)ccr2_buff,"CCR2:50% ");
LCD_DisplayStringLine(Line3,ccr2_buff);
TIM2->CCR2=500; //1 写法
// TIM_SetCompare2(TIM2,500);//2 写法
while(324);
}
输出 波形
补充定时器模式
向上计数模式 : 0-ARR 的过程中 到了ARR 就会自动清零 重新0开始 并且会产生溢出时间
ARR 就是 自动装载值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。