【嵌入式———基本定时器TIM6基本操作——实验需求:使用系统嘀嗒定时器,每隔1s让LED1灯闪烁一次】】
基本定时器
16位,只能向上计数,递增,没有外部I/O
定时中断,主模式下,触发DAC
时机单元:
PSC——预分频器(需减一)
自动重装载寄存器_比较(实际有两个寄存器,影子寄存器/预加载寄存器)
CNT——计数器——溢出重置
updata更新时间
UI更新中断
触发控制器——复位,使能,计数
TRGO——输出触发信号(可触发DAC模块——也就是可以连接一些外设)
时钟源 :内部时钟,一般为72MHZ
自增到自动重装载寄存器值时,下一个时钟上升沿到来后,计数产生溢出,从0重新计数,并产生更新事件,(需减一)
预加载器可以打开可以关闭(关闭就是立即更新),寄存器CR1的ARPE
计算定时时间:
多久产生一次更新事件:
预分频+1表示真正的分频
1.计数器时钟频率:内部时钟频率 72M / 预分频系数+1 ,7199 =10000HZ
2.计数器周期:计数值频率,倒数(0.1毫秒,100微秒)
3.计数器累加多少次产生一次更新事件?自动重装载值+1
4.定时时间:(预分频系数+1/内部时钟)*自动重装载值+1
使用基本定时器,实现LED灯闪烁——与上一篇文章一样的需求
LED2_PA1_低电平有效
寄存器介绍:
1.开启时种APB1ENR_TIM6
2.预分频寄存器,减一操作,1s操作
在tim.h中编写
#ifndef __TIM6_H
#define __TIM6_H#include "stm32f10x.h"void TIM6_Init(void);#endif
在tim.c中编写——基本定时器TIM6
#include "tim6.h"
#include "led.h"void TIM6_Init(void)
{// 1. 开启时钟,APB1总线外设时钟寄存器RCC->APB1ENR |= RCC_APB1ENR_TIM6EN;// 2. 设置预分频值7199,做7200分频,得到 10000Hz/S,与系统嘀嗒不一样,16位最大值65535TIM6->PSC = 7199;// 3. 设置自动重装载值9999,表示计数10000次产生一个UEVTIM6->ARR = 9999;// 4. 更新中断使能D-DMATIM6->DIER |= TIM_DIER_UIE;// 5. NVIC配置NVIC_SetPriorityGrouping(3);NVIC_SetPriority(TIM6_IRQn, 2);NVIC_EnableIRQ(TIM6_IRQn);// 6. 开启定时器TIM6->CR1 |= TIM_CR1_CEN;
}// 中断服务程序
void TIM6_IRQHandler(void)
{// 清除中断标志位TIM6->SR &= ~TIM_SR_UIF;// 翻转LED2LED_Toggle(LED2);
}
在main.c中编写
#include "usart.h"
#include "led.h"
#include "tim6.h"int main(void)
{// 初始化USART_Init();LED_Init();TIM6_Init();while(1){}
}
TIM6和TIM7控制器CR1:
ARPE:自动重装载预装载使能
CEN计数器使能
TIM6和TIM7控制器CR2:
MMS:主模式选择
TIM6和TIM7控制器DIER:
UDE:更新DMA请求使能
UIE:更新中断使能
TIM6和TIM7控制器SR:
UIF:更新中断标志,硬件在更新中断时设置该位,它由硬件清除。
TIM6和TIM7控制器EGR:
UG:产生更新事件,更新所有的寄存器
TIM6和TIM7控制器CR2: