mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32F103ZE UART geht nicht


Autor: thilich (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kriege einfach den UART nicht zum Laufen. Das komische ist, das im 
Debugger keinerlei Wert im UART Datenregister erscheint. Probiere schon 
5 Stunden. hat jemand ein Tip ?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man schaltet den Controller erst auf HSE drauf, wenn der auch sicher 
läuft. Nicht schon dann, wenn der ganz sicher noch nicht läuft.

Autor: Vorname N. (vorname_n)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hilfreich ist auch die Firmware Library von ST.
In dem Paket sind auch einige Beispiele.

http://www.st.com/internet/com/SOFTWARE_RESOURCES/...

Autor: thilich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo, danke . Trotz des Fehlers arbeitet der HSE. An ihm liegts nicht...

Autor: Michael G. (let)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Müssen RX+TX nicht noch auf die Ports gemapped werden (AFIO)?

Autor: Roman H. (chumarik)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define USART2_TX_BUFFER_SIZE 20
uint8_t usart2_tx_buffer[USART2_TX_BUFFER_SIZE];
//#define USART2_DR_BASE_ADDRESS  0x40013804    //Fall du ein USART1 
Benutzen willst
#define USART2_DR_BASE_ADDRESS  0x40004404

#define USART2_TX_PIN      GPIO_Pin_2
#define USART2_RX_PIN      GPIO_Pin_3
#define USART2_PORT        GPIOA
#define USART2_TX_DMA_CHANNEL  DMA1_Channel7
#define USART2_TX_DMA_FLAG    DMA1_FLAG_TC7
#define USART2_RX_DMA_CHANNEL  DMA1_Channel6
#define USART2_RX_DMA_FLAG    DMA1_FLAG_TC6
//#define USART1_DR_BASE_ADDRESS  0x40013804 
////////////////////////////////////
#define USART2_DR_BASE_ADDRESS  0x40004404




void RCC_Configuration(void)
{

  /* GPIOA clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  /* GPIOB clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  /* GPIOC clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  /* GPIOD clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
  /* GPIOE clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
  /* GPIOF clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);
  /* GPIOG clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
  /* Alternate Function I/O clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

   /* Enable DMA1 and DMA2 clocks */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_DMA2, 
ENABLE);

  /* USART2 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

}


void GPIO_Configuration(void)
{
  GPIO_InitStructure.GPIO_Pin = USART2_TX_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_Init(USART2_PORT, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = USART2_RX_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(USART2_PORT, &GPIO_InitStructure);
}


void DMA_Configuration(void)
{
  /* USART1 TX DMA1 Channel (triggered by USARTy Tx event) Config */
  /* Deinitializes the USART1_TX_DMA_CHANNEL registers to their default 
reset values. */
  DMA_DeInit(USART2_TX_DMA_CHANNEL);
  DMA_InitStructure.DMA_PeripheralBaseAddr = USART2_DR_BASE_ADDRESS;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)usart2_tx_buffer;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = USART2_TX_BUFFER_SIZE;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = 
DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(USART2_TX_DMA_CHANNEL, &DMA_InitStructure);
}

void USART2_Configuration(void)
{
  USART_InitStructure.USART_BaudRate = 115200;
  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;

  /* Initialize USART2 */
  USART_Init(USART2, &USART_InitStructure);

}



//-------------
// Damit kannst du auch ohne DMA USART benutzen.

void USART2_Send_Char(char byte){
  /* wait until transmit buffer is empty */
  while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
  /* send the byte */
  USART_SendData(USART2, (uint8_t) byte);
}


void USART2_Send_String(char *string){
  while(*string){
    USART2_Send_Char(*string);
    string++;
  }
}




// Aufruf in deinem MAIN.C

  /* Clock */
  RCC_Configuration();

  /* General Purpose Inputs and Outputs*/
  GPIO_Configuration();

  /* Direct Memory Access */
  DMA_Configuration();

  USART2_Configuration();

  /* Enable USART2 DMA Rx and TX request */
  USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE);


  /* Enable the USART2 */
  USART_Cmd(USART2, ENABLE);

//Aufruf ohne DMA
  USART2_Send_Char((char)(DeineVariable1));
  USART2_Send_Char((char)DeineVariable2);
  USART2_Send_String("\r\n");

//Aufruf mit DMA

  while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);

  usart2_tx_buffer[1] = 'I';
  memcpy(usart2_tx_buffer + 2, &values.timestamp, 16);
  USART2_TX_DMA_CHANNEL->CCR &= CCR_ENABLE_Reset;
  USART2_TX_DMA_CHANNEL->CMAR = (uint32_t) usart2_tx_buffer;  //Kannst 
du anderen String anhängen
  USART2_TX_DMA_CHANNEL->CNDTR = USART2_TX_BUFFER_SIZE;    //anzahl von 
Elementen, die gesendet werden sollen
  USART2_TX_DMA_CHANNEL->CCR |= CCR_ENABLE_Set;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.