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.