STM32CubeMX----基本定时器(TIM6、TIM7)

基本定时器TIM6(TIM7)的相关参数

Activated:激活TIM6,把前面的方框选中局表示激活了TIM6

One Pulse Mode:STM32F103定时器的One Pulse Mode是一种特殊的计数模式,它只产生一个脉冲输出信号,而不是周期性的信号输出。在这种模式下,计数器只进行一次计数,当计数器计数到预设的值时,就会产生一个脉冲信号,然后计数器会停止计数。这种模式通常用于需要生成单个脉冲信号的应用场景,例如PWM控制、测量脉冲宽度等。在STM32F103系列中,定时器的One Pulse Mode可以通过设置TIM_CR1寄存器中的OPM位来实现。

Counter Setting:计数设置

Prescaler(PSC -16 bits value):预分频器,简写PSC,16位,可设置的值范围是0--65535。在STM32F103中,计数器的时钟源可以是内部时钟源或外部时钟源。当使用内部时钟源时,PSC可以将时钟信号频率除以一个固定的分频系数,以降低计数器的时钟频率,从而扩大计数器的计时范围。当使用外部时钟源时,PSC还可以将外部时钟信号的频率与内部时钟源的频率进行比较,以实现更高的精度。

//例如,如果使用内部时钟源,并将PSC设置为7199,
//则定时器的时钟频率将为72 MHz / (7199 + 1) = 10 kHz。
//这意味着计数器每计数10次,就会过去1毫秒。
//如果需要更长的计时范围,可以将PSC设置为更大的值。

Counter Mode:计数模式,基本定时器TIM6只能向上计数(UP)。

Counter Period(Auto Reload Register - 16 bit value):计数周期,STM32F103定时器的Auto Reload寄存器(ARR)用于设置定时器的计数周期。当定时器的计数器达到ARR的值时,定时器会自动重新加载ARR的值并继续计数。这样可以实现定时器的周期性计数,从而实现定时和计时的功能。

//以TIM6为例,如果ARR的值为9999,则定时器的计数周期为:

//计数周期 = ARR + 1 = 10000

//当定时器的计数器计数到9999时,定时器会自动重新加载ARR的值为999,并继续计数。
//这样就可以实现定时器的周期性计数,从而实现定时的功能。

//需要注意的是,ARR的值不能超过定时器的计数器的最大值(例如对于16位定时器,最大值为65535),
//否则会发生溢出。
//在实际应用中,需要根据具体的需求和系统时钟频率来选择合适的ARR的值,以实现所需的定时功能。

Auto-Reload Preload:自动重载预装载。STM32F103定时器的Auto Reload Preload(自动重载预装载)功能是用来控制定时器计数器的自动重装载和预装载的。它的作用是实现定时器计数器的精确控制和定时器溢出中断的触发。

Auto Reload Preload功能可以通过TIMx_CR1寄存器的ARPE位来开启或关闭。当该功能开启时,定时器会在计数器计满或达到比较值时自动装载计数器的初始值,从而实现计数器的自动重装载。同时,它还会预装载ARR寄存器的值,以确保在计数器重新装载之前,ARR的值已经被正确加载。

Auto Reload Preload功能的主要作用有两个:

  1. 精确控制定时器的计数范围:通过自动重装载功能,定时器可以在达到计数范围的上限时自动重新开始计数,从而实现更长的计时范围和更高的精度。

  2. 触发定时器溢出中断:当定时器计数器达到比较值或自动重装载时,定时器会触发溢出中断。通过预装载ARR寄存器的值,可以确保在溢出中断触发之前,ARR的值已经被正确加载,从而保证定时器溢出中断的精确性。

总之,STM32F103定时器的Auto Reload Preload功能可以实现定时器计数器的自动重载和预装载,从而实现更长的计时范围和更高的精度,并保证定时器溢出中断的精确性。

Trigger Output(TRGO)Parameter:

STM32F103定时器的Trigger Output功能可以用于同步多个定时器、DAC、ADC等外设的启动和停止。当一个定时器的计数器计数到预设值时,就会产生一个触发输出,可以将该输出信号连接到其他定时器或外设的启动输入端,以实现多个定时器或外设同步工作。

另外,Trigger Output还可以用于生成PWM信号。将定时器的输出比较模式设置为PWM模式,再将Trigger Output连接到PWM输出通道的更新触发输入端,就可以实现PWM信号的输出。这种方式可以在不占用CPU资源的情况下,生成高精度的PWM信号,广泛应用于电机控制、LED控制等领域。

Trigger event selection:触发事件选择

上图的三个备选项分别对应下面的配置

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

它指定了当定时器计数器达到自动重装载值时,输出触发信号将被置为低电平。

 sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE;

它指定了当计数器达到定时器的重载值时,输出触发信号将被触发。这种配置可以用于实现定时中断、嵌套定时器、时间戳等应用。


sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;

它指定了当定时器计数器更新时,输出触发信号将被触发。这种配置可以用于控制PWM输出、测量脉冲宽度、生成周期性触发信号等应用。

回过头来看看STM32F103单片机定时器的工作原理

STM32F103单片机的基本定时器是一个16位定时器,它可以产生定时中断,并且可以通过软件或硬件触发。其工作原理如下:

  1. 在定时器初始化时,需要设置定时器的时钟源和计数模式。时钟源可以选择内部时钟或外部时钟,计数模式只能向上计数。

  2. 定时器开始工作后,计数器会不断累加,直到计数器的值与预设的计数值相等。

  3. 当计数器的值与预设的计数值相等时,定时器会产生一个中断请求,并且将计数器的值清零,重新开始计数。

  4. 在中断服务程序中,可以进行需要定时的操作,例如控制外设的开关、采集数据等等。

STM32F103单片机基本定时器(TIM)是一种基于计数器的定时器,其工作原理是通过计数器对定时时间进行计数,当计数器计数到设定值时,产生中断或触发其他事件。

基本定时器有以下相关寄存器:

  1. TIMx_CR1寄存器:定时器控制寄存器1,用于配置定时器工作模式、计数模式、时钟分频等。

  2. TIMx_PSC寄存器:预分频器寄存器,用于设置定时器时钟的预分频值,即将主时钟分频后作为定时器时钟。

  3. TIMx_ARR寄存器:自动重载寄存器,用于设置计数器的上限值,当计数器计数到该值时,自动将计数器清零并产生中断或触发其他事件。

  4. TIMx_CNT寄存器:计数器寄存器,用于存储当前的计数值。

  5. TIMx_SR寄存器:状态寄存器,用于标记定时器事件的状态,如计数器溢出、比较匹配等。

通过对这些寄存器的配置和操作,可以实现基本定时器的各种功能。

基本定时器的功能----精确的延时

1、设置定时器的自动重载值;

2、设置定时器的计数值为0,从0 开始计数

3、开启定时器开始计数

4、读定时器的计数值,并判断计数值是否达到目标值;

5、到达目标值就关闭定时器

void Delay_us(uint16_t t)
{
  uint16_t counter = 0;
  
  __HAL_TIM_SET_AUTORELOAD(&htim6, t); //设置自动重载值
  
  __HAL_TIM_SET_COUNTER(&htim6,0);//设置计数器的值为0,从0开始计数
  __HAL_TIM_ENABLE(&htim6); //使能TIM6
  
  while(counter != t)
  {
    counter = __HAL_TIM_GET_COUNTER(&htim6);//一直读计数器的值,直到计数器的值到达自动重载值
  }
  __HAL_TIM_DISABLE(&htim6);//关闭TIM6
  
}

void Delay_ms(uint16_t t)
{
  uint16_t i;
  for(i=0;i<1000;i++)
  {
    Delay_us(t);
  }
}

定时器的参数设置

TIM_HandleTypeDef htim6;


void MX_TIM6_Init(void)
{

  TIM_MasterConfigTypeDef sMasterConfig = {0};
  htim6.Instance = TIM6;
  htim6.Init.Prescaler = 72-1; //72MHz的时钟经过72分频之后就是1MHz,走一步就是1us
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  //htim6.Init.Period = 1000-1; //这个周期值就不用设置了,因为在延时函数里面设置了
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}

基本定时器的功能----定时做某件事

这就用到定时器的溢出中断了,定时时间到了,在定时器中断回调函数中做某件事;

1、定时器的配置

        

void MX_TIM6_Init(void)
{
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim6.Instance = TIM6;
  htim6.Init.Prescaler = 72-1;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim6.Init.Period = 1000-1;
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM6)
  {
    __HAL_RCC_TIM6_CLK_ENABLE();

    /* 配置定时器中断*/
    HAL_NVIC_SetPriority(TIM6_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM6_IRQn);
  }
}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM6)
  {
    __HAL_RCC_TIM6_CLK_DISABLE();

    HAL_NVIC_DisableIRQ(TIM6_IRQn);
  }
}

2、开启定时器中断

在main函数中调用开始定时器中断函数

int main(void)
{

  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM6_Init();

  HAL_TIM_Base_Start_IT(&htim6); //开启定时器中断

  while (1)
  {

  }

}

3、回调函数中进行中断处理

void TIM6_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&htim6);
}


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  cnt++;
  //因为定时器设置的分频系数是72,计数周期是1000,所以每次1ms就中断,1000次就是1s钟
  if(cnt == 1000) 
  {
    cnt = 0;
    HAL_GPIO_TogglePin(LED_R_GPIO_Port,LED_R_Pin);
  }
}

基本定时器的功能----触发ADC工作

 可以参考下面的博文,定时器触发ADC模数转换

STM32学习----ADC模数转换(轮询、中断、定时器、DMA)_资深流水灯工程师的博客-CSDN博客

  • 11
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我了解到在STM32中可以使用STM32CubeMX进行配置和设置定时器TIM1。 首先,可以参考《STM32中文参考手册_V10》的章节1.1,该章节介绍了基础定时器TIM6的应用。然而,与TIM1有关的具体配置信息在这个章节中可能不会提到。 其次,根据引用提供的信息,可以使用STM32CubeMX进行图形化配置。打开STM32CubeMX,并创建一个新项目。然后,在图形配置中,调试时钟信号和时钟树,以及调试接口进行配置。 最后,根据引用提供的代码示例,可以自定义函数来调节PWM的占空比。具体来说,可以使用类似的代码来配置TIM1的通道和占空比。请注意,TIM_SetTIM3Compare1函数中的参数范围应在0到Counter Period之间。 综上所述,通过使用STM32CubeMX进行图形化配置,并根据需求调整代码中的通道和占空比,可以完成对STM32定时器TIM1的配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [STM32CubeMX定时器TIM](https://blog.csdn.net/qq_42900996/article/details/110259963)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [cubemx配置stm32(四)__STM32定时器中断TIMER](https://blog.csdn.net/li520_fei/article/details/122298788)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值