Forum: Mikrocontroller und Digitale Elektronik STM32 - JTAG/SWD Pins direkt beim Start deaktiviern


von Jens (Gast)


Lesenswert?

Hallo Zusammen,

ich arbeite mit dem STM32 und starte so mein Programme
1
int main(void) {
2
3
  RCC_Configuration();
4
  NVIC_Configuration();
5
  GPIO_Configuration();
6
  ADC_Configuration();
7
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); // Disable JTAG/SWD so pins are availble
8
  UART_Configuration();
9
  if (SysTick_Config(SystemFrequency / 1000)) { while (1) {;} }
10
11
  // Pins aus
12
  GPIOA->BRR = (GPIO_Pin_8 | GPIO_Pin_14 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15);
13
  GPIOB->BRR = (GPIO_Pin_4 | GPIO_Pin_5);

Leider werden PA13 und PA15, die als Main-Function "JTMS/SWDIO" und 
"JTCK/SWCLK" haben beim Systemstart mit ON gestartet....
Also erst gibt es ~eine Sekunde ON auf PA13, dann schalte ich
die Pins manuell aus.

Das gibt aber Fehler bei der angeschlossenen Elektronik.
Weiß hier jemand Rat? Wie ich diese PINS direkt beim Start weg
"aus" bekomme?

Vielen Dank
Jens

von Steel (Gast)


Lesenswert?

Ähm, wo ist das Problem, der Code gehört an den Anfang bevor du dein 
ganzes anderes Konfigurationsgeraffel aufrufst. Port A aktivieren und 
ramapping einstellen.

von Jens (Gast)


Lesenswert?

Hallo,

vielen Dank. Nur gibt es überhaupt die Möglichkeit PORTA zu deaktiven 
ohne RCC und GPIO initalisiert zu haben? Ich hab mal mit meinen 
Lib-Function versucht, das kürzeste war das hier, was funktionierte
1
static void RCC_Configuration(void) {
2
3
    //ErrorStatus HSEStartUpStatus = SUCCESS;
4
5
  RCC_DeInit(); // RCC system reset(for debug purpose)
6
  RCC_HSEConfig(RCC_HSE_ON); // Enable HSE
7
  HSEStartUpStatus = RCC_WaitForHSEStartUp(); // Wait till HSE is ready
8
9
  if (HSEStartUpStatus == SUCCESS) {
10
11
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // Enable Prefetch Buffer
12
    FLASH_SetLatency(FLASH_Latency_2); // Flash 2 wait state
13
    RCC_HCLKConfig(RCC_SYSCLK_Div1);   // HCLK = SYSCLK
14
    RCC_PCLK2Config(RCC_HCLK_Div1);    // PCLK2 = HCLK
15
    RCC_PCLK1Config(RCC_HCLK_Div2);    // PCLK1 = HCLK/2
16
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4); // PLLCLK = 16MHz * 4 = 64 MHz
17
    RCC_PLLCmd(ENABLE);                // Enable PLL
18
    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } // Wait till PLL is ready
19
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Select PLL as system clock source
20
    while(RCC_GetSYSCLKSource() != 0x08) { } // Wait till PLL is used as system clock source
21
22
  } else {
23
    // If HSE fails to start-up, the application will have wrong clock configuration.
24
    // User can add here some code to deal with this error
25
    while(1) { }
26
  }
27
28
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4 |
29
                RCC_APB1Periph_USART3 , ENABLE); // RCC_APB1Periph_I2C1 |
30
31
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE |
32
               RCC_APB2Periph_USART1 | RCC_APB2Periph_ADC1  |
33
               RCC_APB2Periph_AFIO, ENABLE);
34
35
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
36
37
}
38
39
static void GPIO_Configuration(void) {
40
41
  GPIO_InitTypeDef GPIO_InitStructure;
42
43
  // SERVO OUTPUT
44
  // PA8  = SOUT1 | PA11 = SOUT2 | PA12 = SOUT3 | PA13 = SOUT4 |
45
  // PA14 = SOUT5 | PA15 = SOUT6 | PB4  = SOUT7 | PB5  = SOUT8
46
  // SOUT4 (TMS/SWDIO), SOUT6 (JTDI) , SOUT7 (JNTRST) ist beim einschalten ON
47
48
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); // Disable JTAG/SWD so pins are availble
49
50
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
51
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
52
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
53
  GPIO_Init(GPIOA, &GPIO_InitStructure);
54
  GPIOA->BRR = (GPIO_Pin_8 | GPIO_Pin_14 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15); // ServoPins aus
55
56
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
57
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
58
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
59
  GPIO_Init(GPIOB, &GPIO_InitStructure);
60
  GPIOB->BRR = (GPIO_Pin_4 | GPIO_Pin_5); // ServoPins aus
61
  
62
  //........
63
}
64
65
int main(void) {
66
67
  RCC_Configuration();
68
  GPIO_Configuration();
69
  //....
70
  
71
}

Da Probelm ist einfach, das da Modellbauservos dranhängen.
Die Bewegen sich natürlich beim Start mit Signal ON. > 2ms
ist schon Vollauschlag.

Vielen Dank
Jens

von Uwe Bonnes (Gast)


Lesenswert?

Die Auswahl der Pins gleicht dem Griff in die gefuellte Kloschuessel. 
Alle anderen GPIOs sind bis zur Initialisierung als Input hochohmig...

von moviemakers (Gast)


Lesenswert?

Hi, bei mir lassen sich die Port-Pins PA13, PA14, PA15 ebenfalls nicht 
verwenden.
PA15 ist ständig auf high und lässt sich nicht löschen, PA13 und PA 14 
geben irgendwelche Datensignale aus (Oszilloskop).
Was muss ich an meiner GPIO Config ändern, dass ich diese drei PINs 
verwenden kann?
Folgende Zeile aus obigem Beitrag hat keine Wirkung gezeigt:
[c]
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
[\c]
Meine GPIO_Configuration():
[c]
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure_A;
  GPIO_InitTypeDef GPIO_InitStructure_B;
  GPIO_InitTypeDef GPIO_InitStructure_C;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // Clock des 
Ports einschalten
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

  GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
/** Initialisierung GPIOA */
  GPIO_InitStructure_A.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure_A.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure_A.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | 
GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
/** Initialisierung GPIOB */
  GPIO_InitStructure_B.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure_B.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure_B.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
/** Initialisierung GPIOC */
  GPIO_InitStructure_C.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure_C.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure_C.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_10;

  GPIO_Init(GPIOA, &GPIO_InitStructure_A);
  GPIO_Init(GPIOB, &GPIO_InitStructure_B);
  GPIO_Init(GPIOC, &GPIO_InitStructure_C);

}
[\c]

von moviemakers (Gast)


Lesenswert?

Hilfe,
ich kann jetzt mit meinem Mikrocontroller nicht mehr kommunizieren. Der 
PC kann sich nicht mehr per SWD verbinden. Ich wollte eigentlich nur das 
die PINs verfügbar sind, s.o., jetzt kann ich nicht mal mehr 
programmieren. Wie kann ich das Programm wieder runterlöschen und wie 
mach ich es richtig?
lg.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Genau aus dem Grund mache ich solche Späße nicht...

Mal hier lesen:
Beitrag "Re: STM32 Programmiertool"

von ReinerL (Gast)


Lesenswert?

Wie kommst Du auf die Idee die Pins gleichzeitig als SWD und für eigene 
Zwecke nutzen zu können.
Eine Möglichkeit wäre über den Bootloader der seriellen Schnittstelle 
ein neues Programm einzuspielen, aber nicht vergessen die Pins wieder 
dem SWD zu überlassen.

Gruß
Reiner

von moviemakers (Gast)


Lesenswert?

Wie geht das mit dem Bootloader? Gibt es nicht eine Möglichkeit den 
Flash einfach zu löschen? Ich dachte wirklich nach dem Beitrag oben wäre 
es möglich die PINS PA13-PA15 für GPIO zu verwenden.

von Gnubbel (Gast)


Lesenswert?

Die Pins werden erst durch das Programm umgeschaltet,
wenn der Debugger einen Reset auslöst und sich dann verbindet ist der 
jeweilige Pin in der Standarteinstellung. IMHO ist dieses ist JTAG.

Durch eine Signalfolge an einem der Pins wird der Controller auf SWD 
umgeschaltet.

Das Problem mit dem Verbinden liegt mit Sicherheit an einer  anderen 
Sache.

von moviemakers (Gast)


Lesenswert?

Ok, also angenommen ich bekomme das wieder hin, die PINS PA13-15 kann 
ich definitiv nicht als GPIO Pins verwenden, sehe ich das richtig?

von Matthias K. (matthiask)


Lesenswert?

moviemakers schrieb:
> Hi, bei mir lassen sich die Port-Pins PA13, PA14, PA15 ebenfalls nicht
> verwenden.

Um überhaupt irgendwelche REMAP-Funktionen nutzen zu können, muss der 
Unit-Clock zuvor erstmal freigegeben werden.
1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);          // AFIO Takt freigeben (für Remapping)

von moviemakers (Gast)


Lesenswert?

Ja habe ich in der RCC_Config() genauso gemacht.

von moviemakers (Gast)


Lesenswert?

Ich muss ja irgendwas falsch gemacht haben, sonst würde es ja 
funktionieren.
Kann mir jemand den Code von oben so abändern dass er funktioniert und 
mich die PINS PA13-PA15 als GPIO-Pins nutzen kann. Hintergrund ist das 
ich auf einem Steckboard schon alles gemappt habe und sonst wäre das 
ganze Layout (schon fertig) für die Katz.

von Jens (Gast)


Lesenswert?

Hi,

bei mir funktioniert's genau so, wie es oben steht, nur eben
0,5Sekunden beim Start ein ON....

Weiß jemand ob ich oben die RCC vor dem Remap zeitlich
noch verkürzen kann?

Vielen Dank Jens

von Denis-Yves K. (denisyves_k)


Lesenswert?

bei deinem Code hatte ich das Problem dass die Variable 
RCC_PLLSource_HSE_Div1
nicht bekannt war. Wo muss ich die deklarieren?

von Jens (Gast)


Lesenswert?

Ich hab die Standard-Lib V3.0.1, da ist das definiert
1
/**
2
  ******************************************************************************
3
  * @file    stm32f10x_rcc.h
4
  * @author  MCD Application Team
5
  * @version V3.1.0
6
  * @date    06/19/2009
7
  * @brief   This file contains all the functions prototypes for the RCC firmware 
8
  *          library.
9
  *******************************************************************************/
10
11
// Zeile 76
12
13
/** @defgroup PLL_entry_clock_source 
14
  * @{
15
  */
16
17
#define RCC_PLLSource_HSI_Div2           ((uint32_t)0x00000000)
18
19
#ifndef STM32F10X_CL
20
 #define RCC_PLLSource_HSE_Div1           ((uint32_t)0x00010000)
21
 #define RCC_PLLSource_HSE_Div2           ((uint32_t)0x00030000)
22
 #define IS_RCC_PLL_SOURCE(SOURCE) (((SOURCE) == RCC_PLLSource_HSI_Div2) || \
23
                                   ((SOURCE) == RCC_PLLSource_HSE_Div1) || \
24
                                   ((SOURCE) == RCC_PLLSource_HSE_Div2))
25
#else
26
 #define RCC_PLLSource_PREDIV1            ((uint32_t)0x00010000)
27
#define IS_RCC_PLL_SOURCE(SOURCE) (((SOURCE) == RCC_PLLSource_HSI_Div2) || \
28
                                   ((SOURCE) == RCC_PLLSource_PREDIV1))
29
#endif /* STM32F10X_CL */

Vielleicht ist das bei neueren StandLibs (? :)) wieder etwas anders 
geworden.

von moviemakers (Gast)


Lesenswert?

Also wenn mal wirklich jemand den gleichen Fehler hat wie ich und den 
Flash vom STM32 nicht mehr überschreiben kann geht wie folgt vor:

1. Resettaste drücken und gedrückt halten
2. USB-Kabel ziehen
3. USB-Kabel wieder anstecken und Reset Taste loslassen
4. Debug Mode starten
5. Warten auf das Evaluation Mode Fenster
6. Ok drücken und sofort ganz kurz Reset, dann könnt ihr wieder flashen, 
aber dann hoffentlich nicht wieder den selben Mist.

lg moviemakers.

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.