基本定时器的功能很少,很容易配置一下是官方的功能解释:
TIM6 和 TIM7 的主要特性
基本定时器( TIM6 和 TIM7)的特性包括:
● 16 位自动重载递增计数器
● 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数
介于 1 和 65536 之间
● 用于触发 DAC 的同步电路
● 发生如下更新事件时会生成中断/DMA 请求:计数器上溢
个人认为就两个功能:1.定时功能 2.触发DAC的同步电路
下面我们来一起配置 定时器功能
用寄存器的方法来配置的
因为该基本定时器的寄存器少 我的思路是
先看如图:
再看如图:
由最下面的望上看
ARR配置 自动重装置寄存器
PSC配置 预分频
CNT不用看了 这个事定时器看启后 自动计算的值
EGR只有一位UG要在开启定时器使能位 的前一行代码 写UG = 1 图上写了要让CNT从零开始计数
SR 状态位 基本定时器是向上计数的 到达预定的ARR会产生溢出 这个位就会被置一
DIER 中UDE位 不配置 DMA有关的 我不需要
UIE位 更新中断使能 我配置的需要中断 使能这个位 写1
CR2 这个配置无关与 这个寄存器TRGO有关的。
CR1 CEN 位置一 计数器开始计数
UDIS这个是与URS一起用的 (调试发现的道理)UDIS配置为1 URS无论配置什么都不会让SR值一 我们需要用到中断 需要配置URS让它置零
URS 看手册发现 0/1都可以使用 我不想使用太多功能了 让URS置一 计数器溢出就会产生SR中断标志位。
OPM 0 发生更新事件 计数器还在一直计数 比如 0到255 到了255发生更新事件如果配置了中断 则进入中断服务函数。进入后计数器CNT 不会停止会继续从0开始计算到255
这里我采用的是1 发生更新事件时候 停止计数,不会影响到我后续使用中断的担忧。
担忧是 如果中断服务函数运行时间需要5us 但是我定时器2us发生一次更新事件 就会出现崩溃。
ARPE 0不进行缓冲 1进行缓冲 理解的意思 在CNT里面的值一直与影子寄存器的值判断 (影子寄存器的值来源于ARR)如果是缓冲的话 重新ARR的值不会立即进入到影子寄存器中,他还是会与以前的ARR写入到的影子值一样,不缓冲的话 重新写入的ARR的值立即会进入到影子寄存器中。
下面是代码
/*
函数功能:初始化基本定时器6
函数参数:无
函数返回值:无
函数描述:无
*/
void DingShi6Init(unsigned short int PSC,unsigned short int ARR)
{
NVIC_SetPriority(TIM6_DAC_IRQn,NVIC_EncodePriority(TIM6_DAC_IRQn,3,3)); //中断配置 抢占优先级3 响应优先级3级
NVIC_EnableIRQ(TIM6_DAC_IRQn); //使能中断
RCC->APB1ENR |= (0X01 << 4); //时钟源使能
TIM6->PSC = PSC - 1; //-1这个看手册 有解释的
TIM6->ARR = ARR - 1; //-1 也是需要看手册
TIM6->DIER |= (0X01 << 0); //中断使能
TIM6->CR1 |= (0X01 << 3) | (0X01 << 2); //不缓冲模式 OPM置一 URS置一 更新请求源选择 UDIS 0 更新开启
TIM6->EGR |= (0x01 << 0); //开启前更新一下 CNT的值 让它运行前为0
TIM6->CR1 |= (0X01 << 0); //开启定时器计数
}
#include "usart.h"
void TIM6_DAC_IRQHandler(void)
{
if((TIM6->SR & (0X01 << 0)))
{
TIM6->SR &= ~(0x01 << 0);
printf("123\r\n"); //如果没有串口初始化的 可以用灯亮灭来反应
TIM6->CR1 |= (0X01 << 0);
}
}