sobota, 31 maja 2014

STM32F429i-discovery -UART

Witajcie!
Dzisiaj sobie przedstawimy chyba najbardziej popularny sposób komunikacji
procka z otoczeniem - w naszym przypadku będzie to płytka STM32F429i- Discovery + przejściówka FT232RL, a dane powędrują na  terminal, który został opisany w jednym z postów wcześniej.
Protokołu komunikacji RS232 oczywiście nie będę tutaj opisywał jest tego masa w necie,
wujek google wyświetli masę wiadomości o tym.
Ramka oczywiście będzie wyglądała standardowo 8n1 - czyli 8 bitów danych, bez bitów parzystości
z jednym bitem stopu. Prędkość transmisji ustawimy sobie na 115200 (baudrate).

Jeśli chodzi o nasza płytkę to zawiera ona 8 uartów, my skorzystamy z pierwszego. Piny
nadawczy i odbiorczy są na porcie A odpowiednio TX - PA9, RX - PA10. I tak należy
podpiąć przewodzikami nasz zestaw z przejściówką USB/RS232 FT232RL.
Aha ważna informacja - standard napięć jakie panują na pinach naszej płytki to 3,3V,
należy o tym pamiętać!!!.

Link do projektu w CooCoxie zamieszczę na końcu artykułu, będzie sobie go można
pobrać i testować.

Generalnie omówię tutaj plik main.c. Pliki uart.h i uart.c będą zawierały komentarze
więc będzie się można lepiej z nimi zapoznać.

#include "main.h"
#include "stm32_ub_uart.h"


void Delay(volatile uint32_t nCount);

int main(void)
{
  UART_RXSTATUS_t check;
  char rx_buf[RX_BUF_SIZE];

  SystemInit();

  // inicjalizacja UART (COM1 : TX=PA9, RX=PA10)
  UB_Uart_Init();


  while(1)
  {
    }
   UB_Uart_SendString(COM1, "WITAJ SWIECIE\r\n");
   Delay(10000000);
  }
}
void Delay(volatile uint32_t nCount) { // funkcja opóźniająca
  while(nCount--)
  {
  }
}
Jak widać plik jest bardzo czytelny i nie zawiera wiele kodu.
Na początku deklarujemy funkcję, która wprowadzi nam opóźnienie do wysyłania
informacji na terminal. W ciele tej funkcji po każdym biegu pętli odliczamy wartość
jaką wprowadzamy do niej jako parametr.
Zmianna typu UART_RXSTATUS_t określa status bufora, w tej części artykułu
jeszcze nie będzie nam potrzebna. Następnie deklarujemy nasz bufor odbiorczy.
Jest on wielkości 50 bajtów. Jego rozmiar określa się w pliku uart.h. W pętli
głównej co około 100ms wysyłamy string "WITAJ ŚWICIE" zakończony znakami
powrotu karetki oraz nowej linii,


W następnej części zmodyfikujemy nasz kod w pętli głównej, tak aby po wysłaniu
odpowiedniej komendy np: literki "a" zaświeciła nam się dioda na naszej płytce.
Oczywiście modyfikacji będzie wymagał nasz terminal. Dodamy mu funkcję wysyłania
danych za pomocą buttona.

Link to projektu.

Przyjemnej zabawy:)

2 komentarze:

  1. witaj, mam problem z usartem w discovery Disco
    tak wygląda cała konfiguracja związana z obsługą:
    GPIO_InitTypeDef GPIO_InitStruct;
    USART_InitTypeDef USART_InitStruct;
    NVIC_InitTypeDef NVIC_InitStructure;
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_USART2);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_USART2);


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);


    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &GPIO_InitStruct);


    USART_InitStruct.USART_BaudRate = 9600;
    USART_InitStruct.USART_WordLength = USART_WordLength_8b;
    USART_InitStruct.USART_StopBits = USART_StopBits_1;
    USART_InitStruct.USART_Parity = USART_Parity_No;
    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
    USART_Init(USART2, &USART_InitStruct);



    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    USART_Cmd(USART2, ENABLE);
    próbuje wysłać dane w ten sposób
    USART_SendData(USART2, '1');
    ale nic się nie dzieje ;/
    do pinow PA2 i PA3 mam podlaczony bluetooth btm-222
    ktory jest ustawiony jako master i łączy sie z innym bluetoothem HC-06
    który jest jako slave
    niestety komunikacja nie dziala

    OdpowiedzUsuń
  2. Witaj!
    Sprawdź najpierw czy masz komunikację procka z PC za pomocą przejściówki RS232.
    Upewnij się czy piny są odpowiednio skrosowane. Sprawdź czy prędkość transmisji po obu stronach jest taka sama. Sprawdź format ramki czy też się zgadza. Jeśli dane będą lecieć na terminal w tedy naleź sprawdzić połączenie między prockiem a modułem BT. Zwykle moduły BTM222 konfiguruje się za pomocą komend AT. Moduł tez można podłączyć do przejściówki i przez terminal go odpowiednio skonfigurować.

    OdpowiedzUsuń