jye777 发表于 2019-8-16 17:08:09

STM32F4的USART串口HAL库调用接收中断问题

初始化USART中调用HAL_USART_Receive_IT(&USART1_Handle, rxBufIT, 1)开启接收中断,然后程序一运行到这个函数后,就会在串口助手接收到个0xFF。后面进入这个函数发现有一句:/* Send dummy byte in order to generate the clock for the slave to send data */husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x01FFU); //#define DUMMY_DATA0xFFFFU是的,这个0xFF果然是HAL库发出来的。如果调用HAL_USART_Receive_IT(&USART1_Handle, rxBufIT, 10),那么中断中也会通过USART_Receive_IT()同样发出10个0xFF。然后在HAL_USART_RxCpltCallback()中会接收到0x7F(不知从何而来),调用HAL_USART_Transmit()发送,函数返回HAL_OK,但是串口助手收不到任何数据。请问HAL库中为什么要专门发0XFF?是BUG吗?又不走同步模式,产生时钟干什么?

jye777 发表于 2019-8-16 17:16:13

串口初始化
int usart1_init(uint32_t baudRate)
{
        HAL_StatusTypeDef status = HAL_OK;
       
        USART1_Handle.Instance = USART1;
        USART1_Handle.Init.BaudRate = baudRate; //115200
        USART1_Handle.Init.WordLength = USART_WORDLENGTH_8B;
        USART1_Handle.Init.StopBits = USART_STOPBITS_1;
        USART1_Handle.Init.Parity = USART_PARITY_NONE;
        USART1_Handle.Init.Mode = USART_MODE_TX_RX;
       
        if(HAL_USART_Init(&USART1_Handle) != HAL_OK) {
                return -1;
        }

        /* enable interrupt: RXNEIE/PEIE/EIE, every byte recv will enter USART1_IRQHandler */
        if((status = HAL_USART_Receive_IT(&USART1_Handle, rxBufIT, 1)) != HAL_OK) {
                return -2;
        }

        return 0;
}

中断
void USART1_IRQHandler(void)
{
        HAL_USART_IRQHandler(&USART1_Handle);
}

接收回调
void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart)
{
        HAL_StatusTypeDef status = HAL_OK;
        HAL_USART_StateTypeDef statusUsart = HAL_USART_STATE_RESET;
       
        if(husart->Instance == USART1) {
                if((status = HAL_USART_Transmit(husart, rxBufIT, 1, 2000)) != HAL_OK) {
                        return;
                }
                /* wait for USART1 ready and enable RXNEIE again */
                //while((statusUsart = HAL_USART_GetState(&USART1_Handle)) != HAL_USART_STATE_READY); //如果有这句,statusUsart时钟为发送忙
                while((status = HAL_USART_Receive_IT(&USART1_Handle, rxBufIT, 1)) != HAL_OK);//始终返回HAL_BUSY,卡死
        }
}

Dandjinh 发表于 2019-8-16 21:18:21

USART是同步串口,所以要发点数据触发时钟,我猜你想用的是UART

jye777 发表于 2019-8-17 10:12:32

Dandjinh 发表于 2019-8-16 21:18
USART是同步串口,所以要发点数据触发时钟,我猜你想用的是UART

哦,虽然外设用的USART,但好像是要调用HAL_UART的APIs进行异步通讯,而不是HAL_USART的APIs,我以为USART不涉及到同步时钟过程就会和UART一样。
感谢提供思路,下周试试。

jye777 发表于 2019-8-20 17:20:06

问题原因:用法错误。

我是想USART1当普通调试口用,结果用的HAL_USART相关的APIs,其实应该用HAL_UART的APIs。看了下USART和UART内部HAL库的实现,确实USART内部会多发个时钟同步信号(FF)。
页: [1]
查看完整版本: STM32F4的USART串口HAL库调用接收中断问题