打印
[技术问答]

HC32L136K8使用UART1能收,发送不正常

[复制链接]
1113|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tbbt|  楼主 | 2022-8-7 23:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tbbt 于 2022-8-7 23:07 编辑

用PD0和PD1设置为UART1做485通讯,现在和电脑连接能收到正确的数据,但是发送给电脑的数据误码
///< UART配置
void App_UartCfg(void)
{
    stc_uart_cfg_t    stcCfg;

    DDL_ZERO_STRUCT(stcCfg);

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

    ///<UART Init
    stcCfg.enRunMode        = UartMskMode1;          ///<模式3
    stcCfg.enStopBit        = UartMsk1bit;           ///<1bit停止位
    stcCfg.enMmdorCk        = UartMskEven;           ///<偶检验
    stcCfg.stcBaud.u32Baud  = 19200;                  ///<波特率9600
    stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;       ///<通道采样分频配置
    stcCfg.stcBaud.u32Pclk  = Sysctrl_GetPClkFreq(); ///<获得外设时钟(PCLK)频率值
    Uart_Init(M0P_UART1, &stcCfg);                   ///<串口初始化

    ///<UART中断使能
    Uart_ClrStatus(M0P_UART1,UartRC);                ///<清接收请求
    Uart_ClrStatus(M0P_UART1,UartTC);                ///<清接收请求
    Uart_EnableIrq(M0P_UART1,UartRxIrq);             ///<使能串口接收中断
    Uart_EnableIrq(M0P_UART1,UartTxIrq);             ///<使能串口接收中断
    EnableNvic(UART1_IRQn, IrqLevel2, TRUE);       ///<系统中断使能
}

//UART1中断函数
void Uart1_IRQHandler(void)
{
    if(Uart_GetStatus(M0P_UART1, UartRC))         //UART1数据接收
    {
        Uart_ClrStatus(M0P_UART1, UartRC);        //清中断状态位
        rbuf[rin]= Uart_ReceiveData(M0P_UART1);   //接收数据字节
                                if (rin<127) rin++;
    }
    if(Uart_GetStatus(M0P_UART1, UartTC))         //UART1数据发送
    {
        Uart_ClrStatus(M0P_UART1, UartTC);        //清中断状态位
        sendok=0;;
    }
}

void mysend(void) {
        char i;
        RE1;
        for (i=0;i<slen;i++) {
                sendok=1;
                Uart_SendDataIt(M0P_UART1, sbuf);
                while(sendok) ;
        }
        Delay_ms(5);
        RE0;

}






使用特权

评论回复
沙发
tbbt|  楼主 | 2022-8-7 23:05 | 只看该作者
时钟使用内部24M

//系统时钟配置
static void App_ClkCfg(void)
{
          stc_sysctrl_clk_cfg_t stcCfg;
       
          Sysctrl_ClkSourceEnable(SysctrlClkRCL,TRUE);           // 使能RCL时钟
    Sysctrl_SetRCLTrim(SysctrlRclFreq32768);               // 配置内部低速时钟频率为32.768kHz
   
   // 因要使用的时钟源HCLK小于24M:此处设置FLASH 读等待周期为0 cycle(默认值也为0 cycle)
    Flash_WaitCycle(FlashWaitCycle0);
   
   // 时钟初始化前,优先设置要使用的时钟源:此处设置RCH为24MHz(默认值为4MHz)
    Sysctrl_SetRCHTrim(SysctrlRchFreq24MHz);
   
   // 选择内部RCH作为HCLK时钟源;
    stcCfg.enClkSrc    = SysctrlClkRCH;
   // HCLK SYSCLK/2
    stcCfg.enHClkDiv   = SysctrlHclkDiv2;
   // PCLK 为HCLK/8
    stcCfg.enPClkDiv   = SysctrlPclkDiv8;
   // 系统时钟初始化
    Sysctrl_ClkInit(&stcCfg);   

}

使用特权

评论回复
板凳
wubangmi| | 2022-8-8 17:30 | 只看该作者
系统时钟不是这么切换的,你可以查下用户手册,有一个部分说明了 RCH 不同振荡频率间切换流程

使用特权

评论回复
地板
tbbt|  楼主 | 2022-8-8 20:19 | 只看该作者
按上面大哥的建议,先启动内部4M时钟,再逐步切换到24M时钟,问题解决了,谢谢大家

使用特权

评论回复
5
skyred| | 2022-8-15 20:38 | 只看该作者
为什么呢?

使用特权

评论回复
6
martinhu| | 2022-8-16 08:52 | 只看该作者
tbbt 发表于 2022-8-7 23:05
时钟使用内部24M

//系统时钟配置

是不是因为你把HCLK分频了,实际系统时钟是12M?

使用特权

评论回复
7
tpgf| | 2022-9-5 15:39 | 只看该作者
另一端是pc机吗

使用特权

评论回复
8
qcliu| | 2022-9-5 16:10 | 只看该作者
系统时钟不能这样切换

使用特权

评论回复
9
drer| | 2022-9-5 16:20 | 只看该作者
有其他的分频代码吗

使用特权

评论回复
10
coshi| | 2022-9-5 16:30 | 只看该作者
必须要严格按照流程更改时钟分频吗

使用特权

评论回复
11
kxsi| | 2022-9-5 16:34 | 只看该作者
切换的时机有规定吗

使用特权

评论回复
12
wiba| | 2022-9-5 16:43 | 只看该作者
不能直接到24M的吗

使用特权

评论回复
13
foxsbig| | 2022-9-13 21:19 | 只看该作者
波特率?解析?

使用特权

评论回复
14
软核硬核| | 2022-9-14 16:46 | 只看该作者
时钟问题吧,这种时候就需要用到逻辑分析仪了!

使用特权

评论回复
15
Bowclad| | 2022-9-16 19:08 | 只看该作者
有其他的分频代码吗

使用特权

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

本版积分规则

5

主题

30

帖子

1

粉丝