Я работаю над странной проблемой: в рамках своего проекта я перенес прошивку с 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", функция задержки вообще не работает.Может быть, это помогает с решением?*