硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2287|回复: 4
收起左侧

[FreeRTOS] 为什么在stm103的freertos移植例子工程里看不到SysTick的初始化???

[复制链接]

10

主题

21

回帖

51

积分

初级会员

积分
51
发表于 2018-12-22 17:47:44 | 显示全部楼层 |阅读模式
用的  “02.配套例程\04.FreeRTOS操作系统(39个例子)\V4-300_FreeRTOS实验_任务创建和删除\V4-300_FreeRTOS实验_任务创建和删除\Project\MDK-ARM(uV4”

SysTick不是用于操作系统的时钟节拍吗??为什么在例子代码里看不到SysTick的初始化代码呢??


void bsp_Init(void)
{
/*
  óéóúST1ì¼t¿aμÄÆô¶ˉÎļtòѾ-Ö′DDáËCPUÏμí3ê±ÖóμÄ3õê¼»ˉ£¬ËùòÔ2»±ØÔù′ÎÖظ′ÅäÖÃÏμí3ê±Öó¡£
  Æô¶ˉÎļtÅäÖÃáËCPUÖ÷ê±ÖóÆμÂê¡¢Äú2¿Flash·ÃÎêËù¶èoí¿éÑ¡μÄía2¿SRAM FSMC3õê¼»ˉ¡£

  Ïμí3ê±Öóè±ê¡ÅäÖÃÎa72MHz£¬èç1ûDèòa¸ü¸Ä£¬¿éòÔDT¸Ä system_stm32f10x.c Îļt
*/

/* óÅÏ輶·Ö×ééèÖÃÎa4, óÅÏèÅäÖÃoÃNVIC */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

bsp_InitUart();  /* 3õê¼»ˉ′®¿ú */
bsp_InitLed();   /* 3õê¼LEDÖ¸ê¾μƶ˿ú */
bsp_InitKey();  /* 3õê¼»ˉ°′¼ü */

}

回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2018-12-22 18:21:55 | 显示全部楼层
在port.c文件里面
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

10

主题

21

回帖

51

积分

初级会员

积分
51
 楼主| 发表于 2018-12-22 22:42:05 | 显示全部楼层


@byccc  嗯确实在port.c 里有 函数  void vPortSetupTimerInterrupt( void )就是初始化SysTick的吧
在  STM32Cube_FW_F1_V1.7.0 里也有freertos的例子  有下面的函数把  TIM2 给初始化了,这应该不是用作os的时钟节拍的吧??


HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority)
{
  RCC_ClkInitTypeDef    clkconfig;
  uint32_t              uwTimclock, uwAPB1Prescaler = 0U;
  uint32_t              uwPrescalerValue = 0U;
  uint32_t              pFLatency;
  
    /*Configure the TIM2 IRQ priority */
  HAL_NVIC_SetPriority(TIM2_IRQn, TickPriority ,0U);
  
  /* Enable the TIM2 global Interrupt */
  HAL_NVIC_EnableIRQ(TIM2_IRQn);
  
  /* Enable TIM2 clock */
  __HAL_RCC_TIM2_CLK_ENABLE();
  
  /* Get clock configuration */
  HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
  
  /* Get APB1 prescaler */
  uwAPB1Prescaler = clkconfig.APB1CLKDivider;
  
  /* Compute TIM2 clock */
  if (uwAPB1Prescaler == RCC_HCLK_DIV1)
  {
    uwTimclock = HAL_RCC_GetPCLK1Freq();
  }
  else
  {
    uwTimclock = 2*HAL_RCC_GetPCLK1Freq();
  }
  
  /* Compute the prescaler value to have TIM2 counter clock equal to 1MHz */
  uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U);
  
  /* Initialize TIM2 */
  TimHandle.Instance = TIM2;
  
  /* Initialize TIMx peripheral as follow:
  + Period = [(TIM2CLK/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
  */
  TimHandle.Init.Period = (1000000U / 1000U) - 1U;
  TimHandle.Init.Prescaler = uwPrescalerValue;
  TimHandle.Init.ClockDivision = 0U;
  TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
  TimHandle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if(HAL_TIM_Base_Init(&TimHandle) == HAL_OK)
  {
    /* Start the TIM time Base generation in interrupt mode */
    return HAL_TIM_Base_Start_IT(&TimHandle);
  }
  
  /* Return function status */
  return HAL_ERROR;
}
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2018-12-22 23:02:24 | 显示全部楼层
52mcu 发表于 2018-12-22 22:42
@byccc  嗯确实在port.c 里有 函数  void vPortSetupTimerInterrupt( void )就是初始化SysTick的吧
在 ...

是的,这个是作为HAL库的时钟节拍,默认是用滴答,因为FreeRTOS要用,所以做了重定向。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

10

主题

21

回帖

51

积分

初级会员

积分
51
 楼主| 发表于 2018-12-24 21:47:14 | 显示全部楼层
@byccc  谢谢 讲的很明白
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 18:12 , Processed in 0.178288 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表