CUBE MX 中配置systick的时钟源

在学习别的代码中发现,systick中断的SysTick_Handler被改写了,内部时钟源使用的是timer6,并且注释为了1ms,因为也在学习cube mx平台,所以打开了IOC文件进行了尝试怎么配置为TIM6。

 根据 HAL库使用定时器作为Systick时钟的方法(67条消息) HAL库使用定时器作为Systick时钟的方法_不吃鱼的猫的博客-CSDN博客_hal systick 高级应用icon-default.png?t=M0H8https://blog.csdn.net/laifengyuan1/article/details/107824132?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164447973716780264076028%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164447973716780264076028&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-107824132.first_rank_v2_pc_rank_v29&utm_term=HAL%E5%BA%93%E4%BD%BF%E7%94%A8%E5%AE%9A%E6%97%B6%E5%99%A8%E4%BD%9C%E4%B8%BASystick%E6%97%B6%E9%92%9F%E7%9A%84%E6%96%B9%E6%B3%95&spm=1018.2226.3001.4187 中的介绍,我找到了里面的代码部分,但是不同的固件库版本生成的代码还是有差异的。我用的库版本是STM32Cube_FW_F3_V1.11.2。

这个配置生成的代码部分是

HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
  RCC_ClkInitTypeDef    clkconfig;
  uint32_t              uwTimclock = 0;
  uint32_t              uwPrescalerValue = 0;
  uint32_t              pFLatency;
  /*Configure the TIM6 IRQ priority */
  HAL_NVIC_SetPriority(TIM6_DAC_IRQn, TickPriority ,0);

  /* Enable the TIM6 global Interrupt */
  HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);

  /* Enable TIM6 clock */
  __HAL_RCC_TIM6_CLK_ENABLE();

  /* Get clock configuration */
  HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);

  /* Compute TIM6 clock */
  uwTimclock = 2*HAL_RCC_GetPCLK1Freq();
  /* Compute the prescaler value to have TIM6 counter clock equal to 1MHz */
  uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U);

  /* Initialize TIM6 */
  htim6.Instance = TIM6;

  /* Initialize TIMx peripheral as follow:
  + Period = [(TIM6CLK/1000) - 1]. to have a (1/1000) s time base.
  + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
  + ClockDivision = 0
  + Counter direction = Up
  */
  htim6.Init.Period = (1000000U / 1000U) - 1U;
  htim6.Init.Prescaler = uwPrescalerValue;
  htim6.Init.ClockDivision = 0;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;

  if(HAL_TIM_Base_Init(&htim6) == HAL_OK)
  {
    /* Start the TIM time Base generation in interrupt mode */
    return HAL_TIM_Base_Start_IT(&htim6);
  }

  /* Return function status */
  return HAL_ERROR;
}

这个版本下没有对时钟的分频数进行判断,所以还是和更高的版本差别较大。

系统自动设置为了1ms的周期,也是一个比较标准的基时,在中断中可以用做更多的用途。

有个疑问:这样配置systick和用timer6定时一个1ms的基准在使用上有何区别呢?

版权声明:本文为CSDN博主「yangzichen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yangzichen/article/details/122861983

在学习别的代码中发现,systick中断的SysTick_Handler被改写了,内部时钟源使用的是timer6,并且注释为了1ms,因为也在学习cube mx平台,所以打开了IOC文件进行了尝试怎么配置为TIM6。

 根据 HAL库使用定时器作为Systick时钟的方法(67条消息) HAL库使用定时器作为Systick时钟的方法_不吃鱼的猫的博客-CSDN博客_hal systick 高级应用icon-default.png?t=M0H8https://blog.csdn.net/laifengyuan1/article/details/107824132?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164447973716780264076028%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164447973716780264076028&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-107824132.first_rank_v2_pc_rank_v29&utm_term=HAL%E5%BA%93%E4%BD%BF%E7%94%A8%E5%AE%9A%E6%97%B6%E5%99%A8%E4%BD%9C%E4%B8%BASystick%E6%97%B6%E9%92%9F%E7%9A%84%E6%96%B9%E6%B3%95&spm=1018.2226.3001.4187 中的介绍,我找到了里面的代码部分,但是不同的固件库版本生成的代码还是有差异的。我用的库版本是STM32Cube_FW_F3_V1.11.2。

这个配置生成的代码部分是

HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
  RCC_ClkInitTypeDef    clkconfig;
  uint32_t              uwTimclock = 0;
  uint32_t              uwPrescalerValue = 0;
  uint32_t              pFLatency;
  /*Configure the TIM6 IRQ priority */
  HAL_NVIC_SetPriority(TIM6_DAC_IRQn, TickPriority ,0);

  /* Enable the TIM6 global Interrupt */
  HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);

  /* Enable TIM6 clock */
  __HAL_RCC_TIM6_CLK_ENABLE();

  /* Get clock configuration */
  HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);

  /* Compute TIM6 clock */
  uwTimclock = 2*HAL_RCC_GetPCLK1Freq();
  /* Compute the prescaler value to have TIM6 counter clock equal to 1MHz */
  uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U);

  /* Initialize TIM6 */
  htim6.Instance = TIM6;

  /* Initialize TIMx peripheral as follow:
  + Period = [(TIM6CLK/1000) - 1]. to have a (1/1000) s time base.
  + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
  + ClockDivision = 0
  + Counter direction = Up
  */
  htim6.Init.Period = (1000000U / 1000U) - 1U;
  htim6.Init.Prescaler = uwPrescalerValue;
  htim6.Init.ClockDivision = 0;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;

  if(HAL_TIM_Base_Init(&htim6) == HAL_OK)
  {
    /* Start the TIM time Base generation in interrupt mode */
    return HAL_TIM_Base_Start_IT(&htim6);
  }

  /* Return function status */
  return HAL_ERROR;
}

这个版本下没有对时钟的分频数进行判断,所以还是和更高的版本差别较大。

系统自动设置为了1ms的周期,也是一个比较标准的基时,在中断中可以用做更多的用途。

有个疑问:这样配置systick和用timer6定时一个1ms的基准在使用上有何区别呢?

版权声明:本文为CSDN博主「yangzichen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yangzichen/article/details/122861983

生成海报
点赞 0

yangzichen

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

ESP32-GY_30光照强度传感器

GY_30光照强度传感器介绍 GY-30光强传感器特点及使用介绍 一、连接引脚 GY_30光照强度传感器使用I2C传输数据 。 5根引脚,名称与功能如下; vcc 为外接供电电源输入端 GND 地线 SCL I2C通信模式时钟

初学STM32之串口通信

一、背景知识 1. 处理器与外部通信的两种方式 并行通信:数据各个位同时传输 优点速度快;缺点占用引脚资源多串行通信:数据按位顺序传输 优点占用引脚资源少;缺点速度慢 2.串行通信的

GPIO口详解、HAL库操作按键

本次博客知识来自于韦东山老师的7天物联网课程。 一、GPIO详解 1、STM32F103C8T6一共有48个引脚。 2、按A、B、C分组,每组16个引脚,编号为0~15,STM32F103C8T6