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
Ja beim 32F1xx musste ich das machen, aber beim 2xx glaube ich nicht und wüsste auch nicht wie?
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)
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.