Forum: Mikrocontroller und Digitale Elektronik Noch ein STM32F303 USART3 geht nicht


von Markus G. (the_grue)


Lesenswert?

Servus,

Im Forum gibt's ja schon ein paar "Mein USART geht nicht"-Posts - leider 
hat mir keiner geholfen. In denen, die ich gefunden habe lag's z.B. am 
fehlenden RCC_APB2Periph_AFIO oder falsch eingestellten alternate 
functions GPIO_Mode_AF_PP. Beides kennt meine Version der st-lib nicht. 
Ich finde meinen Fehler einfach nicht. Eigendlich sollte PB10 wackeln, 
tut er aber nicht:
1
  INTERRUPTS_OFF();
2
3
  //Define all of the periphals we use.
4
  uint32_t apb1Peripherals = ( RCC_APB1Periph_PWR  |
5
                               RCC_APB1Periph_USART3
6
                                 );
7
  uint32_t apb2Peripherals = ( 0 );
8
  uint32_t ahbPeripherals = ( RCC_AHBPeriph_GPIOA |
9
                              RCC_AHBPeriph_GPIOB |
10
                              RCC_AHBPeriph_GPIOC);
11
12
  //Enable clocks to all of our peripherals.
13
  RCC_APB1PeriphClockCmd(apb1Peripherals, ENABLE);
14
  RCC_APB2PeriphClockCmd(apb2Peripherals, ENABLE);
15
  RCC_AHBPeriphClockCmd(ahbPeripherals, ENABLE );
16
17
  //Allow access to BKP Domain
18
  PWR_BackupAccessCmd(ENABLE);
19
20
  //De-initialize our peripherals here so each module only has to
21
  //worry about initializing them as needed.  DeInit works by toggling
22
  //PeriphResetCmd enable/disable.
23
  EXTI_DeInit();
24
25
  GPIO_DeInit(GPIOA);
26
  GPIO_DeInit(GPIOB);
27
  GPIO_DeInit(GPIOC);
28
  GPIO_DeInit(GPIOD);
29
30
  USART_DeInit(USART3);
31
32
  //Configure USART TX GPIO as alternate function push-pull
33
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
34
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10;
35
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
36
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
37
  GPIO_Init(GPIOB, &GPIO_InitStructure);
38
  GPIO_PinAFConfig(GPIOB, GPIO_Pin_10, GPIO_AF_7);
39
40
  //Configure USART RX GPIO as input floating
41
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
42
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
43
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
44
  GPIO_Init(GPIOB, &GPIO_InitStructure);
45
  GPIO_PinAFConfig(GPIOB, GPIO_Pin_11, GPIO_AF_7);
46
47
  //Configure USART (but without enabling it)
48
  USART_InitStructure.USART_BaudRate = 9600;
49
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
50
  USART_InitStructure.USART_Parity = USART_Parity_No;
51
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
52
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
53
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
54
  USART_Init(USART3, &USART_InitStructure);
55
56
  USART_Cmd(USART3, ENABLE);
57
58
  INTERRUPTS_ON();  // Safe to enable interrupts at this point
59
60
  while( true )
61
  {
62
      while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
63
      USART_SendData(USART3, 0xAA);
64
      while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
65
      USART_SendData(USART3, 0x55);
66
  }

Könnt Ihr mir bitte von der Leitung helfen auf der ich stehe?
Danke :)

von Der (überall) Ausländer (Gast)


Lesenswert?

Zeile 42, in Zeile 42 schauen, da ist die Lösung

von Markus G. (the_grue)


Lesenswert?

Egal ob das Scherz oder Hilfe ist, beides verstehe ich nicht :(

Zeile 42 wäre:
1
  //Configure USART RX GPIO as input floating
2
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
3
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;       // 42
4
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
5
  GPIO_Init(GPIOB, &GPIO_InitStructure);
6
  GPIO_PinAFConfig(GPIOB, GPIO_Pin_11, GPIO_AF_7);

Da wird RxD auf PB11 konfiguriert - es kommt aber bei TxD nix raus...

(Die Anspielung auf THGTTG verstünde ich wohl, wäre nur nicht 
hilfreich.)

von Der (überall) Ausländer (Gast)


Lesenswert?

nicht 10 und 11 bei AF7?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Ich muss sagen, das ich mit den F3 nix mache, sondern nur mit den F4. Da 
sieht meine Senderoutine so aus:
1
#define USART USART3
2
void uart_put(char data){
3
 while (USART_GetFlagStatus(USART, USART_FLAG_TC) == RESET) {};
4
 USART_SendData(USART, (uint8_t) data);
5
}

Ist
1
GPIO_PinAFConfig(GPIOB, GPIO_Pin_11, GPIO_AF_7);
 über jeden Verdacht erhaben? Also ist die AF7 Schiene auch wirklich die 
richtige für USART3 und ist GPIO_Pin_11 auch wirklich die Source? Bei 
mir heissen die Dinger z.B. 'GPIO_PinSource2'?
Ich poste (nur zum Vegleichen) einfach meine USART Init:
1
// aus setup.h
2
/* USART Definitions */
3
#define USART_TX_PIN       GPIO_Pin_2
4
#define USART_RX_PIN      GPIO_Pin_3
5
#define USART_TX_SOURCE      GPIO_PinSource2
6
#define USART_RX_SOURCE      GPIO_PinSource3
7
#define USART          USART2
8
#define USART_PORT        GPIOA
9
// aus main.c
10
11
void USARTInit(uint32_t baudrate) {
12
GPIO_InitTypeDef GPIO_InitStructure;
13
USART_InitTypeDef USART_InitStructure;
14
// Clock Enable of usart pins
15
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
16
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
17
RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, ENABLE);
18
RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2, DISABLE);
19
GPIO_PinAFConfig(USART_PORT, USART_RX_SOURCE, GPIO_AF_USART2);
20
GPIO_PinAFConfig(USART_PORT, USART_TX_SOURCE, GPIO_AF_USART2);
21
22
GPIO_InitStructure.GPIO_Pin = USART_TX_PIN;
23
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
24
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
25
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
26
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
27
GPIO_Init(USART_PORT, &GPIO_InitStructure);
28
GPIO_InitStructure.GPIO_Pin =  USART_RX_PIN; 
29
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
30
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
31
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
32
GPIO_Init(USART_PORT, &GPIO_InitStructure);
33
/* Configure USART)
34
 *
35
 */
36
USART_DeInit(USART);
37
USART_StructInit(&USART_InitStructure);
38
USART_InitStructure.USART_BaudRate = baudrate;
39
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
40
USART_InitStructure.USART_StopBits = USART_StopBits_1;
41
USART_InitStructure.USART_Parity = USART_Parity_No;
42
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
43
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
44
USART_Init(USART,&USART_InitStructure);
45
/* Enable USART */
46
USART_Cmd(USART, ENABLE);
47
48
}
Den Formalkrams mache ich nur, damit ich das schnell mal auf andere Pins 
umbiegen kann.

: Bearbeitet durch User
von Markus G. (the_grue)


Lesenswert?

Matthias S. schrieb:
> Bei
> mir heissen die Dinger z.B. 'GPIO_PinSource2'?

Bei mir jetzt auch, seitdem geht's :)

Vielen Dank!
Markus

von fibonacci de gogolores (Gast)


Lesenswert?

Unglaublich !!!

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.