Explorar o código

fix the tick of drv_common.c in stm32 bsp

malongwei %!s(int64=3) %!d(string=hai) anos
pai
achega
88133da8e5
Modificáronse 1 ficheiros con 23 adicións e 18 borrados
  1. 23 18
      bsp/stm32/libraries/HAL_Drivers/drv_common.c

+ 23 - 18
bsp/stm32/libraries/HAL_Drivers/drv_common.c

@@ -28,20 +28,19 @@ static void reboot(uint8_t argc, char **argv)
 MSH_CMD_EXPORT(reboot, Reboot System);
 #endif /* RT_USING_FINSH */
 
+extern __IO uint32_t uwTick;
+static uint32_t sysTickMillisecond = 1;
+
 /* SysTick configuration */
 void rt_hw_systick_init(void)
 {
-#if defined (SOC_SERIES_STM32H7)
-    HAL_SYSTICK_Config((HAL_RCCEx_GetD1SysClockFreq()) / RT_TICK_PER_SECOND);
-#elif defined (SOC_SERIES_STM32MP1)
-    HAL_SYSTICK_Config(HAL_RCC_GetSystemCoreClockFreq() / RT_TICK_PER_SECOND);
-#else
-    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq() / RT_TICK_PER_SECOND);
-#endif
-#if !defined (SOC_SERIES_STM32MP1)
-    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
-#endif
+    HAL_SYSTICK_Config(SystemCoreClock / RT_TICK_PER_SECOND);
+
     NVIC_SetPriority(SysTick_IRQn, 0xFF);
+
+    sysTickMillisecond = 1000u / RT_TICK_PER_SECOND;
+    if(sysTickMillisecond == 0)
+        sysTickMillisecond = 1;
 }
 
 /**
@@ -53,7 +52,9 @@ void SysTick_Handler(void)
     /* enter interrupt */
     rt_interrupt_enter();
 
-    HAL_IncTick();
+    if(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)
+        HAL_IncTick();
+
     rt_tick_increase();
 
     /* leave interrupt */
@@ -62,7 +63,15 @@ void SysTick_Handler(void)
 
 uint32_t HAL_GetTick(void)
 {
-    return rt_tick_get_millisecond();
+    if(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)
+        HAL_IncTick();
+
+    return uwTick;
+}
+
+void HAL_IncTick(void)
+{
+    uwTick += sysTickMillisecond;
 }
 
 void HAL_SuspendTick(void)
@@ -91,6 +100,8 @@ void HAL_Delay(__IO uint32_t Delay)
 /* re-implement tick interface for STM32 HAL */
 HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
 {
+    rt_hw_systick_init();
+
     /* Return function status */
     return HAL_OK;
 }
@@ -163,14 +174,8 @@ RT_WEAK void rt_hw_board_init()
     /* HAL_Init() function is called at the beginning of the program */
     HAL_Init();
 
-    /* enable interrupt */
-    __set_PRIMASK(0);
     /* System clock initialization */
     SystemClock_Config();
-    /* disable interrupt */
-    __set_PRIMASK(1);
-
-    rt_hw_systick_init();
 
     /* Heap initialization */
 #if defined(RT_USING_HEAP)