首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >切换集成开发环境(coocox到TrueStudio)后,系统棒的STM32F4计时问题

切换集成开发环境(coocox到TrueStudio)后,系统棒的STM32F4计时问题
EN

Stack Overflow用户
提问于 2018-12-03 20:06:20
回答 2查看 297关注 0票数 0

我正在解决一个奇怪的问题:作为我项目的一部分,我将一个固件从CooCox迁移到了TrueStudio。在为特定的微控制器创建项目时,CooCox和TrueStudio都会自动创建一些标准文件。这里使用的微控制器是STM32F407VGT6。我正在使用ms延迟和s延迟,它们是从我将向您展示的µs延迟函数派生出来的。

*edit2:值得一提的是,原来的项目是纯C项目。我正在尝试使该项目成为TrueStudio中的C++/C项目。我现在要尝试的是将固件迁移到一个TrueStudio纯C项目中,看看问题是否仍然存在。我会通知你结果的

**结果:这个问题现在在纯C项目中实际上已经不存在了,但我真的很想用C++实现类等。有什么办法解决这个问题吗?*

初始化系统条码为(HCLK频率=168 The )。

*edit1: HCLK频率等于SYSCLK *

代码语言:javascript
复制
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延迟的函数如下所示:

代码语言:javascript
复制
void delay_us(volatile uint32_t delay)
{
    Systick_Delay = delay;

    while(Systick_Delay != 0);
}

Systick处理程序包含以下代码:

代码语言:javascript
复制
void SysTick_Handler(void)
{
  // Tick für Delay
  if(Systick_Delay != 0x00)
  {
    Systick_Delay--;
  }
}

当我使用Coocox创建一个闪存µC的.hex文件时,计时功能正常工作(有一些微小的精度错误,我不会感到困扰)。

当我用TrueStudio创建.hex文件时,延迟有很大的不准确性。例如,500ms的延迟变成了大约2s的延迟。

由于代码是根据实际的HCLK_Frequency编写的,因此我无法理解其中的错误,据我所知,即使HCLK不同,1µs的延迟也应该需要大约1µs。

我的下一步将是比较自动创建的系统文件,但可能有人有不同的方法/另一个想法?

*编辑3:我通常在命令‘extern "C“中包含我的systick header。所以我的systick源文件是一个.c文件。当我将文件重命名为systick.cpp,并且包含没有'extern“C‘的头文件时,延迟功能根本不起作用。也许,这对解决方案有帮助?*

EN

回答 2

Stack Overflow用户

发布于 2018-12-04 16:22:39

您正在运行不同的时钟或具有不同的PLL设置。看起来你的时钟速度是以前的四分之一。

提供的基本启动代码并不总是设置电路板的最大速度。看看stm32cube.zip代码中的一些示例。您可以找到您的主板的一些系统时钟配置代码,它们将选择正确的时钟和pll设置。(这也会出现在您的代码中的某个地方)。

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

你会发现下面的代码设置了时钟:

代码语言:javascript
复制
    /**
  * @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();
  }
}
票数 0
EN

Stack Overflow用户

发布于 2018-12-06 19:29:28

我现在找到解决方案了!对于任何有类似问题的人:您需要将SysTick_Handler函数声明为

代码语言:javascript
复制
extern "C" void SysTick_Handler(void)
{
    //Tick für Delay
    if(Systick_Delay != 0x00)
    {
    Systick_Delay--;
    }
}

现在它正在按照它应该做的那样工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53593536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档