Forum: Mikrocontroller und Digitale Elektronik STM32 - USART und PORT WRITE


von mmm (Gast)


Lesenswert?

Hallo,

wenn eich auf einem STM32 den USART 1 (hier PIN A9+A10) verwende.
darf ich dann mit GPIOA->ODR=0x....; einen beliebigen Wert auf den Port 
schreiben, oder beeinflusst das den USART?

Bin ich dann gezwungen GPIOA->BSRR und GPIOC->BRR zu verwenden?
Oder beeinflusst das den USART nicht wenn ich in das Datenregister der 
verwendeten USART-Pins schreibe?

Danke

von Marvin M. (Gast)


Lesenswert?

Moin,

um den USART nutzen zu können, musst du auf den TX/RX-Pins die 
"Alternate Function" einschalten - dann sind diese beiden Ports IIRC 
nicht mehr mit dem ODR beeinflussbar.
Allerdings würde ich die modifizierung des Ports mit den BRR/BSRR 
-Registern empfehlen, denn diese Operationen sind atomar - während der 
Zugriff auf das ODR i.A. nicht atomar ist (es sei denn, der Compiler 
setzt Bit-Banding um).
Nicht vergessen: Immer schön die Clocks der Peripherie vor dem ersten 
Zugriff einschalten ;)

von Peter (Gast)


Lesenswert?

Hi,
falls es dir hilft ein Bsp. unter verwendung der Std Peripheral Lib
1
void Usart_Config (void) {
2
  
3
  USART_InitTypeDef USART_Init_Struct;
4
  NVIC_InitTypeDef NVIC_Init_Struct;
5
  GPIO_InitTypeDef GPIO_Init_Struct;
6
  
7
  /* Clocks der Pins einschaltem */
8
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
9
  
10
  /* USART Clock einschalten */
11
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
12
  
13
  /* PIN6 als USART1 Tx */
14
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1);
15
  
16
  /* PIN7 als USART1 Rx */
17
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource7 , GPIO_AF_USART1);
18
  
19
  /* Konfiguration der USART1 RX TX Pins Alternitiv Function */
20
  GPIO_Init_Struct.GPIO_Mode = GPIO_Mode_AF;
21
  GPIO_Init_Struct.GPIO_Speed = GPIO_Speed_40MHz;
22
  GPIO_Init_Struct.GPIO_OType = GPIO_OType_PP;
23
  GPIO_Init_Struct.GPIO_PuPd = GPIO_PuPd_UP;
24
  GPIO_Init_Struct.GPIO_Pin = GPIO_Pin_6;
25
  GPIO_Init(GPIOB, &GPIO_Init_Struct);
26
  
27
  GPIO_Init_Struct.GPIO_Pin = GPIO_Pin_7;
28
  GPIO_Init(GPIOB, &GPIO_Init_Struct);
29
30
  /* USART Einstellungen*/
31
  /*
32
  - Baud Rate = 4800 baud  
33
  - Länge = 8 Bits
34
  - ein Stop Bit
35
  - keine parity
36
  - kein RTS and CTS
37
  - Receive und Transmit
38
  */
39
  USART_Init_Struct.USART_BaudRate = 4800;
40
  USART_Init_Struct.USART_WordLength = USART_WordLength_8b;
41
  USART_Init_Struct.USART_StopBits = USART_StopBits_1;
42
  USART_Init_Struct.USART_Parity = USART_Parity_No;
43
  USART_Init_Struct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
44
  USART_Init_Struct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx ;
45
  USART_Init(USART1, &USART_Init_Struct);
46
  
47
  /* UART Interrupt Konfiguration */
48
  /* Priorität 2*/
49
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
50
  
51
  /* Interrupchanel einstellen */
52
  NVIC_Init_Struct.NVIC_IRQChannel = USART1_IRQn;
53
  NVIC_Init_Struct.NVIC_IRQChannelPreemptionPriority = 0;
54
  NVIC_Init_Struct.NVIC_IRQChannelSubPriority = 0;
55
  NVIC_Init_Struct.NVIC_IRQChannelCmd = ENABLE;
56
  NVIC_Init(&NVIC_Init_Struct);
57
  
58
//USART_ITConfig (USART1, USART_IT_TXE, ENABLE); 
59
  USART_ITConfig (USART1, USART_IT_RXNE, ENABLE); // RX register Not Empty - etwas wurde empangen
60
  
61
  bufFill = 0; txPtr = 0;
62
  
63
  
64
  /* Enable USART */
65
  USART_Cmd(USART1, ENABLE);
66
}

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.