STM32CubeMX——定时器之定时功能

功能实现:

  • 采用定时器实现LED灯的闪烁,周期为1S

准备工作:

  • 1、STM32开发板(我的是STM32F103VET6)
  • 2、STM32CubeMx软件、 IDE: Keil软件
  • 3、按键管脚 : PA0   PC13   
  • 4、LED管脚 : PB0   PB1   PB5 

定时器简介:

SMT32F1系列共有8个定时器:

  • 基本定时器(TIM6、TIM7)
  • 通用定时器(TIM2、TIM3、TIM4、TIM5)
  • 高级定时器(TIM1、TIM8)

SMT32F4系列共有15个定时器:

  • 基本定时器(TIM6、TIM7)
  • 通用定时器(TIM2、TIM3、TIM4、TIM5、TIM9~TIM14)
  • 高级定时器(TIM1、TIM8)

基本定时器功能(TIM6、TIM7):

  •  16位向上、向下、向上/下自动装载计数器
  •  16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
  • 触发DAC的同步电路 注:此项是TIM6/7独有功能.
  • 位于APB1总线上


通用定时器(TIM2~TIM5)的主要功能:

  •  16位向上、向下、向上/下自动装载计数器
  • 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
  • 4 个独立通道(TIMx_CH1~4)可以用作:
  •                   测量输入信号的脉冲长度( 输入捕获) 
  •                   输出比较
  •                   单脉冲模式输出 
  •                   PWM输出(边缘或中间对齐模式) 
  • 支持针对定位的增量(正交)编码器和霍尔传感器电路 
  • 如下事件发生时产生中断/DMA:
  •                更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) 
  •               触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) 
  •               输入捕获  
  •               输出比较  
  • 位于APB1总线上


高级定时器(TIM1,TIM8)的主要功能:

  • 高级定时器具有基本,通用定时器的所有的功能,
  • 还具有控制交直流电动机所有的功能,
  • 输出6路互补带死区的信号,刹车功能等等
  • 位于APB2总线上

总括:基本定时器就是单纯的定时计数器,通用定时器多了四个通道,相对应的增加了功能,高级定时器具有基本,通用定时器的所有的功能,并且添加了其他功能

 

定时器计数模式

通用定时器可以向上计数、向下计数、向上向下双向计数模式。

  • 向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
  • 向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
  • 中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

简单地理解三种计数模式,可以通过下面的图形:

 

计数时钟的选择

计数器时钟可由下列时钟源提供:

  • 内部时钟(TIMx_CLK) 
  • 外部时钟模式1:外部捕捉比较引脚(TIx)
  • 外部时钟模式2:外部引脚输入(TIMx_ETR) 仅适用TIM2,3,4
  • 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
     

新建工程

1.1 New Project

  • 1 搜索芯片型号
  • 2选择芯片
  • 3创建工程

 

1.2设置时钟源RCC  

  • 系统时钟源选择外部晶振时钟源

 

设置时钟

  • 设置倍频为4,则定时器的时钟源频率为32M,这个数值需要用到计算定时器的定时周期

 

1.3 设置GPIO

  1. 设置PB0和PB1为输出模式

 

设置定时器

使能T2中断

 

1选择TIM2

2定时器时钟选择内部时钟

    Clock Source(时钟来源)       

计数器设置:

  • Prtscaler (定时器预分频系数)  : 31999
  • Counter Mode(计数模式) :   Up(向上计数模式)                    
  • Counter Period(自动重装载值) :    499   
  • CKD(时钟分频因子) : No Division 不分频 (可以选择二分频和四分频   )
  • auto-reload-preload(自动重装载)  :    Enable 使能

定时器的定时周期

     T = (psc+1)(arr+1)/Tclk

  • psc 为定时器预分频系数
  • arr为自动重装载值
  • Tclk为系统时钟频率

通过计算

   T = (psc+1)(arr+1)/Tclk=(31999+1)(499+1)/32us=500ms

 

项目文件设置

  • 1 设置项目名称
  • 2 选择所用IDE

生成代码

  1. 为每个功能生成独立的.c和.h文件
  2. 生成代码

 

代码部分解析

找到main函数,里面关于TIM2初始化的函数 MX_TIM2_Init(),进入初始化函数,查看源码

 

 


TIM_HandleTypeDef htim2;

/* TIM2 init function */
void MX_TIM2_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 31999;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 499;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}

从上面代码可以看到,先定义了一个htim2的结构体

然后是对结构体的初始化,就是我们图形化的配置

再找到stm32f1xx_it.c文件

void TIM2_IRQHandler(void)
{
  /* USER CODE BEGIN TIM2_IRQn 0 */

  /* USER CODE END TIM2_IRQn 0 */
  HAL_TIM_IRQHandler(&htim2);
  /* USER CODE BEGIN TIM2_IRQn 1 */

  /* USER CODE END TIM2_IRQn 1 */
}

上面的代码是如果TIM2中断,则调用  HAL_TIM_IRQHandler(&htim2);

进入HAL_TIM_IRQHandler(&htim2)函数,这里面的代码很长,就是不同的中断类型,进入不同的中断回调函数,这里找到 HAL_TIM_PeriodElapsedCallback(htim);

 

进入这个回调函数,我们看到是个虚函数,需要我们重写,在这个函数里面,就是我们需要实现的功能,但在这之前,需要在main函数里使能中断 HAL_TIM_Base_Start_IT(&htim2)

main.c中的添加代码如下:

 

总结,对于定时器的定时中断,相对比较简单,绝大多数功能图形化配置已经为我们配置好了,我们做的只需两步

  1. 在main函数中,开启TIM2中断,HAL_TIM_Base_Start_IT(&htim2);
  2. 重写 HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 函数,然后在里面实现我们需要的功能

 

 

 

### STM32CubeMX定时器参数配置方法 #### 配置基础设置 在STM32CubeMX中启动项目并选择目标微控制器型号后,在“Pinout & Configuration”标签页下找到TIMx外设(其中x代表具体的定时器编号)。点击进入其配置界面。 对于希望实现的功能——即通过定时器触发ADC转换并通过DMA传输数据,需注意几个关键点: - **模式选择**:应将定时器工作于PWM输入、编码器接口或输出比较等模式之外;通常情况下,“计数器模式(EdgeAligned)”就足够满足需求[^1]。 - **时基单元(Base Timebase Unit)**:定义了定时周期的基础单位。这里要依据实际应用频率来调整预分频系数(PSC)以及自动重装载寄存器(ARR),从而达到期望的溢出间隔时间。例如,如果想要每毫秒发生一次事件,则可以根据系统核心时钟计算合适的PSC和ARR值。 ```c // 假定APB1/APB2时钟为84MHz, 要求定时时间为1ms htim->Instance = TIM2; htim->Init.Prescaler = (uint32_t)(SystemCoreClock / 1000000) - 1; // PSC=8399 -> 实际频率约为1KHz htim->Init.CounterMode = TIM_COUNTERMODE_UP; htim->Init.Period = 999U; // ARR=999 -> 计数值满溢出正好是1ms if (HAL_TIM_Base_Init(&htim) != HAL_OK){ Error_Handler(); } ``` #### 设置更新中断/回调函数 为了确保每次定时结束都能正确处理后续操作,比如发起新的ADC采样请求,应该使能相应的中断源或者注册回调函数。这一步骤可以在“NVIC Settings”页面完成,勾选对应定时器的全局中断选项即可。 #### 启动定时器与关联功能模块 最后,在主程序里调用`HAL_TIM_Base_Start_IT()`开启带中断服务例程的支持版本之后,还需要进一步初始化其他参与协作的部分,像本案例中的ADC通道及其对应的DMA流资源。务必保证这些组件之间相互协调一致,这样才能构建起稳定可靠的数据获取链路。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值