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

1. TIM 参考资料整理

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

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

(1) 设置时钟

STM32F103的TIM2定时器的clock为APB1
《[Datasheet]STM32F103x8_xB.pdf》P.11
STM32定时器笔记_中断方式_10ms_第5张图片
STM32定时器笔记_中断方式_10ms_第6张图片

(2) 设置定时器

STM32定时器笔记_中断方式_10ms_第7张图片
在这里插入图片描述
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)
  {

  }
}

你可能感兴趣的:(#,STM32)