Nom | Bridge | Rx | Tx |
---|---|---|---|
USART1 | APB2 | PA10 | PA9 |
USART2 | APB1 | PA3 | PA2 |
USART3 | APB1 | PB11 | PB10 |
USART1 remap | APB2 | PB7 | PB6 |
... #if defined USE_USART1 #define USART_USART USART1 #define USART_APB2_EN (RCC_APB2ENR_USART1EN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN) // usart 1 + gpio A + alternate function @APB2 #define USART_GPIO GPIOA #define USART_PIN_TX 9 #elif defined USE_USART2 ...On sélectionne l'USART et la vitesse du lien série depuis le Makefile:
CFLAGS += -DUSE_USART2 ... CFLAGS += -DUSART_BAUD_RATE=9600
void usart_init(uint16_t usart_div_value) { #ifdef USART_APB1_EN RCC->APB1ENR |= USART_APB1_EN; // Enable USART[23] #endif RCC->APB2ENR |= USART_APB2_EN; // Enable [USART1 &] GPIOs & Alternate Function #ifdef USE_USART1_REMAP AFIO->MAPR |= AFIO_MAPR_USART1_REMAP; // Remap USART1 *after* USART #endif USART_USART->BRR = ( ((usart_div_value / 16) << 4) | ((usart_div_value % 16) << 0) ); USART_USART->CR1 |= (USART_CR1_TE | USART_CR1_UE); // enable Transmission & Usart gpio_pin_init(USART_GPIO, USART_PIN_TX, O02_AF_PP); }La boucle principale se contente d'afficher l'USART et la vitesse sélectionnés:
... #define xstr(s) str(s) #define str(s) #s ... while (1) { __WFI(); usart_puts("Hello world from " USART_NAME " @" xstr(USART_BAUD_RATE) " !"); }Je pensais rencontrer des problèmes (carte à 8 MHz, PIN à 2 MHz) mais même à 115 200 bauds j'obtiens bien:
... Hello world from USART2 @115200 ! Hello world from USART2 @115200 ! ...La longueur réduite du texte et la carte qui ne fait rien d'autre doivent faire "tomber en marche" ce code qui devrait, en fonction de la vitesse du lien série, configurer la PIN TX à une vitesse plus élevée sans oublier le changement de la source d'horloge. L'objectif ici est de pouvoir tester tous les USARTs, j'en reste là pour le moment.
#ifdef USE_USART_PRINTF void usart_printf(const char * const fmt, ...) { ... } #endifCette fonction utilise un tampon de 10 caractères suffisant pour stocker la représentation d'un unsigned int et supporte uniquement '%%', '%c' et '%d'. La boucle principale devient:
#ifdef USE_USART_PRINTF usart_printf("Hello world from " USART_NAME " @%d !\r\n", USART_BAUD_RATE); #else usart_puts("Hello world from " USART_NAME " @" xstr(USART_BAUD_RATE) " !"); #endifLe code complet: https://gitlab.com/dsx/blue-pill/-/tree/master/stm32f103c8t6/02_usart_usarts