pzd123 发表于 2018-3-30 09:55:02

STM32 HAL printf所占用串口不能做中断接收

目前在使用STM32L053系列MCU,基于HAL库的程序,硬件串口资源有3个,都已经被使用;其中USART2通过Switch芯片来实现printf打印和读取传感器数据;因为USART2串口接收数据长度不定,因此采用中断接收。在测试时发现当串口USART2指向传感器时,发送数据没有问题,中断接收函数没办法进入。将printf定向到其他串口时,USART2就可以正常接收数据。

因此,结论是printf指向哪个串口,该串口就没办法实现中断接收数据。
请问各位大神有碰到相似的问题吗?是如何解决的?

wenyangzeng 发表于 2018-3-30 10:26:35

本帖最后由 wenyangzeng 于 2018-3-30 10:28 编辑

printf指向哪个串口由下面函数设定,本例使用usart2:

PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart2 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
可以使用中断接收的:
__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);

anobodykey 发表于 2018-3-30 23:16:58

应该不会有这个问题吧,你串口重定向的代码实现是怎样的?我一般是跟STD库一致,直接操作TDR寄存器,没有使用HAL接口实现。

pzd123 发表于 2018-4-4 17:11:30

wenyangzeng 发表于 2018-3-30 10:26
printf指向哪个串口由下面函数设定,本例使用usart2:

PUTCHAR_PROTOTYPE


添加这个之后使用printf来打印的。
int fputc(int ch,FILE *f)
{
    uint8_t temp={ch};

    return HAL_UART_Transmit(&huart2,temp,1,3);
}

在串口2初始化的时候增加的中断接收
                        if(HAL_UART_Receive_IT(&huart2,(uint8_t*)bRxBuffer,1) != HAL_OK)
        {
                //Error_Handler();
           printf("error\n");
        }
在中断函数里面
void USART2_IRQHandler(void)
{

        //printf("uart2\n");
HAL_UART_IRQHandler(&huart2);

}

实际测试的时候,没有办法进中断函数里面。

备注:同样的中断接收方式同时在Lpuart1上使用,可以正常使用;将putc()函数定向到UART1之后UART2接收中断就可以使用了。

pzd123 发表于 2018-4-4 17:12:33

anobodykey 发表于 2018-3-30 23:16
应该不会有这个问题吧,你串口重定向的代码实现是怎样的?我一般是跟STD库一致,直接操作TDR寄存器,没有使 ...

串口打印是通过下面实现的:
int fputc(int ch,FILE *f)
{
    uint8_t temp={ch};

    return HAL_UART_Transmit(&huart2,temp,1,3);
}
页: [1]
查看完整版本: STM32 HAL printf所占用串口不能做中断接收