基本定时器
基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。
这2个定时器是互相独立的,不共享任何资源。
这个2个基本定时器只能向上计数,由于没有外部IO,所以只能计时,不能对外部脉冲进行计数。
功能:没有外部引脚只能用来计时, 定时中断,主模式,触发DAC。
框图
只有一种时钟源:内部时钟(不是RC电路),一般为72MHz
触发控制器:
时基单元:-预分频器
预分频器可以按1~65536之间的任意值分频。
PSC预分频寄存器 自动重装载寄存器包含预加载寄存器和影子寄存器(工作时用的),整套机制叫预装载机制。 计数器寄存器
基本定时器相关寄存器
首先计算预分频之后的的时钟频率:
CR1控制寄存器:
ARPE自动重装载预装载使能
UG = 0:表示可以手动通过软件触发中断
UDIS:UEN使能,无法将值装入移位寄存器
RCC寄存器
时钟
PSC寄存器:
计数器的时钟频率的算法
ARR寄存器:
计数器自动重装载值
DIER寄存器:DMA and Interrupt enable register
UIE:更新中断使能。
SR寄存器:状态寄存器
UIF:更新中断标志位
EGR事件产生寄存器
为1 手动触发一次中断
CNT计数器寄存器
硬件保存值的临时空间
RSC预分频器寄存器
基本定时器中断案例:LED闪烁
tim6.c
#include "tim6.h"
void Tim6_Init(void){
//1.方时钟
RCC->APB1ENR |= RCC_APB1ENR_TIM6EN;
//2.开中断使能
TIM6->DIER |= TIM_DIER_UIE;
//3. 100us 主频 72M /s(7200) = 10000 = 10 k 1/10ms = 100us
TIM6->PSC = 7200 - 1;
//4.数10000次,要注意-1 也就是1秒触发一次
TIM6->ARR = 10000 - 1;
//-1.开启计时器的使能
TIM6->CR1 |= TIM_CR1_CEN;
//NVIC使能位
//分组
NVIC_SetPriorityGrouping(3);
//设置优先级
NVIC_SetPriority(TIM6_IRQn,2);
//开使能
NVIC_EnableIRQ(TIM6_IRQn);
}
void TIM6_IRQHandler (void){
//凡是片上外设的中断需要清空标志位
TIM6->SR =~ TIM_SR_UIF;
//2.直接翻转
LED_Toggle(LED2);
}
tim6.h
#ifndef __TIM6_H__
#define __TIM6_H__
#include "stm32f10x.h"
#include "led.h"
void Tim6_Init(void);
#endif /* __TIM6_H__ */
main.c
#include "usart1.h"
#include "string.h"
#include <stdio.h>
#include "m24c02.h"
#include "i2c.h"
#include "led.h"
#include "systick.h"
#include "tim6.h"
int main(void){
Usart1_Init();
LED_Init();
Tim6_Init();
while (1)
{
}
}