Forum: Mikrocontroller und Digitale Elektronik Problem mit dem flashen ST-Link/ v2 und Coocox IDE


von Sven T. (theoretiker87)


Lesenswert?

Ich habe momentan das Problem, dass sich mein Mikrocontroller 
STM32F407VGT6 nicht flashen kann. Zu den Rahmenbedingungen:
-  Ich verwende CooCox zum Erstellen des C- Codes.
-  Das Flashen mache ich über den JTAG Anschluss mit dem ST-Link/ v2.
-  Die Treiber sind alle Installiert für den ST-Link V-2
       (aktuellste Version von STM)
-  Des Weiteren habe ich die Datei STLINKUSBDRIVER.dll
        in der Bin Datei von Workspace.
-  In der Coflash.exe steht der ST-Link und  auf JTAG
-  Auch die Coocox Einstellungen sind auf ST-Link und JTAG.

Wenn ich den Flash oder das Debuggen durchführen will, kommt dieser 
Fehler:

Error: Flash driver function execute timeout
     Erase:  [  0%]pc: 0x200007fc

Woran kann dies liegen??

von aSma>> (Gast)


Lesenswert?

Coocox neustarten, sonst ist dein µC tot.

Hast du einen anderen zum Testen?

von Daniel V. (Gast)


Lesenswert?

Ging es denn vorher? Wenn nicht, PLLs in der system_stm32f4xx.c 
überprüfen.

Gruß
Daniel

von Sven T. (theoretiker87)


Lesenswert?

Hallo,
Danke für die schnellen Antworten.
Dieser Mikrocontroller ist neu und wird zum erstenmal geflasht.

@ Daniel was genau soll ich in der system_stm32f4xx.c überprüfen?

Habe auch keinen anderen zum testen.

Gruß

Sven

von Daniel V. (Gast)


Lesenswert?

Sven A. schrieb:
> @ Daniel was genau soll ich in der system_stm32f4xx.c überprüfen?

Die Clocks. Ich hatte mal selber das Problem:
Beitrag "STM32F446ret6 JTAG-Problem"

Weiter unten findest Du ein möglichen Fix.

Gruß
Daniel

von Sven T. (theoretiker87)


Lesenswert?

Hallo,
Also ich habe nach geschaut und die Daten in STM32F4xx.h Stimmen. Die 
Einstellungen in sytem_stm32f4xx.c stimmen ebenso.Der Quarz hier ist 
schon bei 25 MHz.

* 5. This file configures the system clock as follows:
  *======================================================================= 
======
  *======================================================================= 
======
  *        Supported STM32F4xx device revision    | Rev A
  *----------------------------------------------------------------------- 
------
  *        System Clock source                    | PLL (HSE)
  *----------------------------------------------------------------------- 
------
  *        SYSCLK(Hz)                             | 168000000
  *----------------------------------------------------------------------- 
------
  *        HCLK(Hz)                               | 168000000
  *----------------------------------------------------------------------- 
------
  *        AHB Prescaler                          | 1
  *----------------------------------------------------------------------- 
------
  *        APB1 Prescaler                         | 4
  *----------------------------------------------------------------------- 
------
  *        APB2 Prescaler                         | 2
  *----------------------------------------------------------------------- 
------
  *        HSE Frequency(Hz)                      | 25000000
  *----------------------------------------------------------------------- 
------
  *        PLL_M                                  | 25
  *----------------------------------------------------------------------- 
------
  *        PLL_N                                  | 336
  *----------------------------------------------------------------------- 
------
  *        PLL_P                                  | 2
  *----------------------------------------------------------------------- 
------
  *        PLL_Q                                  | 7
  *----------------------------------------------------------------------- 
------
  *        PLLI2S_N                               | NA
  *----------------------------------------------------------------------- 
------
  *        PLLI2S_R                               | NA
  *----------------------------------------------------------------------- 
------
  *        I2S input clock                        | NA
  *----------------------------------------------------------------------- 
------
  *        VDD(V)                                 | 3.3
  *----------------------------------------------------------------------- 
------
  *        Main regulator output voltage          | Scale1 mode
  *----------------------------------------------------------------------- 
------
  *        Flash Latency(WS)                      | 5
  *----------------------------------------------------------------------- 
------
  *        Prefetch Buffer                        | OFF
  *----------------------------------------------------------------------- 
------
  *        Instruction cache                      | ON
  *----------------------------------------------------------------------- 
------
  *        Data cache                             | ON
  *----------------------------------------------------------------------- 
------
  *        Require 48MHz for USB OTG FS,          | Enabled
  *        SDIO and RNG clock                     |
  *----------------------------------------------------------------------- 
------
  *======================================================================= 
======
  ************************************************************************ 
******


Außer in der system_stm32f4xx.c ist sind die Daten anders. Bin mir aber 
in dieser Datei unsicher was zu verändern.

void SystemInit(void)
{
  /* FPU settings 
------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 
Full Access */
  #endif

  /* Reset the RCC clock configuration to the default reset state 
------------*/
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;

  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x24003010;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Disable all interrupts */
  RCC->CIR = 0x00000000;

#ifdef DATA_IN_ExtSRAM
  SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM */

  /* Configure the System clock source, PLL Multiplier and Divider 
factors,
     AHB/APBx prescalers and Flash settings 
----------------------------------*/
  SetSysClock();

  /* Configure the Vector Table location add offset address 
------------------*/
#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in 
Internal SRAM */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation 
in Internal FLASH */
#endif
}

/**
   * @brief  Update SystemCoreClock variable according to Clock Register 
Values.
  *         The SystemCoreClock variable contains the core clock (HCLK), 
it can
  *         be used by the user application to setup the SysTick timer 
or configure
  *         other parameters.
  *
  * @note   Each time the core clock (HCLK) changes, this function must 
be called
  *         to update SystemCoreClock variable value. Otherwise, any 
configuration
  *         based on this variable will be incorrect.
  *
  * @note   - The system frequency computed by this function is not the 
real
  *           frequency in the chip. It is calculated based on the 
predefined
  *           constant and the selected clock source:
  *
  *           - If SYSCLK source is HSI, SystemCoreClock will contain 
the HSI_VALUE(*)
  *
  *           - If SYSCLK source is HSE, SystemCoreClock will contain 
the HSE_VALUE(**)
  *
  *           - If SYSCLK source is PLL, SystemCoreClock will contain 
the HSE_VALUE(**)
  *             or HSI_VALUE(*) multiplied/divided by the PLL factors.
  *
  *         (*) HSI_VALUE is a constant defined in stm32f4xx.h file 
(default value
  *             16 MHz) but the real value may vary depending on the 
variations
  *             in voltage and temperature.
  *
  *         (**) HSE_VALUE is a constant defined in stm32f4xx.h file 
(default value
  *              25 MHz), user has to ensure that HSE_VALUE is same as 
the real
  *              frequency of the crystal used. Otherwise, this function 
may
  *              have wrong result.
  *
  *         - The result of this function could be not correct when 
using fractional
  *           value for HSE crystal.
  *
  * @param  None
  * @retval None
  */


Anders sind die
 RCC->CR |= (uint32_t)0x00000001;

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;

  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x24003010;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Disable all interrupts */
  RCC->CIR = 0x00000000;



Wenn ich die verändere kann ich dann den Mikrocontroller zerstören??


Gruss Sven

von Daniel V. (Gast)


Lesenswert?

Sven A. schrieb:
> Wenn ich die verändere kann ich dann den Mikrocontroller zerstören??

Nein. Du musst die PLLs sogar hier anpassen. Als Hilfe für die 
Berechnung der Parameter kannst Du das Clock-Konfigurationstool welche 
im Programm STM32CubeMX benutzen.

Das schlimmste was passieren kann, ist das jetzige Verhalten.


Gruß
Daniel

von Sven T. (theoretiker87)


Angehängte Dateien:

Lesenswert?

Ich habe mir Cube heruntergeladen. Auch den JTAG konfiguriert. Im Bild 
ist Clock Configuration zu sehen. Aber was soll ich da jetzt berechnen?

Auch die Änderung des Programmes:

void SystemInit(void)
{
  /* FPU settings 
------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 
Full Access */
  #endif

  /* Reset the RCC clock configuration to the default reset state 
------------*/
  /* Set HSION bit */
  RCC->CR |= (uint32_t)0x00000001;

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;

  /* Reset HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xFEF6FFFF;

  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x24003010;

  /* Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /* Disable all interrupts */
  RCC->CIR = 0x00000000;

#ifdef DATA_IN_ExtSRAM
  SystemInit_ExtMemCtl();
#endif /* DATA_IN_ExtSRAM */

Was soll ich den hier genau eintragen?

Vielen Dank für dein Antwort.

Gruß Sven

von Daniel V. (Gast)


Lesenswert?

1. Hast Du einen externen oder internen Quarz? Wenn Du einen externen 
hast, muss dieser in der Variable HSE_Value = Frequenz in Hz in der 
stm32f4xx.h einegstellt werden. Wenn nicht, ist dieses nicht notwendig.

2. Stelle alle PLLs ein in der system_stm32f4xx.c und zwar dort wo Dein 
#elif define deinControllertyp ist. Nutze die Suchfunktion und stelle 
für PLL_M=16, PLL_N=192 und PLL_P=2 die entsprechenden Werte ein.

3. Konfiguiere RCC und gebe für die Ports den Takt frei. (Infos im 
RM!!!)

4. Have a lot of fun!

Hilfreiche Links:

http://www.diller-technologies.de/stm32.html#rcc
https://stm32f4-discovery.net/2015/01/properly-set-clock-speed-stm32f4xx-devices/

Gruß
Daniel

von Daniel V. (Gast)


Lesenswert?

Was Du noch machen kannst, schnell ein Projekt mit Cube erzeugen und auf 
den Controller hochladen. Lässt sich es flashen wird es einen Fehler in 
Deinem C-Code (sehr wahrscheinlich die fehlerhafte Clock-Einstellungen 
in den o.a. Dateien).

Gruß
Daniel

von Sven T. (theoretiker87)


Angehängte Dateien:

Lesenswert?

Hallo Daniel,

zu 1. ich habe einen internen Quarz der schon auf 25 Mhz gesetzt 
ist.Siehe Bild.

zu 2. PLL_M=16, PLL_N=192 und PLL_P=2

zu 3. Die RCC sind mit den Ports verbunden und geben den Takt vor.

Es wird trotzdem der Fehler angezeigt.



Ok werde es mal mit einem Programm mit STM_ Cube probieren allerdings 
habe ich keine Erfahrung mit STM_Cube.


Grüße

Sven

von Daniel V. (Gast)


Lesenswert?

Sven A. schrieb:
> ich habe einen internen Quarz der schon auf 25 Mhz gesetzt
> ist.Siehe Bild.

HSE ist der externe Quarz. HSI ist der interne "Quarz" (ein RC-Glied). 
Der Wert steht im RM(ich glaube 16 MHz). Bitte lese das RM und die Links 
die ich Dir empfohlen habe.

Gruß
Daniel

von STler (Gast)


Lesenswert?

Sven A. schrieb:
> zu 2. PLL_M=16, PLL_N=192 und PLL_P=2

Das ist doch Quatsch. Lass Dich nicht beirren.
Wenn Du einen externen 25MHz Quarz hast, dann lass die Einstellungen so, 
wie Du sie hattest.
Die Rechnung ist ganz simpel (siehe Reference Manual):
Quarz-Takt / PLL_M * PLL_N / PLL_P.
Die Anmerkungen im RM beachten, wenn Du was Anderes einstellst.


Das Flashen muss aber auch mit falschem Programm funktionieren. Notfalls 
den Reset gedrückt halten, falls Dein Programm SW/JTAG wegkonfiguriert.

von Daniel V. (voda) Benutzerseite


Lesenswert?

STler schrieb:
> Das ist doch Quatsch. Lass Dich nicht beirren.
> Wenn Du einen externen 25MHz Quarz hast, dann lass die Einstellungen so,
> wie Du sie hattest.

Im Clock-Tree hat er den internen Quarz mit 16 MHz (HSI) konfiguriert, 
redet aber von einem externen Quarz. Wenn man einen externen Quarz 
einsetzt und diesen aktiviert (PLLCLK) dann müssen die PLL-Parameter, je 
nach gewünschten Peripherietakt, angepasst werden. Dies gilt nicht bei 
internem Quarz.

Der TO schrieb:

Sven A. schrieb:
> zu 1. ich habe einen internen Quarz der schon auf 25 Mhz gesetzt
> ist.Siehe Bild.

Das ist inkonsistent. Entweder er hat einen externen Quarz mit 25 MHz 
oder den internen RC mit 16 MHz. Leider hat er seinen  Code nicht 
hochgeladen. Glaskugel und so.

Sven A. schrieb:
> Ok werde es mal mit einem Programm mit STM_ Cube probieren allerdings
> habe ich keine Erfahrung mit STM_Cube.

Um zu prüfen ob der µC über die Wupper ist, schnell mit Cube ein Projekt 
aufziehen, Clocks konfigurieren und Code generieren und versuchen zu 
flashen. Funktioniert dies, ist es definitiv ein Fehler in deiner 
Software.

Gruß
Daniel

von B e r n d W. (smiley46)


Lesenswert?

Hol dir erst mal das STM32 ST-LINK utility und probier, ob sich der 
Programmieradapter damit ansprechen läßt:
http://www.st.com/en/embedded-software/stsw-link004.html

von Sven T. (theoretiker87)


Lesenswert?

Hallo an alle,

Vielen Dank für die Antworten.
Es funktioniert. Wichtig hier bei war es den Externen Quarz auf 8MHz zu 
setzen.

!!!!Man sollte bei so einer Progammierung genau das RM lesen.!!!!!!

Grüße

Sven

von Philipp K. (philipp_k59)


Lesenswert?

Ist zwar schon gelöst..

Ich hatte mich mal auf eigener Platine mit den LQFP48 Stm32f030c8t6 und 
Stm32f103c8t6 vergriffen..

Da die soweit Pinkompatibel sind gab es den gleichen Fehler, da musste 
ich in Coocox nur das Board umstellen. Muss man erstmal drauf kommen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.