我正在解决一个奇怪的问题:作为我项目的一部分,我将一个固件从CooCox迁移到了TrueStudio。在为特定的微控制器创建项目时,CooCox和TrueStudio都会自动创建一些标准文件。这里使用的微控制器是STM32F407VGT6。我正在使用ms延迟和s延迟,它们是从我将向您展示的µs延迟函数派生出来的。
*edit2:值得一提的是,原来的项目是纯C项目。我正在尝试使该项目成为TrueStudio中的C++/C项目。我现在要尝试的是将固件迁移到一个TrueStudio纯C项目中,看看问题是否仍然存在。我会通知你结果的
**结果:这个问题现在在纯C项目中实际上已经不存在了,但我真的很想用C++实现类等。有什么办法解决这个问题吗?*
初始化系统条码为(HCLK频率=168 The )。
*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--;
}
}当我使用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‘的头文件时,延迟功能根本不起作用。也许,这对解决方案有帮助?*
发布于 2018-12-04 16:22:39
您正在运行不同的时钟或具有不同的PLL设置。看起来你的时钟速度是以前的四分之一。
提供的基本启动代码并不总是设置电路板的最大速度。看看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();
}
}发布于 2018-12-06 19:29:28
我现在找到解决方案了!对于任何有类似问题的人:您需要将SysTick_Handler函数声明为
extern "C" void SysTick_Handler(void)
{
//Tick für Delay
if(Systick_Delay != 0x00)
{
Systick_Delay--;
}
}现在它正在按照它应该做的那样工作。
https://stackoverflow.com/questions/53593536
复制相似问题