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");
}
}