STM32 HAL printf所占用串口不能做中断接收
目前在使用STM32L053系列MCU,基于HAL库的程序,硬件串口资源有3个,都已经被使用;其中USART2通过Switch芯片来实现printf打印和读取传感器数据;因为USART2串口接收数据长度不定,因此采用中断接收。在测试时发现当串口USART2指向传感器时,发送数据没有问题,中断接收函数没办法进入。将printf定向到其他串口时,USART2就可以正常接收数据。因此,结论是printf指向哪个串口,该串口就没办法实现中断接收数据。
请问各位大神有碰到相似的问题吗?是如何解决的?
本帖最后由 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);
应该不会有这个问题吧,你串口重定向的代码实现是怎样的?我一般是跟STD库一致,直接操作TDR寄存器,没有使用HAL接口实现。 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接收中断就可以使用了。
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]