乘风飞扬 发表于 2024-3-7 11:32:05

fanpu 发表于 2024-3-7 08:44
移植后还是不行

前面4楼已经更新增加了移植到STC32平台的例子

fanpu 发表于 2024-3-7 12:30:24

王昱顺 发表于 2024-3-7 09:14
P是偶校验位,如果不行可以尝试在acc操作后插入三个nop试试

好的,我试下

fanpu 发表于 2024-3-7 12:31:25

乘风飞扬 发表于 2024-3-6 19:40
附件是串口4+校验位与电脑收发测试,STC8系列平台、STC32平台的例子,供参考。 ...

谢谢,我再试下

fanpu 发表于 2024-3-7 14:22:22

55337575 发表于 2024-3-7 11:27
参考我的这个帖子吧。https://www.stcaimcu.com/forum.php?mod=viewthread&tid=6088

还是不行呀
void Uart4_Init(void)        //9600bps@33.1776MHz
{
        S4CON = 0x90;                //9位数据,可变波特率
        S4CON |= 0x08;        //校验位初始值为 1
        S4CON |= 0x40;                //串口4选择定时器4为波特率发生器
        T4T3M |= 0x20;                //定时器时钟1T模式
        T4L = 0xA0;                        //设置定时初始值
        T4H = 0xFC;                        //设置定时初始值
        T4T3M |= 0x80;                //定时器4开始计时
        IE2 |= 0x10;                //使能串口4中断
}

void        UART4_TxByte(unsigned char dat)
{
        ACC = dat;
        if(P)
        {
                S4CON |= 0x08;        //偶校验
        }
        else
        {
                S4CON &= ~0x08;        //偶校验
        }
        S4BUF = dat;                //发一个字节
        B_TX4_Busy = 1;                //标志发送忙
        while(B_TX4_Busy);        //等待发送完成
}

55337575 发表于 2024-3-8 09:54:34

fanpu 发表于 2024-3-7 14:22
还是不行呀
void Uart4_Init(void)        //9600bps@33.1776MHz
{


中断需要B_TX4_Busy=0.
void U4_Isr() interrupt 18
{
    if(S4TI)
    {
      S4TI=0;B_TX4_Busy=0;
    }
    if(S4RI)
    {
      S4RI=0;
    }
}
再确保EA=1;就应该没问题

fanpu 发表于 2024-3-8 10:37:26

找到问题了,是设备供电不足导致的3.3V压降到了2.6V导致设备无法工作,
串口我用示波器做了图形对比,正确代码如下,感谢各位大佬的帮助

void Uart4_Init(void)      //9600bps@33.1776MHz
{
      S4CON = 0x90;                //9位数据,可变波特率
      S4CON |= 0x40;                //串口4选择定时器4为波特率发生器
      T4T3M |= 0x20;                //定时器时钟1T模式
      T4L = 0xA0;                        //设置定时初始值
      T4H = 0xFC;                        //设置定时初始值
      T4T3M |= 0x80;                //定时器4开始计时
      IE2 |= 0x10;                //使能串口4中断
}

void      UART4_TxByte(unsigned char dat)
{
      ACC = dat;
      S4TB8=P ; //偶校验位
      S4BUF = dat;                //发一个字节
      B_TX4_Busy = 1;                //标志发送忙
      while(B_TX4_Busy);      //等待发送完成
}
页: 1 [2]
查看完整版本: STC32G128K 串口4 如何设置校验位 | 已解决