当前位置:   article > 正文

9.STM32CubeIDE基本定时器实验_stm32cube tim

stm32cube tim


前言

使用STM32CubeIDE实现基本定时器实验。
硬件:STM32F103C8T6最小系统板 + 自制扩展板
软件:STM32CubeIDE


一、实验目的

使用基本定时器的更新中断,LED1用于指示定时器发生更新事件的频率,每500ms状态翻转。

二、学习内容

  1. 学习基本定时器的使用
  2. 学习如何确定计数器的工作频率

三、实践操作

定时器概述

软件定时原理

使用纯软件( CPU死等 )的方式实现定时( 延时 )功能,具有延时不精准、CPU死等的缺点
WWDG( Windows Watchdog ),窗口看门狗。

定时器定时原理

使用精准的时钟源,通过硬件的方式,实现定时功能,核心就是计数器。
定时器定时原理

STM32定时器分类

  1. 专用定时器:独立看门狗(IWDG)、窗口看门狗(WWDG)、定时时钟(RTC)、低功耗定时器;
  2. 内核定时器:SysTick定时器(滴答定时器)
  3. 常规定时器:基本定时器、通用定时器、高级定时器
    基本定时器:没有输入输出通道,常用作时基,即定时功能
    通用定时器:具有多路独立通道,可用于输入捕获/输出比较,也可用作时基
    高级定时器:除具备通用定时器所有功能外,还具备带死区控制的互补信号输出刹车输入等功能( 可用于电机控制、数字电源设计等 )

基本定时器

基本定时器简介

STM32F1中,基本定时器为TIM6和TIM7( STM32F103C8T6没有 );
主要特征

  1. 16位递增计数器( 计数值:0~65535 );
  2. 16位预分频器( 分频系数:1~65536 );
  3. 可用于触发DAC;
  4. 在更新事件(计数器溢出)时,会产生中断/DMA请求。

只能递增

基本定时器框图基本定时器框图

可以看出,基本定时器的时钟来源为内部时钟( CK_INT ),溢出条件为CNT == ARR(影子),只有递增计数模式。
其中影子寄存器才是真正起作用的寄存器,但不能直接访问。

计数模式与溢出条件
计数模式

计数器模式溢出条件
递增计数模式(向上)CNT == ARR
递减计数模式(向下)CNT == 0
中心对齐模式CNT == ARR - 1,CNT == 1

定时器溢出时间计算

溢出时间计算
其中:
Tout 为定时器溢出时间
Ft 为定时器的时钟源频率( 未分频 )
ARR 为自动重装载寄存器的值
PSC 为预分频寄存器的值
可以这样来看这个公式:

计数频率这个是计数频率;
记一个数的时间这个是计一个数的时间,频率的倒数;
计这么多数这个是要计这么多数;
因此可以理解为一个数的时间 × 个数 = 总时间

3.硬件介绍

硬件:STM32F103C8T6最小系统板 + 自制扩展板

实物图如下图所示:
实物图
LED1 -> PB3

4.软件介绍

首先新建工程并进行初始化配置

在此不进行赘述,详细步骤可移步至之前文章。

与之前文章不同的是,根据预设条件:溢出时间(Tout)为500ms,定时器的时钟源频率(Ft)为72MHz,因此可设定(PSC+1)= 7200,(ARR+1)= 2500,从而实现溢出时间(Tout)为500ms。
配置TIM4(没有基本定时器,用通用定时器实现),如下图所示:配置TIM4
其中 auto-reload precload 为自动重装载的预装载:

  1. auto-reload precload = Disable:自动重装载寄存器写入新值后,计数器立即产生计数溢出,然后开始新的计数周期;
  2. auto-reload precload = Enable:自动重装载寄存器写入新值后,计数器完成当前旧的计数后,再开始新的计数周期。

由于是定时器溢出之后是产生中断,因此需要使能定时器中断中断

接下来进行基本定时器实验的代码编程

主要是对定时器中断回调函数void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)进行定义:

/* 定时器中断回调函数 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	/* TIM4发生中断 */
	if(htim->Instance == TIM4)				//判断是否是TIM4发生中断
	{
		LED1_TOGGLE();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

可放在main.c中,也可以放在tim.c中。

其次,要在int main()中,使能更新中断并启动定时器,否则定时器都不工作:

HAL_TIM_Base_Start_IT(&htim4);					//使能更新中断并启动定时器
  • 1

代码很简单,旨在了解定时器的定时功能。
实验现象:LED1每500ms翻转一次状态,也可以通过示波器看到IO的波形变化。
示波器
可以看出,IO电平变化间隔为500ms。


总结

本篇介绍了如何实现一个基本定时器实验,分别从硬件方面与软件方面阐述,在硬件方面主要介绍了硬件组成,在软件方面主要介绍了通过定时器中断,实现让LED1每500ms翻转一次状态!

这是定时器的最基本的功能,时基功能!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/739190
推荐阅读
相关标签
  

闽ICP备14008679号