问答

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

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

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

hc32f460串口接收不到数据

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

    18. static void Usart3TxIrqCallback(void)
    19. {
    20.         if(TXflage == true)
    21.         {                USART_SendData(USART3_CH, TXbuff[writedata+1]);
    22.                 writedata++;
    23.                 if(writedata >= 7)
    24.                 {
    25.                         writedata = 0;
    26.                         TXflage = false;
    27.                 }
    28.         }
    29.         else if(TXflage == false)
    30.         {
    31.                 //USART_FuncCmd(USART3_CH, UsartTxEmptyInt, Disable);        
    32.                 //USART_FuncCmd(USART3_CH, UsartTxCmpltInt, Enable);
    33.                 while (Reset == USART_GetStatus(USART3_CH, UsartTxComplete))
    34.                 {
    35.                 }
    36.                 EN_485_L;
    37.         }
    38. }

    39. static void Usart3ErrIrqCallback(void)
    40. {
    41.         if (Set == USART_GetStatus(USART3_CH, UsartFrameErr))
    42.       USART_ClearStatus(USART3_CH, UsartFrameErr);
    43.    
    44.     if (Set == USART_GetStatus(USART3_CH, UsartParityErr))
    45.       USART_ClearStatus(USART3_CH, UsartParityErr);
    46.    
    47.     if (Set == USART_GetStatus(USART3_CH, UsartOverrunErr))
    48.       USART_ClearStatus(USART3_CH, UsartOverrunErr);
    49.    
    50.     if (Set == USART_GetStatus(USART3_CH, UsartRxNoEmpty))
    51.       USART_ClearStatus(USART3_CH, UsartRxNoEmpty);
    52.    
    53.     if (Set == USART_GetStatus(USART3_CH, UsartTxComplete))
    54.       USART_ClearStatus(USART3_CH, UsartTxComplete);
    55.    
    56.     if (Set == USART_GetStatus(USART3_CH, UsartTxEmpty))
    57.       USART_ClearStatus(USART3_CH, UsartTxEmpty);
    58.    
    59.     if (Set == USART_GetStatus(USART3_CH, UsartRxTimeOut))
    60.       USART_ClearStatus(USART3_CH, UsartRxTimeOut);
    61.    
    62.     if (Set == USART_GetStatus(USART3_CH, UsartRxMpb))
    63.       USART_ClearStatus(USART3_CH, UsartRxMpb);
    64. }

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

    71. static void Usart3TxCmpltIrqCallback(void)
    72. {
    73.     USART_FuncCmd(USART3_CH,UsartTx,Disable);
    74.     USART_FuncCmd(USART3_CH,UsartTxCmpltInt,Disable);
    75. }

    76. void Uart3_Init(void)
    77. {
    78.         en_result_t enRet = Ok;
    79.         stc_irq_regi_conf_t stcIrqRegiCfg;
    80.        
    81.         const stc_usart_uart_init_t stcInitCfg = {
    82.        UsartIntClkCkNoOutput,
    83.                 //UsartIntClkCkOutput,
    84.        UsartClkDiv_64,
    85.        UsartDataBits8,
    86.        UsartDataLsbFirst,
    87.        UsartOneStopBit,
    88.        UsartParityNone,
    89.        UsartSampleBit8,
    90.        UsartStartBitFallEdge,
    91.        UsartRtsEnable,
    92.     };
    93.        
    94.         PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_USART3,Enable);
    95.        
    96.         PORT_SetFunc(USART3_RX_PORT,USART3_RX_PIN,USART3_RX_FUNC,Disable);
    97.         PORT_SetFunc(USART3_TX_PORT,USART3_TX_PIN,USART3_TX_FUNC,Disable);
    98.        
    99.         enRet = USART_UART_Init(USART3_CH,&stcInitCfg);
    100.         if(enRet != Ok)
    101.         {
    102.                 while(1)
    103.                 {
    104.                
    105.                 }
    106.         }
    107.         enRet = USART_SetBaudrate(USART3_CH,USART3_BAUDRATE);
    108.         if(enRet != Ok)
    109.         {
    110.                 while(1)
    111.                 {
    112.                 }
    113.         }
    114.                
    115.         stcIrqRegiCfg.enIRQn = Int001_IRQn;
    116.         stcIrqRegiCfg.pfnCallback = &Usart3RxIrqCallback;
    117.         stcIrqRegiCfg.enIntSrc = USART3_RI_NUM;
    118.         enIrqRegistration(&stcIrqRegiCfg);
    119.         NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
    120.     NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
    121.     NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
    122.        
    123.         stcIrqRegiCfg.enIRQn = Int002_IRQn;
    124.     stcIrqRegiCfg.pfnCallback = &Usart3ErrIrqCallback;
    125.     stcIrqRegiCfg.enIntSrc = USART3_EI_NUM;
    126.     enIrqRegistration(&stcIrqRegiCfg);
    127.     NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
    128.     NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
    129.     NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
    130.        
    131.     stcIrqRegiCfg.enIRQn = Int008_IRQn;                     
    132.     stcIrqRegiCfg.pfnCallback = &Usart3TimeoutIrqCallback;     
    133.     stcIrqRegiCfg.enIntSrc = USART3_RTO_NUM;                    
    134.     enIrqRegistration(&stcIrqRegiCfg);
    135.     NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
    136.     NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
    137.     NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
    138.        
    139.         stcIrqRegiCfg.enIRQn = Int000_IRQn;
    140.         stcIrqRegiCfg.pfnCallback = &Usart3TxIrqCallback;
    141.         stcIrqRegiCfg.enIntSrc = USART3_TI_NUM;
    142.         enIrqRegistration(&stcIrqRegiCfg);
    143.         NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
    144.     NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
    145.     NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
    146.        
    147.     stcIrqRegiCfg.enIRQn = Int004_IRQn;
    148.     stcIrqRegiCfg.pfnCallback = &Usart3TxCmpltIrqCallback;
    149.     stcIrqRegiCfg.enIntSrc = USART3_TCI_NUM;
    150.     enIrqRegistration(&stcIrqRegiCfg);
    151.     NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);   
    152.     NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);                        
    153.     NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
    154.                
    155.         USART_FuncCmd(USART3_CH, UsartRx, Enable);
    156.     USART_FuncCmd(USART3_CH, UsartRxInt, Enable);
    157.         USART_FuncCmd(USART3_CH, UsartTx, Enable);
    158.     USART_FuncCmd(USART3_CH, UsartTimeOut, Enable);
    159.         USART_FuncCmd(USART3_CH, UsartTimeOutInt, Enable);
    160.         USART_FuncCmd(USART3_CH, UsartTxEmptyInt, Enable);
    161.         //USART_SetMode(USART3_CH, UsartUartMode);
    162. }
  • yang377156216 发表于 2024-5-11 15:54
    大概率是超时配置错误或者引脚功能配置不对了。

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

    两个mcu通讯,示波器量的是mcu引脚的信号
12下一页

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