STM32定时器笔记_中断方式_10ms

本文详细介绍了STM32F103系列微控制器中TIM2定时器的配置过程,包括时钟设置、定时器初始化、中断启用及回调函数实现,旨在帮助开发者理解并应用10ms周期的定时器中断。

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

1. TIM 参考资料整理

《STM32F10xxx参考手册.pdf》P.256
当发生一个更新事件时,所有的寄存器都被更新,硬件同时(依据URS位)设置更新标志位(TIMx_SR寄存器中的UIF位)。 ● 预分频器的缓冲区被置入预装载寄存器的值(TIMx_PSC寄存器的内容)。 ● 自动装载影子寄存器被重新置入预装载寄存器的值(TIMx_ARR)。
在这里插入图片描述
注:内部时钟(CK_INT)
在这里插入图片描述在这里插入图片描述
《[Reference manual]STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced ARM-based 32-bit MCUs.pdf》8.2 Clocks
在这里插入图片描述

2. 10ms定时器,每10ms中断一次,在回调函数中处理。

(1) 设置时钟

STM32F103的TIM2定时器的clock为APB1
《[Datasheet]STM32F103x8_xB.pdf》P.11
在这里插入图片描述
在这里插入图片描述

(2) 设置定时器

在这里插入图片描述
在这里插入图片描述
72 000 000 / 72 / 10 000 = 100Hz,即10ms
自动生成的代码如下:

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

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 72-1;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 10000-1;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  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();
  }

}

(3) 在主while(1)前,添加如下代码,开启定时器中断

HAL_TIM_Base_Start_IT(&htim2);

(4) 在程序中添加如下函数,实现10ms中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM2)
  {

  }
}
### STM32F103 定时器中断配置教程 #### 配置定时器并启用中断 为了在STM32F103微控制器上实现定时器功能,并使用中断来处理定时器事件,需要按照如下方式配置定时器: ```c #include "stm32f1xx_hal.h" TIM_HandleTypeDef htim2; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM2_Init(); /* 开启定时器 */ HAL_TIM_Base_Start_IT(&htim2); while (1) { // 主程序循环体 } } /* TIM2 初始化函数 */ static void MX_TIM2_Init(void) { __HAL_RCC_TIM2_CLK_ENABLE(); // 启用定时器外设时钟 htim2.Instance = TIM2; htim2.Init.Prescaler = 8399; // 设置预分频值 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 999; // 自动重装载值 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { Error_Handler(); } if (HAL_TIM_Base_Start_IT(&htim2) != HAL_OK) { Error_Handler(); } } ``` 此代码展示了如何初始化定时器以及启动带有中断的计数模式[^1]。 #### 处理定时器中断服务例程 当定时器达到设定的时间间隔后会触发一次更新事件,此时将调用相应的中断服务例程(ISR),该ISR负责执行具体的业务逻辑: ```c // 定义全局变量用于记录时间到达次数 uint32_t counter = 0; void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance==TIM2){ counter++; // 增加计数值 printf("Timer interrupt occurred %lu times.\n",counter); // 可在此处加入其他要定期运行的任务... } } ``` 这段代码定义了一个回调函数`HAL_TIM_PeriodElapsedCallback()`,每当发生溢出(即达到了自动重新加载寄存器中的值)就会被调用。这里只是简单打印了一条消息表示发生了多少次中断[^2]。 #### 调整定时周期 可以通过修改定时器实例结构体成员`.Init.Period`和`.Init.Prescaler`来自由改变定时长度。具体计算公式为: \[ \text{实际延时}=(\text{ARR}+1)\times(\text{PSC}+1)/\text{APB1频率}\] 其中ARR代表自动重载寄存器(Auto Reload Register), PSC指预分频系数(Prescaler)[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值