STM32 进阶 定时器 2基本定时器 基本定时器中断案例:LED闪烁

发布于:2024-12-06 ⋅ 阅读:(33) ⋅ 点赞:(0)

基本定时器

基本定时器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)
	{
	}
		
}