[技术问答]

华大mcu(hcl136k8ta)串口可以发送数据,但是接收不到数据!

[复制链接]
1089|10
手机看帖
扫描二维码
随时随地手机跟帖
lalhdo|  楼主 | 2022-7-25 17:22 | 显示全部楼层 |阅读模式
今天在做一个华大的串口配置的时候,一直卡在了这个问题上,串口发送没有问题(单个字节和字符串都没有问题),以下是串口的配置,串口助手调试如下图:
/***************************

串口配置

***************************/

#include "usart.h"



_UART_Rx_Data UART1_Rx_Data;



void Uart1RC_CallBackFun(void)

{

    if(Uart_GetStatus(UARTCH1,UartRC))

    {

        Uart_ClrStatus(UARTCH1,UartRC);

        Tim3_M0_Cnt16Set(Timer3_Count);

        Tim3_M0_Run();//开始计时

        if(UART1_Rx_Data.UART_Rx_Len < 512)

        {

            UART1_Rx_Data.UART_Rx_Buf[UART1_Rx_Data.UART_Rx_Len++] = Uart_ReceiveData(UARTCH1);

            printf("buf:%s\r\n",UART1_Rx_Data.UART_Rx_Buf);

        }

    }

}



/************************

函数名称:USART_Config

函数作用:串口初始化

函数入口:brr 波特率

函数出口:无

************************/

void USART_Config(uint32_t brr)

{

    uint16_t u16Scnt = 0;

    //开启外设时钟

    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);///<使能uart1模块时钟

   

    //串口物理层配置

    stc_gpio_config_t GPIO_InitStructure;

    DDL_ZERO_STRUCT(GPIO_InitStructure);

   

    GPIO_InitStructure.enDir = GpioDirOut; //Tx

    Gpio_Init(GpioPortD,GpioPin0,&GPIO_InitStructure);

    Gpio_SetAfMode(GpioPortD,GpioPin0,GpioAf3);

   

    GPIO_InitStructure.enDir = GpioDirIn;  //Rx

    Gpio_Init(GpioPortD,GpioPin1,&GPIO_InitStructure);

    Gpio_SetAfMode(GpioPortD,GpioPin1,GpioAf3);

   

    //串口协议层配置

    stc_uart_config_t  UART_InitStructure;//总体配置

    stc_uart_irq_cb_t UartIrq_InitStructure;//发送接收中断处理函数接口

    stc_uart_multimode_t UartMulti_InitStructure;//多主机模式及从机地址和地址掩码配置

    stc_uart_baud_t UartBaud_InitStructure;//通道波特率计算参数

   

    DDL_ZERO_STRUCT(UART_InitStructure);

    DDL_ZERO_STRUCT(UartIrq_InitStructure);

    DDL_ZERO_STRUCT(UartMulti_InitStructure);

    DDL_ZERO_STRUCT(UartBaud_InitStructure);

   

    UartMulti_InitStructure.enMulti_mode = UartNormal;//正常工作模式

   

    UartIrq_InitStructure.pfnRxIrqCb = Uart1RC_CallBackFun;//接受中断服务函数

   

    UartBaud_InitStructure.enRunMode = UartMode1;//模式1

    UartBaud_InitStructure.u32Baud = brr;

    UartBaud_InitStructure.u32Pclk = Sysctrl_GetPClkFreq();

   

    UART_InitStructure.bTouchNvic = TRUE;//中断使能

    UART_InitStructure.enRunMode = UartMode1;//模式1

    UART_InitStructure.enStopBit = Uart1bit;//一个停止位

    UART_InitStructure.pstcIrqCb = &UartIrq_InitStructure;

    UART_InitStructure.pstcMultiMode = &UartMulti_InitStructure;

    Uart_Init(UARTCH1,&UART_InitStructure);//初始化

    Uart_SetClkDiv(UARTCH1,Uart8Or16Div);//设置分频

   

    u16Scnt = Uart_CalScnt(UARTCH1,&UartBaud_InitStructure);//计算uart1波特率

    Uart_SetBaud(UARTCH1,u16Scnt);//设置波特率

   

    Uart_ClrIsr(UARTCH1);//清中断

    Uart_ClrStatus(UARTCH1,UartTC);//清发送完成标志位

    Uart_ClrStatus(UARTCH1,UartRC);//清接收完成标志位

    Uart_EnableIrq(UARTCH1,UartRxIrq);//使能接收中断

    Uart_EnableFunc(UARTCH1,UartRx);//使能中断服务函数

    EnableNvic(UART1_IRQn,IrqLevel1,TRUE);//中断优先级配置

}



/************************

函数名称:USART_SendByte

函数作用:串口发送字节

函数入口:byte 发送数据

函数出口:无

************************/

void USART_SendByte(uint8_t byte)

{

    Uart_SendData(UARTCH1,byte);

}



/************************

函数名称:USART_RecByte

函数作用:串口接收字节

函数入口:无

函数出口:byte 接收数据

************************/

uint8_t USART_RecByte(void)

{

    uint8_t byte = 0;

    while(Uart_GetStatus(UARTCH1,UartRC) == FALSE); //直到接收完成

    byte = Uart_ReceiveData(UARTCH1);

    return byte;

}



/************************

函数名称:USART_SendStr

函数作用:USART发送字符串--查询

函数入口:str 发送字符串

          Length 长度

函数出口:无

************************/

void USART_SendStr(char* str,uint32_t Length)

{

    uint8_t i = 0;

    for(i=0;i<Length;i++)

    {

        Uart_SendData(UARTCH1,*str);

        str++;

    }

        

}



/************************

函数名称:USART_Echo

函数作用:USART回显

函数入口:无

函数出口:无

************************/

void USART_Echo(void)

{

    uint8_t byte;

    byte = USART_RecByte();

    USART_SendByte(byte);

}



/************************

函数名称:fputc

函数作用:printf重定义

函数入口:无

函数出口:无

************************/

int fputc(int c, FILE *stream)

{

    USART_SendByte(c);

    return c;

}

下图1
把回显函数放到主函数中运行没有任何现象,(一般在调试串口的时候我都会写一个回显函数来判断串口是否调通)
debug调试如下图(断点在回显之前,还没进入函数)
下图2
debug下一步进入函数(串口助手上发送了一个 2 ),此时现象如下图
下图3
按照常理来说,2 应该在上位机上显示出来才对呀,为什么没有显示呢?发送函数是通的,说明是接收出了问题,然后debug单步运行,好像是卡在了这里


使用特权

评论回复
tpgf| | 2022-8-2 16:45 | 显示全部楼层
能进入接收中断吗

使用特权

评论回复
coshi| | 2022-8-2 16:57 | 显示全部楼层
谁是接收端啊

使用特权

评论回复
qcliu| | 2022-8-2 17:10 | 显示全部楼层
使用的是什么接收模式啊

使用特权

评论回复
drer| | 2022-8-2 17:19 | 显示全部楼层
能用示波器监测到是吗

使用特权

评论回复
kxsi| | 2022-8-2 17:30 | 显示全部楼层
串口助手是上位机的是吗

使用特权

评论回复
wiba| | 2022-8-2 17:45 | 显示全部楼层
标志位一直没有变化是吗

使用特权

评论回复
caigang13| | 2022-8-2 19:37 | 显示全部楼层
串口配置是否有问题

使用特权

评论回复
newwei| | 2022-8-3 09:03 | 显示全部楼层
看看波特率是不是配对了

使用特权

评论回复
tbbt| | 2022-8-7 23:16 | 显示全部楼层
本帖最后由 tbbt 于 2022-8-7 23:19 编辑

我和这位大哥问题类似,之前用内部4M时钟,收发都误码,现在使用内部24M时钟,是可以收正确了,但发送误码
https://bbs.21ic.com/icview-3244744-1-1.html

使用特权

评论回复
百里素雪| | 2022-11-22 23:20 | 显示全部楼层
是不是配置错了,时隙误码什么的

使用特权

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

本版积分规则

21

主题

46

帖子

0

粉丝