STM32F4 Временная проблема с джойстиком после переключения IDE (coocox в TrueStudio) - PullRequest
0 голосов
/ 03 декабря 2018

Я работаю над странной проблемой: в рамках своего проекта я перенес прошивку с CooCox на TrueStudio.И CooCox, и TrueStudio автоматически создают некоторые стандартные файлы при создании проекта для конкретного микроконтроллера.Используемый здесь микроконтроллер - STM32F407VGT6.Я использую ms - delay и s - delay, которые получены из функции µs - Delay, которую я покажу вам.

* edit2: я должен упомянуть, что оригинальный проект - это чистый проект Си.Я пытаюсь сделать проект C ++ / C проект в TrueStudio.Сейчас я попробую перенести прошивку в проект TrueStudio pure C и посмотреть, существует ли проблема.Я сообщу вам о результатах

** Результаты: Проблема на самом деле исчезла в чистом C-проекте, но я бы очень хотел реализовать классы и т. Д. С использованием C ++.Есть идеи как решить это?** *

Инициализирующий код синтиста (частота HCLK = 168 МГц).

* 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 мкс выглядит следующим образом:

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, функция синхронизацииработает (с некоторыми незначительными ошибками точности, которые меня не беспокоят).

Когда я создаю файл .hex с TrueStudio, задержки имеют огромные неточности.Например, задержка в 500 мс становится задержкой примерно на 2 с.

Поскольку код написан в зависимости от фактической частоты HCLK_F, я не могу понять ошибку и, насколько я понимаю, даже если HCLK должен отличаться,Задержка в 1 мкс должна продолжаться около 1 мкс.

Мой следующий шаг - сравнение автоматически созданных системных файлов, но, может быть, у кого-то другой подход / другая идея?

* edit 3: Я обычновключите мой заголовок systick с командой 'extern "C"'.Таким образом, мой исходный файл systick является .c файлом.Когда я переименовываю файл в systick.cpp и включаю заголовок без 'extern "C", функция задержки вообще не работает.Может быть, это помогает с решением?*

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Я нашел решение сейчас!Для тех, у кого есть подобные проблемы: Вам нужно объявить функцию SysTick_Handler как

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

Теперь она работает так, как и должна.

0 голосов
/ 04 декабря 2018

Вы используете разные часы или у вас другие настройки PLL.Похоже, ваша тактовая частота составляет 1/4 от того, что вы имели раньше.

Базовый код запуска не всегда устанавливает максимальную скорость для платы.Посмотрите на некоторые примеры в коде stm32cube.zip.Вы найдете код конфигурации системных часов для вашей платы, который выберет правильные настройки часов и pll.(это также будет где-то в вашем коде).

Посмотрите в main.c под stm32cubef4 / projects / STM32F4-Discovery \ Demonstrations \ src.

Вы найдете следующий код, который устанавливаетдо часов:

    /**
  * @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();
  }
}
...