基于STM32F4XX的基本定时器6,7寄存器方法配置

基本定时器的功能很少,很容易配置一下是官方的功能解释:

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);
	}
}

猜你喜欢

转载自blog.csdn.net/longjintao1/article/details/125911647