使用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以正确的设置接收任何值(因为收到较低的波特率)。
答案 0 :(得分:0)
收到数据时忘记SPL,HAL或其他库。有这样的速度你应该使用DMA。如果中断例程记住你只有大约160-180个时钟周期。这很容易实现,但您需要使用裸寄存器编程。