STM32
直播中

那些年儿ing

11年用户 1221经验值
擅长:84784
私信 关注
[问答]

如何去实现STM32CUBEMX高级定时器的计时功能呢

如何去实现STM32CUBEMX高级定时器的计时功能呢?有哪些操作步骤?

回帖(1)

周静

2021-11-24 15:40:46
  一、计时功能
  设置系统时钟
  
  APB2=84M
  TIM1的时钟频率=2*APB2=168M
  定时器1配置
  
  
  TIM中断频率:
  168M/168=1000hz=1ms
  1ms*500=500ms
  所有TIM1:500ms中断一次。
  程序编写
  #include “stm32f4xx_hal.h”
  #include “led/bsp_led.h”
  #include “AdvancedTIM/bsp_AdvancedTIM.h”
  /* 私有类型定义 --------------------------------------------------------------*/
  /* 私有宏定义 ----------------------------------------------------------------*/
  /* 私有变量 ------------------------------------------------------------------*/
  __IO uint16_t timer_count=0;
  /* 扩展变量 ------------------------------------------------------------------*/
  /* 私有函数原形 --------------------------------------------------------------*/
  void SystemClock_Config(void);
  /* 函数体 --------------------------------------------------------------------*/
  /**
  * 函数功能: 主函数。
  * 输入参数: 无
  * 返 回 值: 无
  * 说 明: 无
  */
  int main(void)
  {
  /* 复位所有外设,初始化Flash接口和系统滴答定时器 */
  HAL_Init();
  /* 配置系统时钟 */
  SystemClock_Config();
  /* 板载LED初始化 */
  LED_GPIO_Init();
  /* 通用定时器初始化:1ms中断一次 */
  ADVANCED_TIMx_Init();
  /* 在中断模式下启动定时器 */
  HAL_TIM_Base_Start_IT(&htimx);
  LED2_ON;
  /* 无限循环 */
  while (1)
  {
  if(timer_count==1000)
  {
  timer_count=0;
  LED1_TOGGLE;
  LED2_TOGGLE;
  LED3_TOGGLE;
  }
  }
  }
  /**
  * 函数功能: 系统时钟配置
  * 输入参数: 无
  * 返 回 值: 无
  * 说 明: 无
  */
  void SystemClock_Config(void)
  {
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); //设置调压器输出电压级别1
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 外部晶振,8MHz
  RCC_OscInitStruct.HSEState = RCC_HSE_ON; //打开HSE
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; //打开PLL
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; //PLL时钟源选择HSE
  RCC_OscInitStruct.PLL.PLLM = 8; //8分频MHz
  RCC_OscInitStruct.PLL.PLLN = 336; //336倍频
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; //2分频,得到168MHz主时钟
  RCC_OscInitStruct.PLL.PLLQ = 7; //USB/SDIO/随机数产生器等的主PLL分频系数
  HAL_RCC_OscConfig(&RCC_OscInitStruct);
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 系统时钟:168MHz
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // AHB时钟: 168MHz
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // APB1时钟:42MHz
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // APB2时钟:84MHz
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
  HAL_RCC_EnableCSS(); // 使能CSS功能,优先使用外部晶振,内部时钟源为备用
  // HAL_RCC_GetHCLKFreq()/1000 1ms中断一次
  // HAL_RCC_GetHCLKFreq()/100000 10us中断一次
  // HAL_RCC_GetHCLKFreq()/1000000 1us中断一次
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); // 配置并启动系统滴答定时器
  /* 系统滴答定时器时钟源 */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  /* 系统滴答定时器中断优先级配置 */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  }
  /**
  * 函数功能: 非阻塞模式下定时器的回调函数
  * 输入参数: htim:定时器句柄
  * 返 回 值: 无
  * 说 明: 无
  */
  void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  {
  timer_count++;
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分