1.基本定时器
1.1概述
基本定时器 TIM6 和 TIM7 包含一个16 位自动重载递增计数器,该计数器由可编程预分频器驱动。此类定时器不仅可用作通用定时器以生成时基,还可以专门用于驱动数模转换器 (DAC)。实际上,此类定时器内部连接到DAC 并能够通过其触发输出驱动DAC。
1.2特征
① 16 位自动重载递增计数器
② 16 位可编程预分频器,用于对计数器时钟频率进行分频,分频系数介于 1 和 65536 之间
③ 用于触发 DAC 的同步电路
④ 发生如下更新事件时会生成中断/DMA 请求:计数器上溢
1.3时基单元
计数器寄存器:用来对脉冲信号进行计数的,可以从零开始计数,也可以自行设定从几开始,计数到与自动重装载寄存器的值一致时,会产生溢出更新。
预分频寄存器:对系统时钟频率进行分频。例如:预分频系数是X,则对系统时钟频率进行x+1分频,也就是说每x+1个脉冲,计数器加一
自动重装载寄存器:设置计数器计数的上限值,也就是设置定时周期
2.寄存器(stm32f4xx)
2.1 控制寄存器1 (TIMx_CR1)
![](https://i-blog.csdnimg.cn/blog_migrate/d40651ecd39816ea47a63887116ab1ba.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b1eaa21d7089b8fe20c82db55693f012.png)
![](https://i-blog.csdnimg.cn/blog_migrate/97aaaa061a7cd30373c377ee08490198.png)
寄存器作用:
【7】:用来选择是否使用ARR的影子寄存器
0:自动重载预装载寄存器没有影子功能(不存在影子寄存器),相当于二者重叠。
1:自动重载预装载寄出去启动影子功能(存在影子寄存器)。
【3】:单脉冲模式
0:计数器在发生更新事件时不会停止计数(循环计数)
1:计数器在发生下一更新事件时停止计数(将 CEN 位清零)(单次计数)
【2】:更新请求源 (Update request source)
此位由软件置 1 和清零,用以选择 UEV 事件源。
0:使能时,所有以下事件都会生成更新中断或 DMA 请求。此类事件包括:
—计数器上溢/下溢
—将 UG 位置 1
—通过从模式控制器生成的更新事件
1:使能时,只有计数器上溢/下溢会生成更新中断或 DMA 请求。
选择哪种事件会引起更新
【1】:更新禁止 (Update disable)
1:禁止更新 0:允许更新
【0】:计数器使能位
1:开启计数器
0:关闭计数器
注意:第0位(使能位)要在所有的设置进行完毕之后再开启
2.2状态寄存器(TIMx_SR)
![](https://i-blog.csdnimg.cn/blog_migrate/bb8cd578713da0d3a0f03caff9b6366d.png)
用来查看事件有没有发生,由硬件自动置一,但需要手动(软件)清零
2.3事件生成寄存器 (TIMx_EGR)
![](https://i-blog.csdnimg.cn/blog_migrate/2f547cd46301652af8dfb462016d7463.png)
手动产生更新事件
2.4计数器 (TIMx_CNT)
![](https://i-blog.csdnimg.cn/blog_migrate/83e7e9c27b51afec0172946e1e98e8fd.png)
用来对系统时钟脉冲计数,到计的数到达上限,会重新归零并产生更新事件,16位计数器,计数范围:0~65535。
2.5预分频器 (TIMx_PSC)
![](https://i-blog.csdnimg.cn/blog_migrate/02ab03f4e2e8de65c221f445c7c0e5ca.png)
用来对时钟频率进行分频,使计数器在PSC+1个脉冲下计一次数,分频值范围:1~65536。
2.6 自动重载寄存器 (TIMx_ARR)
![](https://i-blog.csdnimg.cn/blog_migrate/e60057b22dddff8635b9891efb285c59.png)
用来设置计数器计数的上限值,ARR的值为0时,计数器不工作。
3.编程
3.1寄存器
void Time_6_Init(u16 psc,u16 arr)
{
//1、开启定时6的时钟
RCC->APB1ENR |= 1 << 4;
//2、配置定时器工作模式
TIM6->CR1 &= ~(1 << 7);//自动重装载寄存器与影子寄存器合二为一
TIM6->CR1 &= ~(1 << 3);//使用循环计数
TIM6->CR1 &= ~(1 << 2);//配置更新请求源
TIM6->CR1 &= ~(1 << 1);//允许更新
//3、配置时基单元
TIM6->CNT = 0; //从零开始计数
TIM6->PSC = psc - 1; //设置预分频系数
TIM6->ARR = arr; //设置上限值
//4、手动更新
TIM6->EGR |= 1 << 0; //此位硬件自动清零
//5、清除状态寄存器的值
TIM6->SR &= ~(1 << 0);
//6、开启计数器
TIM6->CR1 |= 1 << 0;
//7、等待状态寄存器为1
while((TIM6->SR & (1 << 0)) == 0);
//8、关闭计数器
TIM6->CR1 &= ~(1 << 0);
}
3.2库函数
void Tim4_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/*1.开时钟TIM6*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
/*2.配置定时器工作模式*/
TIM_ARRPreloadConfig(TIM6,ENABLE); //自动重装载寄存器和影子不合二为一
TIM_SelectOnePulseMode(TIM6,TIM_OPMode_Repetitive); //使用循环计数
TIM_UpdateRequestConfig(TIM6,TIM_UpdateSource_Global); //允许所有的更新请求源
TIM_UpdateDisableConfig(TIM6,DISABLE); //允许更新
/*3.配置时基单元*/
TIM_TimeBaseStructure.TIM_Period = arr; //设置上限值(重装载值)
TIM_TimeBaseStructure.TIM_Prescaler = per; //设置预分频系数
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);
/*4.手动更新*/
TIM_GenerateEvent(TIM6,TIM_EventSource_Update);
/*5.清除更新标志位*/
TIM_ClearFlag(TIM6,TIM_FLAG_Update);
TIM_SetCounter(TIM6,0); //清空计数器
/*6.开启定时器计数器*/
TIM_Cmd(TIM6,ENABLE);
}