基本定时器 TIM6 和 TIM7 包含一个 16 位(0~65535)自动重载计数器,该计数器由可编程预分频器驱动。此类定时器不仅可用作通用定时器以生成时基, 还可以专门用于驱动数模转换器 (DAC)。实际上,此类定时器内部连接到 DAC 并能够通过其触发输出驱动 DAC。 这些定时器彼此完全独立,不共享任何资源。
预分频器寄存器与自动重载寄存器都有一个阴影部分-------影子寄存器
影子寄存器看不见摸不着、但是值真正起作用的就是影子寄存器、代码运行例如真正的psc为多少,不是由psc寄存器决定的、由psc影子寄存器决定的、影子寄存器的值是多少、真正的分频比就是多少
影子寄存器的值由psc寄存器(上层寄存器)加载的(产生上溢/下溢更新时才能加载)
Psc一定有影子寄存器、arr可有可无(可软件选择)
Arr无arr无影子寄存器(缓冲区)的时序图
arr有影子寄存器(缓冲区)的时序图
没有影子重载寄存器的话,计数器寄存器会立刻变值,而有影子重载寄存器,计数寄存器的值会到下一个更新中断才会改变
做一个us延时函数(中断方式)---TIM6
代码流程:
- 打开时钟
- 更新禁止(可无)
- 更新请求源
- 单脉冲
- Arr不缓冲
- 中断使能
- 配置时基单元(cnt psc arr)
- 使能
- 配置优先级
- 写中断服务函数
- 延时函数
RCC->APB1ENR|=(1<<4);//time6时钟
打开时钟
TIM6->CR1&=~(1<<1);
TIM6->CR1&=~(1<<2);
TIM6->CR1&=~(1<<3);
TIM6->CR1&=~(1<<7);//不进行缓存
更新禁止(可无)更新请求源/单脉冲/Arr不缓冲
TIM6->DIER|=(1<<0);//中断使能
中断使能
TIM6->CNT=0;//从0开始计数
TIM6->PSC=psc-1;
TIM6->ARR=arr-1;
TIM6->CR1|=(1<<0);//打开使能
配置时基单元(cnt psc arr)/使能
NVIC_SetPriority(TIM6_DAC_IRQn,4);//优先级 占先=1 次级=0
NVIC_EnableIRQ(TIM6_DAC_IRQn);//使能
配置优先级
u32 time6=0;
//中断服务函数
void TIM6_DAC_IRQHandler (void)
{
if(TIM6->SR& (1<<0))
{
TIM6->SR&=~(1<<0);
time6--;
}
}
写中断服务函数
//延时函数
void Time6_Us(u32 ustime)
{
time6=ustime;
while(time6);
}
延时函数
完整代码
/*
Function name:Time6_Config
Description:定时器6
param:psc-->分频值-1 arr-->重装载值-1
retval:None
Remarks:TIME6-->84MHz
*/
void Time6_Config(u32 psc,u32 arr)
{
RCC->APB1ENR|=(1<<4);//time6时钟
TIM6->CR1&=~(1<<1);
TIM6->CR1&=~(1<<2);
TIM6->CR1&=~(1<<3);
TIM6->CR1&=~(1<<7);//不进行缓存
TIM6->DIER|=(1<<0);//中断使能
TIM6->CNT=0;//从0开始计数
TIM6->PSC=psc-1;
TIM6->ARR=arr-1;
TIM6->CR1|=(1<<0);//打开使能
NVIC_SetPriority(TIM6_DAC_IRQn,4);//优先级 占先=1 次级=0
NVIC_EnableIRQ(TIM6_DAC_IRQn);//使能
}
u32 time6=0;
//中断服务函数
void TIM6_DAC_IRQHandler (void)
{
if(TIM6->SR& (1<<0))
{
TIM6->SR&=~(1<<0);
time6--;
}
}
//延时函数
void Time6_Us(u32 ustime)
{
time6=ustime;
while(time6);
}