stm32 基本定时器最简单定时配置

本文详细介绍了STM32F4系列MCU中TIM3定时器的配置过程,包括如何确定定时器时钟源、预分频数和自动重载值等关键参数,以及中断设置和启动定时器的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MCU:stm32F4系列,用的是通用定时器TIM3

首先要知道的是TIM3 是挂载到APB1总线上的,这点详见STM32F417xx_datasheet-P.19,有个框图叫Device overview

而APB1 的时钟是多少呢?这个得看你自己配置的多少了,一般是在SetSysClock()函数里,我这儿是系统时钟的4分频,系统时钟这儿为168MHz,所以APB1上的时钟为42MHz,这儿不要以为TIM3的时钟就是42MHz了,因为APB1到TIM3还要经过一个倍频器,这个倍频器只有当前面系统时钟到APB1的分频系数不为1时才起作用,而我们前面说了APB1是系统时钟4分频得到的,故这儿倍频器生效,所以TIM3的时钟为APB1的倍频,即84MHz。

ok,得到了定时器的输入时钟,我们配置定时器的简单功能其实就只需要两个参数:预分频数和自动重载值
Tout = ((arr+1)*(psc+1))/Tclk;

其中arr就是自动重装值,psc为预分频值,Tclk就是定时器的时钟。比如我想要1s钟的定时器,就可以设定:arr =9999;psc=8399; 
这儿要注意下arr和psc的取值范围,前者是u32 的,后者是u16的。

NVIC_InitTypeDef NVIC_InitStructure;

  // TIM3 clock enable 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  // Enable the TIM3 gloabal Interrupt 
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x3;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  TIM_TimeBaseStructure.TIM_Period          = arr;
  TIM_TimeBaseStructure.TIM_Prescaler       = psc;
  TIM_TimeBaseStructure.TIM_ClockDivision   = 0;
  TIM_TimeBaseStructure.TIM_CounterMode     = TIM_CounterMode_Up;
  //向上计数模式,就是从0计数到arr,计数到arr时,产生一个TIM_IT_Update中断,还有其他中断可选

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  /* TIM Interrupts enable */
  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);

  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);

这样定时器就开始工作了,然后再写上中断处理函数,

void TIM3_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
        //your code
    }
}

至此,TIM3的定时功能就完成了,由psc和arr值,我们可以设定想要的定时时间。

### STM32 TIM6 基本定时器使用方法 对于STM32微控制器系列中的基本定时器TIM6,其主要功能在于提供一种简便的方式来进行时间间隔测量或是触发周期性事件。这类定时器特别适合于那些仅需简单计时而无需复杂波形生成功能的应用场景[^2]。 #### 配置过程概述 为了使能并配置TIM6定时器以实现特定的时间延迟或定期中断,在初始化阶段需要完成几个关键设置: - **启用外设时钟**:确保为TIM6提供了必要的时钟源。 - **设定预分频系数(PSC)**:决定输入频率降低的程度,影响最终的计数值更新速率。 - **加载自动重装载值(ARR)**:定义每次溢出前的最大计数值,即决定了延时期间长度。 - **启动定时器**:一旦所有参数都已正确配置,则可以通过软件指令来激活该定时器开始工作。 当这些准备工作完成后,就可以利用TIM6按照预定计划执行各种任务了,比如每隔一段时间产生一次中断请求IRQ,进而调用相应的服务程序ISR处理业务逻辑[^1]。 #### 示例代码展示 下面给出了一段基于C语言编写的简化版示例代码片段,展示了如何具体地去配置和应用STM32平台下的TIM6作为一秒间隔的定时装置: ```c #include "stm32f4xx_hal.h" // 定义全局变量用于存储定时器句柄 TIM_HandleTypeDef htim6; void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); // 初始化TIM6定时器 __HAL_RCC_TIM6_CLK_ENABLE(); // 启用TIM6时钟 htim6.Instance = TIM6; htim6.Init.Prescaler = (SystemCoreClock / 1000) - 1; // 设置预分频值使得计数频率为1KHz htim6.Init.CounterMode = TIM_COUNTERMODE_UP; htim6.Init.Period = 999; // 自动重载值对应1秒钟周期 if(HAL_TIM_Base_Init(&htim6)!= HAL_OK){ // 初始化基础定时器 Error_Handler(); } // 开启TIM6中断模式 HAL_TIM_Base_Start_IT(&htim6); // 开始计数并允许中断 while (1){} } void TIM6_DAC_IRQHandler(void){ HAL_TIM_IRQHandler(&htim6); // 调用库函数响应中断 } ``` 此段代码实现了对STM32内部资源的有效管理和调度,通过精确调整PSC与ARR两个重要参数,让TIM6能够稳定可靠地每过一秒钟就发出一次信号通知CPU有新的事件待处理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值