Krótki przykład konfiguracji modułu USART w mikrokontrolerach STM32 bez wykorzystywania bibliotek Standard Peripherals Library (SPL) dostarczanych przez producenta.
Na wstępie kilka linków do wykorzystywanych narzędzi:
Płytka rozwojowa STM32F0 Discovery
Debugger OpenOCD dla mikrokontroleów ARM (skompilowane pliki dla Windows)
Program bazuje na nieco zmodyfikowanym przykładzie mrugania diodą otrzymywanym podczas użycia wtyczki GNU ARM Ecplise do utworzenia nowego projektu (swoją drogą wtyczka zmieniła głównego software developera i prężnie się rozwija - polecam).
Na stronie producenta płytki rozwojowej można pobrać niezbędną dokumentację:
- Datasheet - dokumentacja mikrokontrolera STM32F051R8,
- Programming manual - dokumentacja rdzenia Cortex-M0 w mikrokontrolerze,
- Reference manual - dokumentacja pamięci i peryferiów w mikrokontrolerze.
Podczas tworzenia oprogramowania najczęściej będziemy wykorzystywać reference manual, jednakże co jakiś czas pojawi się potrzeba zajrzenia do datasheeta oraz programming manuala.
Konfiguracja modułu USART przeprowadzona została tylko przy wykorzystaniu deklaracji struktur i adresów rejestrów z pliku nagłówkowego <stm32f0xx.h>. Poniżej fragment kodu konfigurujcego interfejs szeregowy umieszczony tuż przed wywołaniem pętli nieskończonej while(1):
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; //enable clock for USART1 RCC->AHBENR |= RCC_AHBENR_GPIOAEN; //enable clock for GPIOA GPIOC->MODER |= GPIO_MODER_MODER9_0; //GPIO C9 as output - for LED indicator GPIOA->MODER |= GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1; //alternate function for PA9 and PA10 GPIOA->AFR[1] |= 1<<4 | 1<<8; //alternate function AF1 for GPIO PA9 PA10 (USART TX RX) USART1->BRR = 480000/1152; //set baud rate for USART (system clock/baud rate) USART1->CR2 |= 'H'<<24; //set sign for Compare Match Flag interrupt (CMF) USART1->CR1 |= USART_CR1_TE | USART_CR1_UE | USART_CR1_RE | USART_CR1_RXNEIE | USART_CR1_CMIE; //UART1, Transmit, Receive, RecNotEmpty, CMF- Enable interrupt NVIC_EnableIRQ(USART1_IRQn); //enable interrupt from USART1
Komentarze dokumentują każdy kolejny krok konfiguracji. Warto jedynie dodać, iż istotna jest kolejność wprowadzania wartości do kolejnych rejestrów. Przed zapisywaniem danych konfiguracyjnych poszczególnego modułu peryferyjnego należy uprzednio włączyć jego sygnał zegarowy. Bez aktywowania sygnału taktującego wartość rejestrów nie była uaktualniana co zostało zaobserwowane podczas sesji debugowania.
Działanie przykładowego programu polega na cylicznym zapalaniu i gaszeniu niebieskiej diody LD4 podłączonej do wyprowadzenia PC8 oraz wysyłaniu za pomocą interfejsu USART1 znaku dużej litery 'B'. Mikrokontroler po otrzymaniu dowolnego znaku wywołuje przerwanie w którym realizowae jest tzw. echo - znak odebrany jest odsyłany z powrotem do nadawcy. Dodatkowo zgłaszane jest przerwanie wykrycia dużej litery 'H' w nadchodzących do mikrokontrolera znakach ASCII. Co prawda znak 'H' spowoduje wygenerowania dwóch źródeł przerwania (od przychodzącego znaku oraz wykrycia konkretnego znaku), lecz flaga USART_CR1_CMIE pozwala na określenie w przerwaniu czy faktycznie otrzymaliśmy oczekiwany znak 'H'. W praktyce można zamiast tego w przerwaniu sprawdzać zawartość rejestru odbiorczego na obecność pożądanej danej. Gdy określony znak zostanie wykryty zostanie to zasygnalizowaniem przełączeniem stanu diody LD3 na wyprowadzeniu PC9. Pierwsze nadejście znaku 'H' załączy diodę, natomiast kolejne wyłączy itd.
Polecam przetestować zachowanie programu podczas wyłączania poszczególnych flag przerwań:
- USART_CR1_RXNEIE
- USART_CR1_CMIE
Po deaktywowaniu flagi USART_CR1_RXNEIE przerwanie zgłoszone jest tylko po wykryciu zdefiniowanego znaku. Można to wykorzystać np. do komunikacji wieloprocesorowej po USART (adresowanie konkretnego mikrokotnrolera), bądź jako wykrywanie pierwszej ramki (preambuły) w prostym protokole komunikacyjnym.
Interfejs pracuje z prędkością 115200 bodów. Wyprowadzenie PA9 jest wyjściem TX sygnału, natomiast PA10 jest wejściem RX. Wykorzystując przejściówki USB-RS232-TTL lub translatory RS232-TTL należy podłączyć do tychże wyprowadzeń. USART1 w tym mikrokontrolerze posiada porty tolerujące poziom napięcia 5V, także bez obaw można podłączać je pod standardowe przejściówki z poziomami TTL.
UWAGA! Interfejs USART2 tego mikrokontrolera akceptuje na odpowiadających mu wyprowadzeniach tylko 3,3V. Należy o tym bezwzględnie pamiętać i stosować odpowiednie przejściówki bądź dodatkowe translatory poziomów napięć
Do pobrania kompletny projekt programu wraz ze skonfigurowanymi narzędziami do programowania i debugowania kodu przy użyciu wbudowanego na płytce debuggera/programatora ST-Link V2.