STM32F205VC: ¿Error de encuadre de USART?

1

Estoy tratando de usar USART en mi programa en STM32F205VC, pero en lugar de enviar mis datos obtengo algunos caracteres extraños en PuTTY. He utilizado un analizador lógico Saleae y el resultado es el siguiente:

Este es mi código de aplicación completo:

#include <stm32f2xx_gpio.h>
#include <stm32f2xx_rcc.h>
#include <stm32f2xx_usart.h>

#define USART_PORT GPIOB

#define USART_TX_PIN GPIO_Pin_6
#define USART_TX_PIN_SOURCE GPIO_PinSource6

#define USART_RX_PIN GPIO_Pin_7
#define USART_RX_PIN_SOURCE GPIO_PinSource7

void SetupLED(GPIO_TypeDef* port, uint32_t pin)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = pin;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

    GPIO_Init(port, &GPIO_InitStructure);
}

void SetupUSART()
{
    USART_InitTypeDef usartConfig;

    usartConfig.USART_BaudRate = 9600;
    usartConfig.USART_WordLength = USART_WordLength_8b;
    usartConfig.USART_StopBits = USART_StopBits_1;
    usartConfig.USART_Parity = USART_Parity_No;
    usartConfig.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    usartConfig.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

    USART_Cmd(USART1, ENABLE);
    USART_Init(USART1, &usartConfig);

    GPIO_InitTypeDef gpioConfig;

    gpioConfig.GPIO_Mode = GPIO_Mode_AF;
    gpioConfig.GPIO_Pin = USART_TX_PIN;
    gpioConfig.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_Init(USART_PORT, &gpioConfig);
    GPIO_PinAFConfig(USART_PORT, USART_TX_PIN_SOURCE, GPIO_AF_USART1);

    gpioConfig.GPIO_Mode = GPIO_Mode_AF;
    gpioConfig.GPIO_Pin = USART_RX_PIN;
    GPIO_Init(USART_PORT, &gpioConfig);
    GPIO_PinAFConfig(USART_PORT, USART_RX_PIN_SOURCE, GPIO_AF_USART1);
}

void USART_SendByteSync(USART_TypeDef *USARTx, char byte)
{
    while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET) { } 
    USART_SendData(USARTx, byte);
    while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET) { }
}

void StartClocks()
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
}

int main()
{
    StartClocks();
    SetupUSART();

    SetupLED(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
    GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_3);

    while (true) 
    {
        USART_SendByteSync(USART1, 'e');
        for (int i = 0; i < 1000000; i++)
            asm("nop");
    }
}
    
pregunta user61143

1 respuesta

1

Así que lo resumo para no dejar esta pregunta sin respuesta. En la mayoría de los IDE-s, si comienza un nuevo proyecto, se le preguntará en algún lugar, cuál es su frecuencia de reloj externo. Esto configurará su macro HSE_VALUE, que se usará en la configuración de los relojes. Si la frecuencia del reloj externo no está configurada correctamente, no obtendrá la sincronización deseada, por ejemplo, en su USART. Como dijo @geometrical , tus bits son correctos, pero la sincronización no es correcta, por lo que probablemente no configuraste tu HSE_VALUE correctamente.

    
respondido por el ramez

Lea otras preguntas en las etiquetas