目录
定时器:基本,通用
一,基本定时器:
作用:
● 16位自动重装载累加计数器
● 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值
分频
● 触发DAC的同步电路
● 在更新事件(计数器溢出)时产生中断/DMA请求
结构图:
timxclk一般为72M沿着线路先到达预分频处(TIMx_CNT)
预分频:(16位,所以max:65535),设置为0即72/(0+1)以此类推。
分屏完到达计数器处:(16位,所以max:65535)(TIMx_CNT)
计数器:遇到一个上升沿加一:加到固定值触发后面波浪箭头(固定值自己设置:自动重装载寄存器(TIMx_ARR):16位)
我们简单算一下最大计数时间。频率f=72MHZ/(预分频值*重装载值)
time=1/f 只要f取最小即可。最后f=53.6523235s左右。
一个定时器还可以做另一个定时器输入。所以三个定时器几乎可以定时8000年。
我们简单讲一下这个至DAC;这里可以设置一个主模式。把最下面那个事件映射到TRGO.这样我们就不需要频繁使用中断。它可以自动运行、
二、通用定时器:
作用:
●包含所有基本定时器功能。
● 4个独立通道:
─输入捕获
─输出比较
─PWM生成(边缘或中间对齐模式)
─单脉冲模式输出
● 使用外部信号控制定时器和定时器互连的同步电路
● 如下事件发生时产生中断/DMA:
─更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
─触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
─输入捕获
─输出比较
● 支持针对定位的增量(正交)编码器和霍尔传感器电路
● 触发输入作为外部时钟或者按周期的电流管
结构图:
将这幅图分为三部分:基本定时器图上,基本定时器图下,基本定时器。
基本定时器图上:可以简单理解为产生时钟的部分:复杂的线路不过是不同不同方式的提供时钟方式。
基本定时器前面已讲。
基本定时器图下:输出捕获,输入捕获。
三、代码分析:
定时时间计算方式:time = ((arr+1)*(psc+1))/clk ;
clk:定时器的输入时钟频率(单位MHZ)time:定时器溢出时间(单位为us)
令arr=4999;psc:7199所以time = ((4999+1)×(7199+1))/72 = 500000us = 500ms .
1、选择时钟
以TIM3为例,打开TIM3时钟。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
选择时基单元时钟。这有很多选项我们选择对应内部时钟。(默认)可以不写,但如果选择其他路就要写。
TIM_InternalclockConfig(TIM2);
2、配置时基单元
把这些设置为一个结构体,然后配置。其中TIM_TimeBaseStructure.TIM_ClockDivision = 0; 和滤波有关随意设置。
得到代码:
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ClearFlag(TIM3,TIM_FLAG_Updata);//TIM_TimeBaseInit会导致中断标志位为1,为了更准确我们清除它。
3、产生中断
即图中UI那个箭头。
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;//中断源
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级分组(只能分组一次建议放到主函数)
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;//子优先级,响应优先级。
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能,失能
NVIC_Init(&NVIC_InitStruct);
4、使用定时器
TIM_Cmd(TIM3,ENABLETIM_Cmd(TIM3,ENABLE););
注:常用函数