GPIO- und Taktkonfiguration von STM32F427VG

Ich bin sehr neu in STM32-Projekten und schreibe zum ersten Mal ein Programm mit STM32. Früher habe ich mit AVR programmiert und jetzt sollte ich zu STM32 übergehen. Ich habe ein Board mit STM32F427VG ohne externes XTAL. Ich habe den folgenden Code geschrieben, um eine einfache LED blinken zu lassen:

#include "stm32f4xx_conf.h"
#include "stm32f4xx.h"
int main(void)
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    GPIO_InitTypeDef GPIO_InitDef; //Where GPIO_InitDef is variable to work with struct
    GPIO_InitDef.GPIO_Pin = GPIO_Pin_4 ;
    GPIO_InitDef.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitDef.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitDef);
    GPIO_SetBits(GPIOA, GPIO_Pin_4);
    GPIO_ResetBits(GPIOA, GPIO_Pin_4);
    int i;


  while(1)
  {
    GPIO_SetBits(GPIOA, GPIO_Pin_4);
    for (i = 0; i < 500000; i++);
    GPIO_ResetBits(GPIOA, GPIO_Pin_4);
    for (i = 0; i < 500000; i++);

  }
}

Ich benutze Embitz, um meinen Code zu kompilieren. Um die interne Uhr zu konfigurieren, verwende ich die folgende Konfiguration:

Geben Sie hier die Bildbeschreibung ein

Dann drücke ich auf Ausführen und dann auf Generieren. Dann kopiere ich die generierte system_stm32f4xxDatei und ersetze sie durch die Standarddatei system_stm32f4xxim Projekt.

Allerdings kann ich keine Änderung an der LED feststellen.

Ich weiß, dass ich in STM32-Projekten sehr neu bin, daher ist diese Frage höchstwahrscheinlich für jeden sehr einfach. Danke falls mir jemand hilft das Problem zu finden.

Ich habe nicht genug Repräsentanten, um hier einen Kommentar abzugeben, aber sind Sie sicher, dass der Compiler Ihre „Verzögerungsschleifen“ nicht optimiert, sodass die LED tatsächlich schneller blinkt, als Sie sehen können?
Optimierung ist wahrscheinlich das Problem, dies sollte sowieso mit Schlafaufrufen codiert werden, um unabhängig von der Prozessorgeschwindigkeit zu sein.
Ich sehe im Code nicht, wo Sie die Systemuhr mit Systeminitcall oder ähnlichem initialisieren, dann müssen Sie den Systick-Handler handhaben, sonst können Sie bis Weihnachten warten und nichts wird passieren. :)

Antworten (2)

Sie müssen mehr tun, als die stm32f4xx-Datei zu ersetzen. Siehe http://clockspeeds.blogspot.com/2013/01/stm32f4-discovery-clock-frequency.html . Insbesondere müssen Sie an der Datei startup_stm32f4xx.c arbeiten.

Von dieser Seite:

> STEP 3: In stm32f4xx.h file ensure HSE (external clock) value is 8 MHz
> 
> 
> #if !defined  (HSE_VALUE)   #define HSE_VALUE    ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
> #endif /* HSE_VALUE */
> 
> 
> STEP 4: In startup_stm32f4xx.c file change comment on SystemInit()
> function
> 
> 
> /*----------Function
> prototypes-----------------------------------------------*/ extern int
> main(void);           /*!< The entry point for the application.    */
> //extern void SystemInit(void);    /*!< Setup the microcontroller
> system(CMSIS) */ void Default_Reset_Handler(void);   /*!< Default
> reset handler                */ static void Default_Handler(void); 
> /*!< Default exception handler            */
> 
> to
> 
> /*----------Function
> prototypes-----------------------------------------------*/ extern int
> main(void);           /*!< The entry point for the application.    */
> extern void SystemInit(void);    /*!< Setup the microcontroller
> system(CMSIS) */ void Default_Reset_Handler(void);   /*!< Default
> reset handler                */ static void Default_Handler(void); 
> /*!< Default exception handler            */
> 
> STEP 5: On the same file down under there will be a function
> 
> void Default_Reset_Handler(void)
> 
> after assembly code towards the end add a line of code calling
> SystemInit() BEFORE calling main() ie, change to
> 
> SystemInit(); main();
> 
> That`s it! now in main function we can add 
> 
> RCC_HSEConfig(RCC_HSE_ON); while(!RCC_WaitForHSEStartUp()) { }
wo ist "startup_stm32f4xx.c" Ich kann es auf embitz nicht finden. Ich weiß, dass diese Datei in Keil war, aber ich kann sie auf embitz nicht finden
Embitz kenne ich nicht

Sie müssen die CubeMX-Software verwenden, die für die Hardwarecodegenerierung für die STM32-MCU-Familie entwickelt wurde. Sie können die Systemuhr, gpio, spi, Ethernet usw. mit seiner GUI einfach einstellen.

http://www.st.com/en/development-tools/stm32cubemx.html