[技术问答]

华大HC32L130J8串口UART1发送有问题

[复制链接]
1382|10
手机看帖
扫描二维码
随时随地手机跟帖
andy93762|  楼主 | 2022-1-4 20:34 | 显示全部楼层 |阅读模式
我用的HC32L130J8串口UART1发送函数会导致死循环,程序如下
M0P_UART1->SBUF=0XAA;
while(FALSE == Uart_GetStatus(UARTCH1,UartTC))
{}
Uart_ClrStatus(UARTCH1,UartTC);
程序会卡在Uart_GetStatus里一直等待TC的标志位,一直死循环。这个是啥原因呢?

使用特权

评论回复
ddxx| | 2022-1-5 08:30 | 显示全部楼层
看看UART1的Uart_EnableFunc打开Tx_f没。

使用特权

评论回复
andy93762|  楼主 | 2022-1-6 20:01 | 显示全部楼层
ddxx 发表于 2022-1-5 08:30
看看UART1的Uart_EnableFunc打开Tx_f没。

这个标志位没有使能的

使用特权

评论回复
wubangmi| | 2022-1-6 20:42 | 显示全部楼层
查询发送不是有给你写好的库文件么,为什么要自己写,而且还没写对

使用特权

评论回复
caigang13| | 2022-1-7 08:56 | 显示全部楼层
这个TC标志位你使能没?

使用特权

评论回复
martinhu| | 2022-1-7 10:31 | 显示全部楼层
如果你使用了接收中断,但是在接收中断里面恰好也清零了TC标志,那么在全双工的时候,就可能卡死在查询发送的TC标志查询语句上。
建议仔细看看中断处理,是不是在查询发送的时候也有清零发送标志TC的语句

使用特权

评论回复
andy93762|  楼主 | 2022-1-10 12:14 | 显示全部楼层
martinhu 发表于 2022-1-7 10:31
如果你使用了接收中断,但是在接收中断里面恰好也清零了TC标志,那么在全双工的时候,就可能卡死在查询发送 ...

void RxIntCallback1(void)//接收中断函数
{
                        uint8_t Res;
                        Res = Uart_ReceiveData(UARTCH1);
                        if(USART1_RX_STA<USART1_MAX_RECV_LEN)                //还可以接收数据
                        {
                                                if(USART1_RX_STA==0)
                                                                 usart1_rx_flag = 1;               //使能定时器计数
                                                USART1_RX_BUF[USART1_RX_STA&0x3fff]=Res;                //记录接收到的值
                                                USART1_RX_STA++;
                                                usart1_rx_count=0;                                                       
                        }
                        else
                        {
                                                USART1_RX_STA|=1<<15;                                        //强制标记接收完成
                        }                        
}

中断接收函数是这样的,没有清除TC标志

使用特权

评论回复
评论
martinhu 2022-1-11 14:00 回复TA
你这个中断里面没有中断标志清零的???? 是不是在这之外还有别的处理代码??? 
andy93762|  楼主 | 2022-1-10 12:17 | 显示全部楼层
wubangmi 发表于 2022-1-6 20:42
查询发送不是有给你写好的库文件么,为什么要自己写,而且还没写对

en_result_t Uart_SendData(uint8_t u8Idx, uint8_t u8Data)
{
    stc_uart_instance_data_t *pstcData = NULL;
    ASSERT(IS_VALID_CH(u8Idx));
    pstcData = UartGetInternDataPtr(u8Idx);
    if (NULL == pstcData)
    {
        return ErrorInvalidParameter;
    }
    Uart_ClrStatus(u8Idx,UartTC);
    pstcData->pstcInstance->SBUF_f.DATA = u8Data;
    while(FALSE == Uart_GetStatus(u8Idx,UartTC))
    {}
    Uart_ClrStatus(u8Idx,UartTC);      
    return Ok;
}
我用这个官方的发送函数也是不行的,也会卡死。

Uart_SendData(UARTCH1,13);                       

使用特权

评论回复
wubangmi| | 2022-1-10 13:53 | 显示全部楼层
andy93762 发表于 2022-1-10 12:17
en_result_t Uart_SendData(uint8_t u8Idx, uint8_t u8Data)
{
    stc_uart_instance_data_t *pstcData  ...

/**
******************************************************************************
** \brief  UART通道发送数据函数,查询方式调用此函数,中断方式发送不适用
**
** \param [in] UARTx通道号,Data发送数据
**
** \retval Ok发送成功
** \retval ErrorInvalidParameter发送失败
******************************************************************************/
en_result_t Uart_SendDataPoll(M0P_UART_TypeDef* UARTx, uint8_t u8Data)
{
    while(FALSE == Uart_GetStatus(UARTx,UartTxe))
    {}
    UARTx->SBUF_f.DATA = u8Data;
    while(FALSE == Uart_GetStatus(UARTx,UartTC))
    {}
    Uart_ClrStatus(UARTx,UartTC);      
    return Ok;
}
我看到的库里的函数是这样的

使用特权

评论回复
andy93762|  楼主 | 2022-1-16 21:53 | 显示全部楼层
wubangmi 发表于 2022-1-10 13:53
/**
******************************************************************************
** \brief  UA ...

是我的库函数比较老,我换成最新的库函数可以了。非常感谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

290

帖子

3

粉丝