使用USART时,使用STM32标准外围设备库出现一个奇怪的错误。我需要能够在USART2上以4M波特率传输。尽管据说该板支持最高6M的波特率,但只有3M及以下的波特才能正常工作。
我仔细阅读了SPL文档和开发板的参考手册,发现我的时钟默认为48MHz,并且过采样设置为8(通过在调试器中逐步执行代码来确认)。为什么3M及以下版本适用于标准初始化,但4M,5M和6M无效?
static void hal_init(void)
{
GPIO_InitTypeDef port_init;
USART_InitTypeDef usart_init;
//GPIO init: USART2 PA2 as OUT, PA3 as IN
RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE );
/* Connect PA2 to USART2 tx, PA3 to rx */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);
port_init.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
port_init.GPIO_Mode = GPIO_Mode_AF;
port_init.GPIO_Speed = GPIO_Speed_50MHz;
port_init.GPIO_OType = GPIO_OType_PP;
port_init.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init( GPIOA, &port_init );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
/* Need oversampling set for higher baud rates */
USART_OverSampling8Cmd(USART2, ENABLE);
//USART init: USART2 500K 8n1
usart_init.USART_BaudRate = USART_BAUD_RATE; // Currently 4M
usart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
usart_init.USART_Parity = USART_Parity_No;
usart_init.USART_StopBits = USART_StopBits_1;
usart_init.USART_WordLength = USART_WordLength_8b;
usart_init.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART2, (USART_InitTypeDef*) &usart_init);
USART_Cmd(USART2, ENABLE);
}
作为参考,开发板也使用FreeRTOS,我正在使用IAR-EWARM进行构建和调试。
编辑:通过告诉开发板连续发送0xA5(随机选择),然后将主机设置为接收10个字节,来测试错误行为。在所有3M或更低的波特率中,按预期接收一系列值0xA5的字节。对于4M,如果将过采样设置为16(OVER8 = 0),则将接收值0x00。如果将过采样设置为8(OVER8 = 1),则通过我的Python脚本或具有正确设置的PuTTy都不会接收到任何值(因为接收到的波特率较低)。
最佳答案
接收数据时,请忘记SPL,HAL或其他库。以这种速度,您应该使用DMA。如果执行中断例程,请记住您只有大约160-180个时钟滴答。这很容易实现,但是您需要使用裸寄存器编程。
关于c - 更高的波特率不适用于STM32F0发现板,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44206426/