问答

汇集网友智慧,解决技术难题

21ic问答首页 - hc32f460串口接收不到数据

寄存器 定时器 定时 示波器 串口接收 hc32f460

hc32f460串口接收不到数据

fahuo2024-05-06
用的串口3进行通讯,用示波器看收发都有正确的波形,但RDR寄存器一直是0,接收不到数据,一直再发送中断和接收超时中断,定时器周期我设置的是20ms,而且示波器看数据收发间隔不到2ms,请问这是怎么回事
回答 +关注 1
4523人浏览 11人回答问题 分享 举报
11 个回答
  • 学到了,小华MCU全系列产品,超低功耗、通用控制、电机控制、汽车电子。提货请联系18256013035 微信同号
  • gouguoccc 发表于 2024-5-13 08:08
    多半还是代码问题,贴上来大家看看。
    static void Usart3RxIrqCallback(void)
    {
            read = USART_RecData(USART3_CH);
            if(RXflage == false)
            {       
                    RXbuff[readdata] = read;               
                    if((RXbuff[0] & 0xFF) == 0xAC)
                    {
                            readdata++;
                            if(readdata >= 8)
                            {
                                    readdata = 0;
                                    RXflage = true;
                            }
                    }
            }
    }

    static void Usart3TxIrqCallback(void)
    {
            if(TXflage == true)
            {                USART_SendData(USART3_CH, TXbuff[writedata+1]);
                    writedata++;
                    if(writedata >= 7)
                    {
                            writedata = 0;
                            TXflage = false;
                    }
            }
            else if(TXflage == false)
            {
                    //USART_FuncCmd(USART3_CH, UsartTxEmptyInt, Disable);        
                    //USART_FuncCmd(USART3_CH, UsartTxCmpltInt, Enable);
                    while (Reset == USART_GetStatus(USART3_CH, UsartTxComplete))
                    {
                    }
                    EN_485_L;
            }
    }

    static void Usart3ErrIrqCallback(void)
    {
            if (Set == USART_GetStatus(USART3_CH, UsartFrameErr))
          USART_ClearStatus(USART3_CH, UsartFrameErr);
       
        if (Set == USART_GetStatus(USART3_CH, UsartParityErr))
          USART_ClearStatus(USART3_CH, UsartParityErr);
       
        if (Set == USART_GetStatus(USART3_CH, UsartOverrunErr))
          USART_ClearStatus(USART3_CH, UsartOverrunErr);
       
        if (Set == USART_GetStatus(USART3_CH, UsartRxNoEmpty))
          USART_ClearStatus(USART3_CH, UsartRxNoEmpty);
       
        if (Set == USART_GetStatus(USART3_CH, UsartTxComplete))
          USART_ClearStatus(USART3_CH, UsartTxComplete);
       
        if (Set == USART_GetStatus(USART3_CH, UsartTxEmpty))
          USART_ClearStatus(USART3_CH, UsartTxEmpty);
       
        if (Set == USART_GetStatus(USART3_CH, UsartRxTimeOut))
          USART_ClearStatus(USART3_CH, UsartRxTimeOut);
       
        if (Set == USART_GetStatus(USART3_CH, UsartRxMpb))
          USART_ClearStatus(USART3_CH, UsartRxMpb);
    }

    static void Usart3TimeoutIrqCallback(void)
    {
        TIMER0_Cmd(TMR_UNIT,Tim0_ChannelA,Disable);
            //USART3_CH->CR1_f.CRTOF = 1ul;
        USART_ClearStatus(USART3_CH, UsartRxTimeOut);
    }

    static void Usart3TxCmpltIrqCallback(void)
    {
        USART_FuncCmd(USART3_CH,UsartTx,Disable);
        USART_FuncCmd(USART3_CH,UsartTxCmpltInt,Disable);
    }

    void Uart3_Init(void)
    {
            en_result_t enRet = Ok;
            stc_irq_regi_conf_t stcIrqRegiCfg;
           
            const stc_usart_uart_init_t stcInitCfg = {
           UsartIntClkCkNoOutput,
                    //UsartIntClkCkOutput,
           UsartClkDiv_64,
           UsartDataBits8,
           UsartDataLsbFirst,
           UsartOneStopBit,
           UsartParityNone,
           UsartSampleBit8,
           UsartStartBitFallEdge,
           UsartRtsEnable,
        };
           
            PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_USART3,Enable);
           
            PORT_SetFunc(USART3_RX_PORT,USART3_RX_PIN,USART3_RX_FUNC,Disable);
            PORT_SetFunc(USART3_TX_PORT,USART3_TX_PIN,USART3_TX_FUNC,Disable);
           
            enRet = USART_UART_Init(USART3_CH,&stcInitCfg);
            if(enRet != Ok)
            {
                    while(1)
                    {
                   
                    }
            }
            enRet = USART_SetBaudrate(USART3_CH,USART3_BAUDRATE);
            if(enRet != Ok)
            {
                    while(1)
                    {
                    }
            }
                   
            stcIrqRegiCfg.enIRQn = Int001_IRQn;
            stcIrqRegiCfg.pfnCallback = &Usart3RxIrqCallback;
            stcIrqRegiCfg.enIntSrc = USART3_RI_NUM;
            enIrqRegistration(&stcIrqRegiCfg);
            NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
        NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
        NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
           
            stcIrqRegiCfg.enIRQn = Int002_IRQn;
        stcIrqRegiCfg.pfnCallback = &Usart3ErrIrqCallback;
        stcIrqRegiCfg.enIntSrc = USART3_EI_NUM;
        enIrqRegistration(&stcIrqRegiCfg);
        NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
        NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
        NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
           
        stcIrqRegiCfg.enIRQn = Int008_IRQn;                     
        stcIrqRegiCfg.pfnCallback = &Usart3TimeoutIrqCallback;     
        stcIrqRegiCfg.enIntSrc = USART3_RTO_NUM;                    
        enIrqRegistration(&stcIrqRegiCfg);
        NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
        NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
        NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
           
            stcIrqRegiCfg.enIRQn = Int000_IRQn;
            stcIrqRegiCfg.pfnCallback = &Usart3TxIrqCallback;
            stcIrqRegiCfg.enIntSrc = USART3_TI_NUM;
            enIrqRegistration(&stcIrqRegiCfg);
            NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
        NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
        NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
           
        stcIrqRegiCfg.enIRQn = Int004_IRQn;
        stcIrqRegiCfg.pfnCallback = &Usart3TxCmpltIrqCallback;
        stcIrqRegiCfg.enIntSrc = USART3_TCI_NUM;
        enIrqRegistration(&stcIrqRegiCfg);
        NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);   
        NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);                        
        NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
                   
            USART_FuncCmd(USART3_CH, UsartRx, Enable);
        USART_FuncCmd(USART3_CH, UsartRxInt, Enable);
            USART_FuncCmd(USART3_CH, UsartTx, Enable);
        USART_FuncCmd(USART3_CH, UsartTimeOut, Enable);
            USART_FuncCmd(USART3_CH, UsartTimeOutInt, Enable);
            USART_FuncCmd(USART3_CH, UsartTxEmptyInt, Enable);
            //USART_SetMode(USART3_CH, UsartUartMode);
    }
  • yang377156216 发表于 2024-5-11 15:54
    大概率是超时配置错误或者引脚功能配置不对了。

    但是我串口直接通讯可以,485就不行,有接收波形
  • chenqianqian 发表于 2024-5-11 08:01
    MCU和什么通信?你示波器量的是MCU引脚端的信号吗?

    两个mcu通讯,示波器量的是mcu引脚的信号
  • 使用的是官方例程吗?接线是什么样的?
  • 有没可能没使能串口接收中断?
  • 看一下是不是你的配置有问题
  • 你数据接收是怎么处理的中断还是查询?
  • 多半还是代码问题,贴上来大家看看。
12下一页

您需要登录后才可以回复 登录 | 注册