LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

Bluetoothowy moduł BTM222 i STM32

Na listingu 1 przedstawiono fragment głównego programu. Na początku jest wykonywana inicjalizacja wykorzystywanych modułów peryferyjnych mikrokontrolera, następnie jest konfigurowany moduł Bluetooth (nazwa oraz kod PIN), natomiast w nieskończonej pętli są obsługiwane komunikaty odbierane z terminala.

List. 1

int main(void) 
{
  Configuration_RCC();
  Configuration_GPIO(); 
  Configuration_BTM222(); 
  Configuration_Interrupts(); 
  //ustawienie nazwy 
  SendDataToBTM222("ATN=BT Led\r"); 
  //odczekanie na komunikat zwrotny 
  while((RxBuffer[RxCounter - 2] != '\r') && (RxBuffer[RxCounter - 1] != '\n')){}; 

  //ustawienie pinu 
  SendDataToBTM222("ATP=9999\r"); 
  //odczekanie na komunikat zwrotny 
  while((RxBuffer[RxCounter - 2] != '\r') && (RxBuffer[RxCounter - 1] != '\n')){}; 

  //zresetowanie układu po wprowadzeniu zmian nazwy i pinu 
  Reset_BTM222(); 
  while(1) 
  { 
    //obsługa odebranych komunikatów 
    . . . 
  } 
} 

Wprowadzenie zmian nazwy i kodu PIN jest realizowane przy użyciu odpowiednich komend AT. Po każdym wprowadzeniu polecenia program oczekuje na komunikat zwrotny, który kończy się dwoma znakami: powrotem karetki oraz znakiem nowej linii. Po wprowadzeniu zmian układ jest zerowany poprzez chwilowe wystawieni stanu niskiego na pin nRES modułu (odpowiada za to funkcja Reset_BTM222()).
Uwagę należy zwrócić także na funkcję inicjalizującą Configuration_BTM222(void), jest ona odpowiedzialna za skonfigurowanie transmisji pomiędzy mikrokontrolerem a modułem Bluetooth przy użyciu transmisji szeregowej UART. Funkcja ta została przedstawiony na listingu 2.

List. 2

void Configuration_BTM222(void) 
{ 
  USART_InitTypeDef USART_InitStructure; 
  //konfiguracja peryferii 
  USART_InitStructure.USART_BaudRate = 19200; 
  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; 
  //inicjalizacja peryferii 
  USART_Init(USART2, &USART_InitStructure); 
  //włączenie 
  USART_Cmd(USART2, ENABLE); 
}

Na listingu 3 pokazano funkcję odpowiedzialną za wystawianie danych do wysłania. Funkcja ta kopiuje dane z podanego ciągu do bufora, a następnie włącza obsługę przerwania odpowiedzialnego za transmisję danych. Dodatkowo zaimplementowano element zabezpieczający przed zapisem danych do bufora, w przypadku gdy poprzednia transmisja nie została ukończona. Należy zwrócić uwagę na zmienną TxLength – określa ona długość ciągu do wysłania i zarazem jest zmienną informującą czy aktualnie trwa wysyłanie danych (wartość większa od zera). W przypadku zakończenia transmisji zmienna ta jest zerowana.

List. 3

uint8_t SendDataToBTM222(char *str) 
{ 
  //zmienna licznika 
  uint32_t i = 0; 
  //zatrzymanie wystawiania danych do momentu kiedy 
  //poprzednio wystawione dane zostaną wysłane 
  while(TxLength != 0){}; 
  //skopiowanie ciągu znaków do bufora 
  while((str[i] != 0x00) && (i < 512)) 
  { 
    TxBuffer[i] = str[i]; 
    i++; 
  } 
  //rozpoczęcie wysyłania danych 
  if(i < 512) 
  { 
    //ustawienie długości ciągu 
    TxLength = i; 
    //wyzerowanie pozostałej zawartości bufora 
    while(i < 512){TxBuffer[i++] = 0x00;}; 
    //włączenie przerwania odpowiedzialnego za wysyłanie danych 
    USART_ITConfig(USART2, USART_IT_TXE, ENABLE); 
    return 1; 
  } 
  //obsługa błędu, gdy wprowadzony ciąg był zbyt długi 
  else 
  { 
    TxLength = 0; 
    return 0; 
  } 
}

Realizacja procesu wysyłania i odbierania danych jest realizowana przy wykorzystaniu przerwań. Na listingu 4 przedstawiono funkcję obsługi przerwań pochodzących od flagi odebrania znaku oraz zakończenia wysyłania znaku. W przypadku odebrania znaku następuje jego przepisanie do odpowiedniego bufora, fragment ten ma zabezpieczenie przed przekroczeniem zakresu tablicy w postaci kodu sprawdzającego aktualną wartość licznika. W przypadku fragmentu odpowiedzialnego za wysyłanie ciągu znaków, wykorzystywany jest licznik wskazujący na element tablicy, który jest inkrementowany po każdym wysłaniu znaku. W momencie osiągnięcia przez licznik wartości równej długości ciągu znaków, następuje zerowanie zmiennych TxCounter i TxLength.