USART no funciona con el adaptador CP2102 y la placa de pastillas azul STM32F1

0

Habiendo programado MCU AVR de 8 bits, compré el tablero de desarrollo Blue Pill STM32F103C8 de ebay. Tiene un cristal externo de 8MHz y lo programo con ST-Link en Mac. Vi muchas opciones como HAL, etc., pero elegí programar usando acceso directo a los registros y con el núcleo de CMSIS.

Mi problema es que estoy tratando de enviar el símbolo de MCU a la computadora. Estoy utilizando el módulo CP2102 conectado a USART1 (PB6 y PB7). Los LED parpadean, pero no obtengo ninguna salida en el monitor serial IDE de Arduino. Aquí está mi código:

#include "stm32f1xx.h"

void delay(unsigned long delay)
{
    while(delay) delay--;
}

int SendChar (int ch)  {
    while (!(USART1->SR & USART_SR_TXE));
    USART1->DR = (ch & 0xFF);
    return (ch);
}

int main(void)
{
    //Enable I2C2 clock
    RCC->APB1ENR |= RCC_APB1ENR_I2C2EN;
    //Enable the clock to PORT B, PORT C, USART1 and AFIO clocks
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN |       RCC_APB2ENR_AFIOEN;
    RCC->APB2ENR |= RCC_APB2ENR_USART1EN;

    //use AFIO_MAPR register to remap alternate functions to use USART 1 TX and RX on PB6 and PB7
    //Ref 7.4.2 and 6.3.7 in st manual
    AFIO->MAPR |= AFIO_MAPR_USART1_REMAP;

    //CRL Configures outputs 0 to 7 and CRH 8 to 15, so if you want to configure PC13,
    //you modify GPIOC_CRH register
    GPIOB->CRL |= GPIO_CRL_MODE0_0 | GPIO_CRL_MODE0_1;
    GPIOC->CRH = GPIO_CRH_MODE13_0 | GPIO_CRH_MODE13_1 |
        GPIO_CRH_MODE14_0 | GPIO_CRH_MODE14_1 |
        GPIO_CRH_MODE15_0 | GPIO_CRH_MODE15_1;
    //Set RX as floating in and TX as out push-pull
    GPIOB->CRL &= ~(GPIO_CRL_MODE7_0 | GPIO_CRL_MODE7_1);
    GPIOB->CRL |= GPIO_CRL_MODE7_0 | GPIO_CRL_MODE7_1 | GPIO_CRL_CNF6_0;

    //Enable RX TX
    USART1->CR1 |= (USART_CR1_RE | USART_CR1_TE);  // RX, TX enable
    //Enable USART
    USART1->CR1 |= USART_CR1_UE;
    //Make sure to clear OVER8 bit(15 bit in USART_CR1) to oversample by 16, I dont know if I need this
    USART1->CR1 &= ~(1 << 15);
    ////Configure Baud Rate
    /*USART_BRR = Fck/BAUDRATE*/
    //Set 115200 Baud, 8 MHz crystal
    USART1->BRR = 8000000L/115200L;

    while (1)
    {
        SendChar(35); //Test UART,fingers crossed

        //Toggle led on PB0
        GPIOB->ODR ^= GPIO_ODR_ODR0;

        //Toogle RGB led connected on PC13, PC14 and PC5
        GPIOC->ODR ^= GPIO_ODR_ODR13;
        delay(50000);
        GPIOC->ODR ^= GPIO_ODR_ODR13;
        delay(50000);
        GPIOC->ODR ^= GPIO_ODR_ODR15;
        delay(50000);
    }

    return 0;
}
    
pregunta user112290

1 respuesta

2

Me las arreglé para resolver el problema con la ayuda del USB Logic Analyzer y el manual de referencia de STM32. Estaba configurando incorrectamente los pines GPIO para USART1, RX debe ser una entrada flotante y TX debe ser una función alternativa de salida con pull-up / pull-down. Así que después de cambiar estas líneas:

 GPIOB->CRL &= ~(GPIO_CRL_MODE7_0 | GPIO_CRL_MODE7_1);
 GPIOB->CRL |= GPIO_CRL_MODE7_0 | GPIO_CRL_MODE7_1 | GPIO_CRL_CNF6_0;

Para:

GPIOB->CRL |= GPIO_CRL_MODE6_1 | GPIO_CRL_CNF6_1 | GPIO_CRL_CNF7_0;

Puedo ver el carácter enviado con el analizador lógico conectado y también puedo observarlo en el monitor serial de arduino.

    
respondido por el user112290

Lea otras preguntas en las etiquetas