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.

Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć
Fotorezystor, czyli czujnik światła dwojakiego działania. Przykład innowacji w automatyce i elektronice możliwej dzięki technologii fotooporników 



