你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

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

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

收藏 1 评论4 发布时间:2018-3-30 09:55

举报

4个回答
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);

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

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

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

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[1]={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[1]={ch};

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

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版