2017-02-26 44 views
0

私はSTM32を学ぶために使用しているSTM32L476RCニューロボードを持っています。私はSTM32Cube HALとAC6 System Workbenchを使って開発しています。私はCubeMXから離れていきたいと思っています。私の目標は、何かを稼ぐだけでなく、学習に向けたものです。STM32 SysTickは2倍の速さでカウントする必要があります。

私が抱えている問題は、以下のコードを使ってシステムタイマーを設定しようとしたときに、2倍の速さでカウントされているようです。

ただし、電源を入れたままにしておくと正しい速度でカウントされます。

私はCubeMXを使って次のクロック設定を生成し、それをSystem Workbenchで作成した新しいプロジェクトに直接貼り付けましたが、systickカウンタはまだ2倍の速さでカウントされているようです。しかし、CubeMXによって生成されたプロジェクトはうまく動作しているようです。

/** System Clock Configuration 
*/ 
void SystemClock_Config(void) 
{ 

    RCC_OscInitTypeDef RCC_OscInitStruct; 
    RCC_ClkInitTypeDef RCC_ClkInitStruct; 
    RCC_PeriphCLKInitTypeDef PeriphClkInit; 

    /**Initializes the CPU, AHB and APB busses clocks 
    */ 
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; 
    RCC_OscInitStruct.HSIState = RCC_HSI_ON; 
    RCC_OscInitStruct.HSICalibrationValue = 16; 
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; 
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; 
    RCC_OscInitStruct.PLL.PLLM = 1; 
    RCC_OscInitStruct.PLL.PLLN = 10; 
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; 
    RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; 
    RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; 
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) 
    { 
    //Error_Handler(); 
    } 

    /**Initializes the CPU, AHB and APB busses clocks 
    */ 
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK 
           |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; 
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; 
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; 
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; 
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; 

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) 
    { 
    //Error_Handler(); 
    } 

    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; 
    PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; 
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) 
    { 
    //Error_Handler(); 
    } 

    /**Configure the main internal regulator output voltage 
    */ 
    if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) 
    { 
    //Error_Handler(); 
    } 

    /**Configure the Systick interrupt time 
    */ 
    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); 

    /**Configure the Systick 
    */ 
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); 

    /* SysTick_IRQn interrupt configuration */ 
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); 

} 

私が紛失しているものがあります。多分何とかティックカウンタがどこかで設定され、HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/ 1000)を呼び出すと、別のティックカウンターを設定するだけですか?何も思いつきません!私は何が起こっているとして完全に失われて助けてください!私は単純にLEDを点滅し、ロジックアナライザで周波数を測定することにより、ダニ速度を計測しています

if (HAL_GetTick() - LEDstopwatch > 1000) 
{ 
    // Toggle the LED 
    //BSP_LED_Toggle(LED2); 
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_10); 
    // Reset the stopwatch 
    LEDstopwatch = HAL_GetTick(); 
} 

私のテストプロジェクトのための完全なコードはここにある: https://github.com/c-herring/STM32L476_Nucleo_FirstTest

ありがとう!

答えて

1

SystemClock_Config関数でコピーしたSTM32CubeMX関数は、システムクロックを80MHzに初期化します。これを行うために、PLLの入力としてHSI(16MHz)を使用し、次にそれを1(PLLM)で除算し、10(PLLN)を乗算し、最後に2(PLLR)で除算します。

STM32CubeMXを使用せずに、最初からプロジェクトを作成する場合は、クロックはのSystemInitで初期化されます。スタートアップファイル(startup_stm32l476xx.S)にの前にSystemInitが呼び出されます。コメントSystemInitは、PLLの入力としてMSI(4MHz)を使用して40MHzでクロックを初期化します。

システムクロックが2倍速いため、Systickの違いがわかります。

+0

こんにちはギョーム。お返事をありがとうございます。私はまだ少し混乱しています。私はSysTickがHCLKから派生したと思った。私はコピーしたコードがクロックソースを変更したと思います。私はデバッガをステップ実行し、SystemCoreClockが正しく80MHzに更新されました。私もPWMをセットアップして、その80MHzの正しいキャリア周波数を測定します。したがって、HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/ 1000); 80MHzのHCLKでSysTick割り込み時間を正しく更新する必要がありますか?問題は、HCLKを80MHzに変更しても、Systickを更新しないと、正しい速度で動作することです。私はsystickを更新すると速く実行します – Chris

+0

また、CubeMXの自動生成コードも同じSystemInit関数を呼び出し、SWで新しいプロジェクトを作成して生成されたコードとまったく同じクロックを設定するようです。その後、HAL_Init()を呼び出してからSystemClock_Config()を呼び出します。私は最初から作成されたプロジェクトとCubeMXコードの間にコードの違いは見られません。CubeMXコード:https://github.com/c-herring/testmx – Chris

関連する問題