这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 换逻辑分析仪STM32F103HAL库定时器

共1条 1/1 1 跳转至

换逻辑分析仪STM32F103HAL库定时器

工程师
2024-06-20 19:53:06   被打赏 13 分(兑奖)     打赏
1、STM32F103 的定时器(TIM)模块可以用于生成定时中断。以下是如何配置和使用 STM32F103 的定时器生成定时中断的步骤:启用定时器时钟首先,需要在时钟配置中启用定时器时钟。例如,如果使用 TIM2,那么需要启用 TIM2 的时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);配置定时器参数设置定时器的基础参数,包括预分频器(Prescaler)和自动重装载寄存器(Auto-Reload Register, ARR)。预分频器决定了定时器的计数频率,ARR决定了计数的最大值。

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_TimeBaseStructure.TIM_Period = 999; // 定时器周期 (ARR)

TIM_TimeBaseStructure.TIM_Prescaler = 71; // 预分频器 (Prescaler)

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

这个配置使定时器以 1 kHz 的频率运行(假设系统时钟为 72 MHz)。

  配置中断

使能定时器的更新中断,并配置 NVIC(嵌套向量中断控制器)以处理该中断。TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);编写中断服务函数编写 TIM2 的中断服务函数(ISR),处理定时器中断。void TIM2_IRQHandler(void){   if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)   {       TIM_ClearITPendingBit(TIM2, TIM_IT_Update);       // 处理定时中断,例如:切换LED   }}5: 启动定时器最后,启动定时器。TIM_Cmd(TIM2, ENABLE);

完整代码示例:

#include "stm32f10x.h"
void TIM2_IRQHandler(void)
{
   if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
   {
       TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
       // 处理定时中断,例如:切换LED
   }
}
void TIM2_Config(void)
{
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
   TIM_TimeBaseStructure.TIM_Period = 999; // 定时器周期 (ARR)
   TIM_TimeBaseStructure.TIM_Prescaler = 71; // 预分频器 (Prescaler)
   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
   NVIC_InitTypeDef NVIC_InitStructure;
   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
   TIM_Cmd(TIM2, ENABLE);
}
int main(void)
{
   TIM2_Config();
   while (1)
   {
       // 主循环
   }
}

初始化:

void MX_TIM2_Init(void){ /* USER CODE BEGIN TIM2_Init 0 */ /* USER CODE END TIM2_Init 0 */ TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; /* USER CODE BEGIN TIM2_Init 1 */ /* USER CODE END TIM2_Init 1 */  htim2.Instance = TIM2; htim2.Init.Prescaler = 7200-1; // 预分频器值 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数模式:向上计数 htim2.Init.Period = 5000-1; // 自动重装载寄存器值 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(); // 主从模式配置失败处理 } /* USER CODE BEGIN TIM2_Init 2 */ /* USER CODE END TIM2_Init 2 */}

2、配置:

image.png

时钟设置:

image.png

3、TM32F1 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器。基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部 IO。高级定时器 TIM1/8是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有 8 个外部 IO。

image.png

基本定时器的核心是时基,不仅基本定时器有,通用定时器和高级定时器也有。下面功能框图:

image.png

定时器这个对我来说,还是比较容易的,参考资料还是很多。









共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]