Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[stm32][gcc] Problem z UARTami 2 i 3

popkorn 22 Nov 2010 18:36 1581 4
Tespol
  • #1
    popkorn
    Level 9  
    Witam,

    Od niedawna zajmuje sie dlubaniem w STM32. Natknalem sie na problem z uruchomieniem UARTow 2 i 3 na STM32F103RBT6.
    UART1 dziala, szyna APB1 chodzi na 36 Mhz.

    UARTa konfiguruje nastepujaco:

    sGPIORxInit.GPIO_Pin = GPIO_Pin_3;
    sGPIOTxInit.GPIO_Pin = GPIO_Pin_2;
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE);
    sGPIORxInit.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init( GPIOA, &sGPIORxInit);

    sGPIOTxInit.GPIO_Speed = GPIO_Speed_10MHz;
    sGPIOTxInit.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init( GPIOA, &sGPIOTxInit);
    USART_Init(USART2, &sUartInitStruct);

    USART_Cmd(USART2, ENABLE);

    // wysylanie standardowo
    USART_SendData( USART2, a_u8Data);

    while( USART_GetFlagStatus( USART2, USART_FLAG_TXE) == RESET)
    {
    }

    o ile na USART1 to dziala to na 2 i 3 nie. Czy ktos mialby moze jakis pomysl dlaczego?
    Kamery 3D Time of Flight - zastosowania w przemyśle. Darmowe szkolenie 16.12.2021r. g. 10.00 Zarejestruj się
  • Tespol
  • #2
    gaskoin
    Level 38  
    a ustawiłeś tak mało istotną rzecz jak baudrate ? AFIO niepotrzebne, chyba, że gdzieś indziej używasz.

    Spróbuj tak:

    Code:

    #define USART2_TX_PIN 2
    #define USART2_RX_PIN 3
    #define FREQUENCY jakitamsobiemaszzegar
    #define BAUD jakitamchceszsobiemiec

    RCC->APB2ENR = RCC_APB2ENR_IOPAEN;
    RCC->APB1ENR = RCC_APB1ENR_USART2EN;
    GPIOA->CRL = (4 << (USART2_RX_PIN*4)) | (9 << (USART2_TX_PIN*4)); // rx - input floating, tx - af push pull 10mhz
    USART2->BRR = FREQUENCY/BAUD;
    USART2->CR1 |= USART_CR1_TE | USART_CR1_RE;
    USART2->CR1 |= USART_CR1_UE;            // enable USART


    i zobacz czy działa
  • Tespol
  • #3
    popkorn
    Level 9  
    tak na 9600,no parity, hwflow control none, 8 bitow danych, 1 bit stopu

    usartSetParams( &sUartInitStruct, a_u32BaudRate, a_u8DataBits
    , a_eParity, a_eStopBits, a_eFlowControl

    zrobilem sobie funkcje uzupelniajaca strukture, dziala, bo widze to w logach, co sobie porobilem.

    23-11-2010 - Zrobilem jak radziles. W sumie niby podobnie jak w bibliotekach i niestety dalej, jest problem.
    Zrobilem sobie loopa na tych pinach, sprawdzalem rowniez polaczeniez UART1 (ktory chodzi) i niestety dalej.
    No nic pewnie jakis glupi blad, bede szukal dalej no i jesli jakis pomysl by sie pojawil to zapraszam.

    Pozdrawiam i dziekuje za pomoc,
    Slawek.
  • #4
    csdominik
    Level 11  
    Witam a jak dochodzisz do wniosku że USART2 nie działa? Podłączyłeś oscyloskop czy jakieś urządzenie?
    Myślę, że jeśli podczas startu procesor nie zapętla Ci się w oczekiwaniu na jakąś flagę w związku z USART2/3 (można to podejrzeć debugując program), to jest to zapewne nadpisanie inicjalizacji lub błędna inicjalizacja portu GPIO. Nie znam blibliotek których używasz, ale jakoś mało konsekwentnie działasz, najpierw inicjujesz piny GPIO, później włączasz jakieś clock'i (RCC) żeby w następnej linii znowu robić coś z GPIO. Na 1 rzut oka masz tak samo zdefiniowane Tx jak Rx

    Upewnij się że Rx masz jako "input floating" (GPIO_Mode_IN_FLOATING) a Tx jako "alternate function push-pull" (GPIO_Mode_AF_PP). Taktowanie może być na 50Mhz.
    Możesz poczytać też o programowym Remappingu. Wtedy wyeliminujesz opcję - zepsutego wyprowadzenia.

    Update:
    A twój program przerobiłbym w ten sposób:

    Quote:

    //ta czesc do RCC_configuration
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE);

    // to do GPIO_configuration
    sGPIORxInit.GPIO_Pin = GPIO_Pin_3; // to jest Rx
    sGPIOTxInit.GPIO_Speed = GPIO_Speed_10MHz; // tutaj ewentualnie 50Mhz
    sGPIORxInit.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init( GPIOA, &sGPIORxInit); // nie jestem pewny ale to wrzuca pewnie ustawienia dla GPIOA

    sGPIOTxInit.GPIO_Pin = GPIO_Pin_2; // to jest Tx
    sGPIOTxInit.GPIO_Speed = GPIO_Speed_10MHz; // tutaj ewentualnie 50Mhz
    sGPIOTxInit.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init( GPIOA, &sGPIOTxInit);

    // a to do USART_configuration
    USART_Init(USART2, &sUartInitStruct);
  • #5
    popkorn
    Level 9  
    Witam,

    Dzieki za pomoc. Jesli chodzi o brak konsekwencji to jest fragment wiekszej calosci, chcialem tylko pokazac jak inicjalizuje UARTy.
    Znalazlem blad. Robie funkcje dosc mocno generyczne i okazalo sie, ze inicjalizacji i przy wysylaniu/odbieraniu, mam funkcje translacji numeru UARTa na adres zamienilem ze soba parametry w definicji i deklaracji funkcji. Kompilator niestety nie zlapal tego tylko skompilowal :( "PutChar( usartNo, data)"

    Pozdrawiam i dziekuje,
    Slawek.