簡體   English   中英

IDE切換后,systick出現STM32F4時序問題(將Coocox切換到TrueStudio)

[英]STM32F4 Timing Problem with systick after switching IDE (coocox to TrueStudio)

我正在解決一個奇怪的問題:作為項目的一部分,我將固件從CooCox遷移到TrueStudio。 CooCox和TrueStudio在創建用於特定微控制器的項目時會自動創建一些標准文件。 此處使用的單片機是STM32F407VGT6。 我使用的是ms-延遲和s-延遲,它們是從µs-延遲函數中得出的。

* edit2:我應該提到,原始項目是純C項目。 我正在嘗試在TrueStudio中使該項目成為C ++ / C項目。 我現在將嘗試將固件遷移到TrueStudio純C項目中,然后查看問題是否仍然存在。 我會告訴你結果

**結果:問題實際上已經在純C項目中消失了,但是我真的很想使用C ++實現類。 任何想法如何解決這個問題? ** *

初始化系統代碼為(HCLK頻率= 168MHz)。

* edit1:HCLK頻率等於SYSCLK *

void systick_init(void){
    RCC_ClocksTypeDef RCC_Clocks;

    Systick_Delay=0;

    RCC_GetClocksFreq(&RCC_Clocks);
    SysTick_Config((RCC_Clocks.HCLK_Frequency / 1000000) - 1);
}

1µs延遲的功能如下所示:

void delay_us(volatile uint32_t delay)
{
    Systick_Delay = delay;

    while(Systick_Delay != 0);
}

Systick處理程序包含以下代碼:

void SysTick_Handler(void)
{
  // Tick für Delay
  if(Systick_Delay != 0x00)
  {
    Systick_Delay--;
  }
}

當我創建一個.hex文件以使用Coocox刷新µC時,計時功能會起作用(有些小的精度錯誤不會打擾我)。

當我使用TrueStudio創建.hex文件時,延遲具有很大的不准確性。 例如,500ms的延遲變為大約2s的延遲。

由於代碼是根據實際的HCLK_Frequency編寫的,因此我無法理解錯誤,並且就我的理解而言,即使HCLK有所不同,但1µs延遲仍應花費大約1µs。

我的下一步是比較自動創建的系統文件,但是也許有人有不同的方法/另一個想法?

* edit 3:我通常在命令'extern“ C”'中包含我的systick-標頭。 所以我的sticky源文件是.c文件。 當我將文件重命名為systick.cpp,並且包含不帶“ extern“ C””的頭文件時,延遲功能根本不起作用。 也許對解決方案有幫助? *

您正在運行其他時鍾或具有不同的PLL設置。 看來您的時鍾速度是以前的1/4。

提供的基本啟動代碼並不總是設置主板的最大速度。 看一下stm32cube.zip代碼中的一些示例。 您會在板上找到一些系統時鍾配置代碼,它將選擇正確的時鍾和PLL設置。 (這也將出現在您的代碼中)。

在stm32cubef4 / projects / STM32F4-Discovery \\ Demonstrations \\ src下的main.c中查找。

您將找到以下設置時鍾的代碼:

    /**
  * @brief  System Clock Configuration
  *         The system Clock is configured as follow : 
  *            System Clock source            = PLL (HSE)
  *            SYSCLK(Hz)                     = 168000000
  *            HCLK(Hz)                       = 168000000
  *            AHB Prescaler                  = 1
  *            APB1 Prescaler                 = 4
  *            APB2 Prescaler                 = 2
  *            HSE Frequency(Hz)              = 8000000
  *            PLL_M                          = 8
  *            PLL_N                          = 336
  *            PLL_P                          = 2
  *            PLL_Q                          = 7
  *            VDD(V)                         = 3.3
  *            Main regulator output voltage  = Scale1 mode
  *            Flash Latency(WS)              = 5
  * @param  None
  * @retval None
  */
static void SystemClock_Config(void)
{
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_OscInitTypeDef RCC_OscInitStruct;

  /* Enable Power Control clock */
  __HAL_RCC_PWR_CLK_ENABLE();

  /* The voltage scaling allows optimizing the power consumption when the device is 
     clocked below the maximum system frequency, to update the voltage scaling value 
     regarding system frequency refer to product datasheet.  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  /* Enable HSE Oscillator and activate PLL with HSE as source */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 336;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 
     clocks dividers */
  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);

  /* STM32F405x/407x/415x/417x Revision Z devices: prefetch is supported  */
  if (HAL_GetREVID() == 0x1001)
  {
    /* Enable the Flash prefetch */
    __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
  }
}

我現在找到了解決方案! 對於有類似問題的任何人:您需要將SysTick_Handler函數聲明為

extern "C" void SysTick_Handler(void)
{
    //Tick für Delay
    if(Systick_Delay != 0x00)
    {
    Systick_Delay--;
    }
}

現在它正在按預期的方式工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM