STM32基本定时器

       基本定时器 TIM6 和 TIM7 包含一个 16 位(0~65535)自动重载计数器,该计数器由可编程预分频器驱动。此类定时器不仅可用作通用定时器以生成时基, 还可以专门用于驱动数模转换器 (DAC)。实际上,此类定时器内部连接到 DAC 并能够通过其触发输出驱动 DAC。        这些定时器彼此完全独立,不共享任何资源。

        预分频器寄存器与自动重载寄存器都有一个阴影部分-------影子寄存器

        影子寄存器看不见摸不着、但是值真正起作用的就是影子寄存器、代码运行例如真正的psc为多少,不是由psc寄存器决定的、由psc影子寄存器决定的、影子寄存器的值是多少、真正的分频比就是多少

        影子寄存器的值由psc寄存器(上层寄存器)加载的(产生上溢/下溢更新时才能加载)

Psc一定有影子寄存器、arr可有可无(可软件选择)

 Arr无arr无影子寄存器(缓冲区)的时序图

arr有影子寄存器(缓冲区)的时序图

        没有影子重载寄存器的话,计数器寄存器会立刻变值,而有影子重载寄存器,计数寄存器的值会到下一个更新中断才会改变

做一个us延时函数(中断方式)---TIM6

代码流程:

  1. 打开时钟
  2. 更新禁止(可无)
  3. 更新请求源
  4. 单脉冲
  5. Arr不缓冲
  6. 中断使能
  7. 配置时基单元(cnt psc arr)
  8. 使能
  9. 配置优先级
  10. 写中断服务函数
  11. 延时函数

 

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

### STM32 基本定时器使用方法与原理 STM32基本定时器(Basic Timer),也称为 TIM6TIM7,在内部结构上较为简单,主要用于时间测量和产生延时功能。这类定时器不具备输入捕获、输出比较等功能。 #### 定时器工作模式 基本定时器通过计数预装载寄存器中的数值来实现定时操作。当计数器达到自动重装载寄存器中设定的最大值时,会产生更新事件并重新从0开始计数[^1]。 ```c // 初始化TIM6作为基本定时器 void MX_TIM6_Init(void) { __HAL_RCC_TIM6_CLK_ENABLE(); // 使能TIM6时钟 TIM_HandleTypeDef htim6; htim6.Instance = TIM6; htim6.Init.Period = 999; // 自动重装载值设置为999 htim6.Init.Prescaler = 8399; // 预分频系数设为8399, 即APB1频率除以8400 htim6.Init.ClockDivision = 0; htim6.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_Base_Init(&htim6); // 初始化定时器基类成员函数 } ``` 上述代码配置了一个基于向上计数模式的定时器实例 `htim6` ,其中 Period 参数决定了定时周期长度;Prescaler 则用于调整实际的工作频率。 #### 中断处理机制 为了响应定时溢出中断请求,需编写相应的回调服务程序: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM6){ /* 用户自定义的功能 */ } } /* 在启动文件内声明弱函数覆盖默认版本 */ __weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){} ``` 每当发生一次满量程溢出后就会触发该ISR入口点执行特定任务逻辑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值