Nuru_Banmian
Nuru_Banmian
Published on 2025-04-29 / 13 Visits
0
0

基本定时器_寄存器&HAL库实现

寄存器实现

tim6.h

#ifndef __TIM6_H
#define __TIM6_H
#include "stm32f10x.h"void TIM6_Init(void);#endif

tim.c

#include "tim6.h"
#include "led.h"
void TIM6_Init(void)

{
  // 1. 开启时钟
  RCC->APB1ENR |= RCC_APB1ENR_TIM6EN;

  // 2. 设置预分频值7199,做7200分频,得到 10000Hz
  TIM6->PSC = 7199;

  // 3. 设置自动重装载值9999,表示计数10000次产生一个UEV
  TIM6->ARR = 9999;

  // 4. 更新中断使能
  TIM6->DIER |= TIM_DIER_UIE;

  // 5. NVIC配置
  NVIC_SetPriorityGrouping(3);
  NVIC_SetPriority(TIM6_IRQn, 2);
  NVIC_EnableIRQ(TIM6_IRQn);

  // 6. 开启定时器
  TIM6->CR1 |= TIM_CR1_CEN;
}

// 中断服务程序
void TIM6_IRQHandler(void)
{
  // 清除中断标志位
  TIM6->SR &= ~TIM_SR_UIF;

  // 翻转LED2
  LED_Toggle(LED2);
}

main.c

#include "usart.h"
#include "led.h"
#include "tim6.h"

int main(void)
{
  // 初始化
  USART_Init();
  LED_Init();
  TIM6_Init();
  while(1)
  {
  }
}

HAL库实现

CubeMX设置

SYS,RCC,Clock Configuration都照常设置

TIM6设置

基本定时器_HEL库实现TIM6设置.jpg

PA1设置

基本定时器_HEL库实现PA1设置.png

代码

tic.c

/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    // 定时器6产生中断。任何一个定时器产生中断都会进入到这个方法中,所以需要判断下定时器实例
    if (htim->Instance == TIM6)
    {
        // 翻转LEDB
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);
    }
}
/* USER CODE END 1 */

main.c

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_TIM6_Init();
    // 启动定时器6
    HAL_TIM_Base_Start_IT(&htim6);
    while (1)
    {
    }
}


Comment