Forum: Mikrocontroller und Digitale Elektronik STM32F207IG USART1 verweigert den Dienst


von Mark (Gast)


Lesenswert?

Hallo Leute,
versuche seit zwei Tagen die UART1 eines STM32F207 in Betrieb zu nehmen, 
doch leider macht diese keine Murx.

Könnte mir vl. dabei jemand helfen?

Init Source sieht so aus:


void  ConfigUART( unsigned long ulWantedBaud );
void  IRQHandler (void);
void  SendChar(unsigned char cChar);
void  TxeIRQnDisable();
void  TxeIRQnEnable();
unsigned char  GetTcStatus();
void  DeInitUART();
void  InitGPIO();
void  InitUSART(unsigned long ulWantedBaud);
void  InitNVIC();
void  EnableCLK();

/*  USART Defines   */
#define  RCC_USART      RCC_APB2Periph_USART1
#define  USART        USART1
#define  USART_IRQn      USART1_IRQn
#define  USART_IRQ_PRIO    20


/*   GPIO Defines  */
#define  RCC_GPIO        RCC_AHB1Periph_GPIOB
#define  PORT          GPIOB
#define  PIN_RX        GPIO_Pin_7
#define  PIN_TX        GPIO_Pin_6
#define  PIN_SOURCE_RX    GPIO_PinSource7
#define  PIN_SOURCE_TX    GPIO_PinSource6
#define  GPIO_AF        GPIO_AF_USART1




void  ConfigUART( unsigned long ulWantedBaud )
{
   EnableCLK();

   InitGPIO();

   InitUSART(ulWantedBaud);

   InitNVIC();
}

void  SendChar(unsigned char cChar)
{
  USART_SendData(  USART, cChar );            // send byte

}

void  TxeIRQnDisable()
{
  USART_ITConfig (  USART, USART_IT_TXE, DISABLE );
}
void  TxeIRQnEnable()
{
  USART_ITConfig (  USART, USART_IT_TXE, ENABLE );
}

/* unsigned char LN_IFP_GetTcStatus()
 * returns the transimmion Status of the HW Shift register
 * return: LN_TRUE: bit is set -> transmission has completed
 *        LN_FALSE: bit is not set -> transmission in Progress
 * */
unsigned char  GetTcStatus()
{

  if( USART_GetFlagStatus( USART, USART_FLAG_TC) == SET )
    return 1;
  else
    return 0;
}

void  IRQHandler (void)
{

}

void  EnableCLK()
{
  /*ENABLE GPIOB CLOCK*/
  RCC_AHB1PeriphClockCmd( RCC_GPIO, ENABLE);
  /*ENABLE USART CLOCK*/
  RCC_APB2PeriphClockCmd( RCC_USART, ENABLE);
}


void  InitGPIO()
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /*Set GPIO AF to USART RX*/
  GPIO_PinAFConfig( PORT, PIN_SOURCE_RX, GPIO_AF);
  /*Set GPIO AF to USART TX*/
  GPIO_PinAFConfig( PORT, PIN_SOURCE_TX, GPIO_AF);

  /*Config GPIO PINS as AF*/
  GPIO_InitStructure.GPIO_Pin =  PIN_TX;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init( PORT, &GPIO_InitStructure);

  /*Config GPIO PINS as AF*/
  GPIO_InitStructure.GPIO_Pin =  PIN_RX;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_Init( PORT, &GPIO_InitStructure);


}


void  InitUSART(unsigned long ulWantedBaud)
{
  USART_InitTypeDef USART_InitStructure;

  /*Set USART Config to default*/
//  USART_DeInit(USART1);

  /*Set USART Init Structure to default*/
//  USART_StructInit(&USART_InitStructure);

  /* Configuration of the UART:
     * 8 Databits
     * no parity
     * no HW Flowcontrol enabled
     * Rx and Tx enabled
     * 1 Stopbit
     * Baudrate lt. Parameter
     * Transmit Complete (TC) Interrupt enabled
     * TRANSMITBUFFER Empty (TXE) Interrupt enabled
     * Receiver Interrupt (RXNE) enabled
     * ERROR Interrupt Enabled
    */
    /* USARTx configured as follow:
      - BaudRate = 57600 baud
      - Word Length = 8 Bits
      - One Stop Bit
      - No parity
      - Hardware flow control disabled (RTS and CTS signals)
      - Receive and transmit enabled
      - TC, TXE, RXNE, ERR Interrupts activated
    */
  USART_InitStructure.USART_BaudRate = ulWantedBaud;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = 
USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART1,&USART_InitStructure);

  //USART_ITConfig ( USART2, USART_IT_TC, ENABLE );
  USART_ITConfig (  USART, USART_IT_RXNE, ENABLE );
  USART_ITConfig (  USART, USART_IT_ORE, ENABLE );
  USART_ITConfig (  USART, USART_IT_NE, ENABLE );
  USART_ITConfig (  USART, USART_IT_FE, ENABLE );
  USART_ITConfig (  USART, USART_IT_TXE, DISABLE );

  USART_ClearFlag( USART, USART_FLAG_ORE);        // IRQ zurücksetzen
  USART_ClearFlag( USART, USART_FLAG_NE);          // IRQ zurücksetzen
  USART_ClearFlag( USART, USART_FLAG_FE);          // IRQ zurücksetzen
  USART_ClearFlag( USART, USART_FLAG_RXNE);        // IRQ zurücksetzen
  //USART_ClearFlag(USART1, USART_IT_TC);          // IRQ zurücksetzen
  USART_ClearFlag( USART, USART_IT_TXE);          // IRQ zurücksetzen

}

void  InitNVIC()
{
  //NVIC_InitTypeDef NVIC_InitStructure;
  NVIC_SetPriority( USART_IRQn,  USART_IRQ_PRIO );            // 
Priorität=20
  NVIC_ClearPendingIRQ( USART_IRQn);            // Vor Aktivierung einen 
eventuell anstehenden Interrupt löschen
  NVIC_EnableIRQ( USART_IRQn);              // Uart-Interruptvektor 
freischalten

}


void  DeInitUART()
{
  USART_DeInit( USART);
}

Wäre echt dankbar für ein bischen Hilfe, da ich ansonsten noch 
ausflippe!
Verwende ich diese Initialisierung für die UART6 (hängt am gleichen Bus) 
funktionierts einwandfrei.

Danke im Voraus!

Schöne Grüße,
Mark

von STM32er (Gast)


Lesenswert?

musst du nicht noch die AFIO clock aktivieren?

von Mark (Gast)


Lesenswert?

Ja beim 32F1xx musste ich das machen, aber beim 2xx glaube ich nicht und 
wüsste auch nicht wie?

von A. B. (funky)


Lesenswert?

was heisst er macht keinen mucks?

nimm mal testweise das ganze zeugs mit dem NVIC raus. ich kämpfe auch 
gerade mit einem stm32f2 und das sorgt bei mir für probleme(da ich da 
noch nicht ganz durchblicke)

von Jim M. (turboj)


Lesenswert?

Mir ist was aufgefallen:
1
void  IRQHandler (void)
2
{
3
4
}
5
[...]
6
7
NVIC_EnableIRQ( USART_IRQn);

Falls Dein IRQ-handler leer ist und ein Interrupt ausgelöst wird, hängt 
sich das Programm im leeren Handler auf. Du musst mindestes die 
Interrupt-Bedingung auflösen (meinst ein Read oder Write auf ein 
Spezialregister im  USART, siehe Datenblatt/Manual). Ansonsten erkennt 
er beim Verlassen des Handlers, das noch ein Interrupt ansteht und 
tail-chained gleich wieder hinein...

Für den Anfang ist es eventuell einfacher, den Interrupt einfach im NVIC 
zu verbieten.

von rgl (Gast)


Lesenswert?

Hast Du das Problem gelöst?

Ich habe nämlich das gleiche Problem in grün.
USART3 und USART6 laufen perfekt.
USART1 RX (auf PA10) empfängt Daten
USART1 TX (auf PA9) High Pegel, sonst Schweigen im Walde
Stelle ich USART1 TX auf PB6 um sendet der Lümmel auch.
PA9 als GPIO gibt High und Low aus.

Keine Interrupts an, Code hängt nicht (habe ein Blinkelämpchen).

Ich weiß ehrlich gesagt nicht mehr wo ich noch suchen soll, Vorschläge 
willkommen.

Dank und Gruß,
Ralf

von Peter M. (lctromnml)


Lesenswert?

Das Selbe Problem hatte mit USART1 auf PA10 bzw. PA9 hatte ich auch auf 
dem STM32F4Discovery...schau mal in den Schaltplan, da hängt an PA9 mit 
C49 ein recht großer Kondensator C49 , könnte es daran liegen?

Jedenfalls habe ich Spannungswandler U6 und Kondensator C49 einfach mal 
rausgelötet und jetzt funktioniert der USART1 einwandfrei, aber ich bin 
mir nicht 100% sicher ob es daran lag

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.