打印
[技术问答]

华大串口调试问题

[复制链接]
2571|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Tobbie|  楼主 | 2020-7-22 22:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位帮忙我看看是哪里配置出问题了,一直没法输出,主函数调用
void USART1_Sendchar(u8 Data)
{   
    while(Uart_GetStatus(UARTCH1,UartTC)==RESET);//等待字符发送完成
    Uart_SendData(UARTCH1,Data);   
}
串口1配置如下
/***************************************************************************
*   函 数 名: usart_init
*   功能说明: 串口初始化函数
*   形    参:
*   返 回 值:
*   说    明:
***************************************************************************/
void usart_init( u32 buad)
{
         
                stc_uart_config_t  stcCfg;
                stc_uart_baud_t stcBaud;       
          stc_uart_multimode_t stcMulti;
                stc_gpio_config_t stcGpioCfg;

                DDL_ZERO_STRUCT(stcGpioCfg);
          DDL_ZERO_STRUCT(stcMulti);
                DDL_ZERO_STRUCT(stcCfg);
                DDL_ZERO_STRUCT(stcBaud);
//外设时钟配置
                Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);//GPIO时钟使能
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);//UART1外设模块时钟使能
//IO配置       
                stcGpioCfg.enDir = GpioDirOut;
                Gpio_Init(GpioPortD,GpioPin0,&stcGpioCfg);  //配置PD0 为UART1 TX
          Gpio_SetAfMode(GpioPortD,GpioPin0,GpioAf3); //配置PD0 复用功能
          
                stcGpioCfg.enDir = GpioDirIn;
                Gpio_Init(GpioPortD,GpioPin1,&stcGpioCfg);  //配置PD1 为UART1 RX
                Gpio_SetAfMode(GpioPortD,GpioPin1,GpioAf3); //配置PD1 复用功能
       
//usart1配置
    stcMulti.enMulti_mode = UartNormal;//正常工作模式
          Uart_SetMultiMode(UARTCH1,&stcMulti);//多主机单独配置
       
                stcCfg.enRunMode        = UartMode3;              //模式3
                stcCfg.enStopBit        = Uart1bit;               //1位停止位
                stcCfg.bTouchNvic       =TRUE;                    //使能中断
                Uart_SetMMDOrCk(UARTCH1,UartEven);                //偶校验
                Uart_Init(UARTCH1, &stcCfg);                      //串口初始化
                               
                Uart_SetClkDiv(UARTCH1,Uart8Or16Div);//采样分频,模式1/3选择16分频
//波特率配置
    stcBaud.u32Pclk = Sysctrl_GetPClkFreq();
                stcBaud.u32Baud=buad;
          stcBaud.enRunMode=UartMode3;
          Uart_CalScnt(UARTCH1,&stcBaud);

//串口中断使能
    Uart_ClrStatus(UARTCH1,UartRC);                ///<清接收请求
    Uart_ClrStatus(UARTCH1,UartTC);                ///<清发送请求
    Uart_EnableIrq(UARTCH1,UartRxIrq);             ///<使能串口接收中断
    //Uart_EnableIrq(M0P_UART0,UartTxIrq);         ///<使能串口接收中断
    EnableNvic(UART1_IRQn, IrqLevel3, TRUE);       ///<系统中断使能
}
/************************************************
函数:Uart1_IRQHandler
功能:
输出参数:
输入参数:
************************************************/
//UART1中断函数
void Uart1_IRQHandler(void)
{
    if(Uart_GetStatus(UARTCH1, UartRC))         //UART1数据接收
    {
        Uart_ClrStatus(UARTCH1, UartRC);        //清中断状态位
        Uart_ReceiveData(UARTCH1);   //接收数据字节
    }

    if(Uart_GetStatus(UARTCH1, UartTC))         //UART1数据发送
    {
        Uart_ClrStatus(UARTCH1, UartTC);        //清中断状态位
    }

}

使用特权

评论回复
沙发
Tobbie|  楼主 | 2020-7-23 12:07 | 只看该作者
有人指导一下吗,华大第一次用

使用特权

评论回复
板凳
martinhu| | 2020-7-23 20:01 | 只看该作者
void USART1_Sendchar(u8 Data)
{   
    while(Uart_GetStatus(UARTCH1,UartTC)==RESET);//等待字符发送完成
    Uart_SendData(UARTCH1,Data);   
}
这个函数好像有问题,TC应该是发完之后置1,所以这个while应该是一直卡住了。
我记得查询发送有例子的,发送前查询TXE,发送后查询TC是否置起,然后,再清除TC

另外中断里面TC清除的语句要删掉。

使用特权

评论回复
地板
yueguang3048| | 2020-7-24 09:45 | 只看该作者
Tobbie 发表于 2020-7-23 12:07
有人指导一下吗,华大第一次用

跟STM32几乎一样

使用特权

评论回复
5
Tobbie|  楼主 | 2020-7-25 16:37 | 只看该作者
martinhu 发表于 2020-7-23 20:01
void USART1_Sendchar(u8 Data)
{   
    while(Uart_GetStatus(UARTCH1,UartTC)==RESET);//等待字符发送完 ...

谢谢回复,TC发完之后置1,然后跳出while,这个是没问题的

使用特权

评论回复
6
Tobbie|  楼主 | 2020-7-25 16:39 | 只看该作者

根据手册上的配置,也参考了网上例子,调试助手那里就是没有任何接收数据

使用特权

评论回复
7
Tobbie|  楼主 | 2020-7-26 17:22 | 只看该作者

华大例程烧录后,串口也没反应
void Uart_PortInit(void)
{
    stc_gpio_config_t stcGpioCfg;
    DDL_ZERO_STRUCT(stcGpioCfg);
    stcGpioCfg.enDir = GpioDirOut;
    Gpio_Init(GpioPortD,GpioPin0,&stcGpioCfg);
    Gpio_SetAfMode(GpioPortD,GpioPin0,GpioAf3);//TX
    stcGpioCfg.enDir = GpioDirIn;
    Gpio_Init(GpioPortD,GpioPin1,&stcGpioCfg);
    Gpio_SetAfMode(GpioPortD,GpioPin1,GpioAf3);//RX
}
int32_t main(void)
{  
    uint16_t u16Scnt = 0;
    stc_uart_config_t  stcConfig;
    stc_uart_irq_cb_t stcUartIrqCb;
    stc_uart_multimode_t stcMulti;
    stc_uart_baud_t stcBaud;
   
    en_uart_mmdorck_t enTb8;

    DDL_ZERO_STRUCT(stcConfig);
    DDL_ZERO_STRUCT(stcUartIrqCb);
    DDL_ZERO_STRUCT(stcMulti);
    DDL_ZERO_STRUCT(stcBaud);
   
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);//模块时钟使能
    Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);
    Uart_PortInit();//端口初始化

    stcUartIrqCb.pfnRxIrqCb   = RxIntCallback;//中断服务函数指定
    stcUartIrqCb.pfnTxIrqCb   = TxIntCallback;
    stcUartIrqCb.pfnRxFEIrqCb = ErrIntCallback;
    stcUartIrqCb.pfnPEIrqCb   = PErrIntCallBack;
    stcUartIrqCb.pfnCtsIrqCb  = CtsIntCallBack;
    stcConfig.pstcIrqCb = &stcUartIrqCb;
    stcConfig.bTouchNvic = TRUE;
        if(TRUE == stcConfig.bTouchNvic)
        {
                EnableNvic(UART1_IRQn,IrqLevel3,TRUE);
        }
    stcConfig.enRunMode = UartMode3;//模式3
    stcConfig.enStopBit = Uart1bit;  
    stcMulti.enMulti_mode = UartNormal;//正常工作模式
          Uart_SetMultiMode(UARTCH1,&stcMulti);//多主机单独配置
       
    Uart_Init(UARTCH1, &stcConfig);//端口初始化
   
    Uart_SetClkDiv(UARTCH1,Uart8Or16Div);//采样分频
    stcBaud.u32Pclk = Sysctrl_GetPClkFreq();
    stcBaud.enRunMode = UartMode3;
    stcBaud.u32Baud = 9600;
    u16Scnt = Uart_CalScnt(UARTCH1,&stcBaud);//波特率计算值
    Uart_SetBaud(UARTCH1,u16Scnt);//波特率设置
   
    Uart_ClrIsr(UARTCH1);//清所有请求
    Uart_EnableIrq(UARTCH1,UartTxIrq);
    Uart_EnableFunc(UARTCH1,UartRx);
    enTb8 = UartDataOrAddr;//Bit8由软件读写决定
    Uart_SetMMDOrCk(UARTCH1,enTb8);
    Uart_ClrStatus(UARTCH1,UartTC);
    M0P_UART1->SBUF = (1<<8)|SLAVEADDR;  //发送地址后,触发中断,后续发送数据        
    while(1)
                {
               
                   Uart_SendData(UARTCH1,'a');
               
                }
}

使用特权

评论回复
8
martinhu| | 2020-7-27 09:00 | 只看该作者
Tobbie 发表于 2020-7-25 16:39
根据手册上的配置,也参考了网上例子,调试助手那里就是没有任何接收数据 ...

问题是你的自己写的函数里面,发送之前就要去TC置1,不然就一直卡死在while等待里面了吧?
void USART1_Sendchar(u8 Data)
{   
    while(Uart_GetStatus(UARTCH1,UartTC)==RESET);//等待字符发送完成
    Uart_SendData(UARTCH1,Data);   
}
你看你的函数,发送之前就等着TC置1??

使用特权

评论回复
9
Tobbie|  楼主 | 2020-7-27 23:13 | 只看该作者
martinhu 发表于 2020-7-27 09:00
问题是你的自己写的函数里面,发送之前就要去TC置1,不然就一直卡死在while等待里面了吧?
void USART1_S ...


这个函数我试过,ST上面是没问题的,另外你说的方法我也试过了,串口助手没有反应


使用特权

评论回复
10
martinhu| | 2020-7-28 11:04 | 只看该作者
Tobbie 发表于 2020-7-27 23:13
这个函数我试过,ST上面是没问题的,另外你说的方法我也试过了,串口助手没有反应


库函数里面本身就有查询发送的例子,不明白你为什么非要按照自己的理解写一个

使用特权

评论回复
11
walton1226| | 2020-7-28 13:42 | 只看该作者
本帖最后由 walton1226 于 2020-7-28 13:56 编辑

我查看了hc32l110的手册。

Uarttxe 发送缓冲为空中断标志,上电复位值为0,硬件置位,硬件清零,(楼主软件清此位,错误)
只有写完数据寄存器后才置位,以此是先写数据,再查询此位。

UartTC 发送完成中断标志,上电复位值为0,硬件置位,软件清零。
只有写完数据寄存器并完成发送才置位,以此是先写数据,再查询此位(需要软件清0)。

对于发送数据函数,查询Uarttxe即可,只要Uarttxe为1即可以往里面写数据,不用等UartTC置位。
USART_SendData(USART1, dat);                        
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);        

使用特权

评论回复
12
walton1226| | 2020-7-28 13:54 | 只看该作者
stm32的TXE,TC上电复位都为1,因此可以先查询此位再写数据。

56275f1fbd2bbaa9b.png (29.41 KB )

56275f1fbd2bbaa9b.png

使用特权

评论回复
13
詹求实| | 2020-7-28 22:15 | 只看该作者
不是有官方的例程吗?跟着官方的例程走就很OK了。

使用特权

评论回复
14
Tobbie|  楼主 | 2020-7-30 12:21 | 只看该作者
martinhu 发表于 2020-7-28 11:04
库函数里面本身就有查询发送的例子,不明白你为什么非要按照自己的理解写一个
...

已解决,谢谢

使用特权

评论回复
15
Tobbie|  楼主 | 2020-7-30 12:22 | 只看该作者
walton1226 发表于 2020-7-28 13:42
我查看了hc32l110的手册。

Uarttxe 发送缓冲为空中断标志,上电复位值为0,硬件置位,硬件清零,(楼主软 ...

解释很清晰,谢谢

使用特权

评论回复
16
Tobbie|  楼主 | 2020-7-30 13:25 | 只看该作者

在论坛上上下载了例程,改好IO调试结果,接收数据有误,硬件会干扰到串口接收吗

使用特权

评论回复
17
merry_zsp| | 2020-7-31 08:43 | 只看该作者
官方有现成的库,为什么要自己写呢?还是对寄存器或者芯片理解不对导致的。

使用特权

评论回复
18
Tobbie|  楼主 | 2020-7-31 13:43 | 只看该作者
附件是论坛下载的例程,以下是更改地方,昨天拿另外一块板子测试,也出现同样现象第一次用华大,问题比较多,LCD什么的都调好了,不想重新选型啊



hc32l136.rar

1.32 MB

论坛例程,修改了IO,其余没有变化

使用特权

评论回复
评论
martinhu 2020-7-31 23:14 回复TA
这个代码有问题,查询发送和中断发送混淆了,而且没有使能接收中断 
19
Tobbie|  楼主 | 2020-7-31 13:45 | 只看该作者
Tobbie 发表于 2020-7-31 13:43
附件是论坛下载的例程,以下是更改地方,昨天拿另外一块板子测试,也出现同样现象第一次用华大,问题比较多 ...

各位帮忙指导下是什么问题

使用特权

评论回复
20
martinhu| | 2020-7-31 14:37 | 只看该作者
本帖最后由 martinhu 于 2020-7-31 23:17 编辑
Tobbie 发表于 2020-7-31 13:43
附件是论坛下载的例程,以下是更改地方,昨天拿另外一块板子测试,也出现同样现象第一次用华大,问题比较多 ...

这个代码有问啊,你又是使能了发送中断,又是在主循环里面查询发送?
楼主是不是很少调试串口啊?两个混起来用?

看看这个例程,中断接收,用宏定义选择中断发送和查询发送两种方式。

上位机发送6个字节,MCU回复6个相同字节给上位机。

hc32l13x_ddl_Rev1.9.1_uart_RxInt_TxPoll&amp;TxInt.zip (663.86 KB)




使用特权

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

本版积分规则

16

主题

105

帖子

1

粉丝