myemcu 发表于 2018-10-1 15:38:50

感觉STC8A8K是个假的多串口,因为u3,u4不能同时在一个...

我感觉STC8A8K是个假的多串口,因为u3,u4不能同时在一个工程中使用,代码在PxMx寄存器上出了问题。比如:当P0M0&=~0x03;
P0M1&=~0x03;时,可以使用u3;P0M0&=~0x0c,P0M1&=~0x0c;时可以使用u4,但我想P0m0=0x0f,p0m1=0x0f来同时启用u3,u4就不行了,非常杯具。

myemcu 发表于 2018-10-1 15:40:55

Uart3_Init();
delay(100000);       
       
Uart4_Init();       
delay(100000);我想要的效果是这两个串口都启用,但始终卡在P0Mx的设置上,好纠结。。

takashiki 发表于 2018-10-1 16:34:17

P0M0&=~0x03;P0M1&=~0x03                   把低2位清零了
P0M0&=~0x0c,P0M1&=~0x0c;                  把.2、.3位清零了
这两合一起等价于
P0m0=0x0f,p0m1=0x0f?

自己的问题去质疑别人,还那么理直气壮?
难道不应该是
P0M0&=~0x0F,P0M1&=~0x0F;

1a2b3c 发表于 2018-10-1 18:10:34

大放假的都还在工作学习,辛苦了

饭桶 发表于 2018-10-1 18:43:46

低级错误常常犯,芯片不背傻傻锅。

myemcu 发表于 2018-10-1 19:14:16

takashiki 发表于 2018-10-1 16:34
P0M0&=~0x03;P0M1&=~0x03                   把低2位清零了
P0M0&=~0x0c,P0M1&=~0x0c;                  ...

P0M0&=~0x0F,P0M1&=~0x0F;中的~是我着急出门,发帖的时候忘敲了,然而加上也并没什么暖用。

myemcu 发表于 2018-10-1 19:19:33

1a2b3c 发表于 2018-10-1 18:10
大放假的都还在工作学习,辛苦了

吊丝没有假期,假期只属于成功人士。

myemcu 发表于 2018-10-1 19:31:33

我再把情形描述清晰一点,只要写成P0M0&=~0x03;
P0M1&=~0x03;这种情况是单开U3,结果就正常,但我要是写成P0M0&=~0x0f;
P0M1&=~0x0f;的话(我的本意是U3,4能同时使用在一个Prjoect中),U3直接不能用了。       

LM1876 发表于 2018-10-1 19:39:31

四个窜口可以同时用啊,

myemcu 发表于 2018-10-1 19:45:07

LM1876 发表于 2018-10-1 19:39
四个窜口可以同时用啊,

先不说4个,就u3,u4能同时使用就行,
Uart3_Init();
delay(100000);       
       
// P0M0&=~(0x03|0x0C);
// P0M1&=~(0x03|0x0c);       
       
P0M0&=~0x0f;
P0M1&=~0x0f;       
实验已证明这不行,写成这样u3直接不工作。

90999 发表于 2018-10-1 20:18:26

直接位操作不行么?

myemcu 发表于 2018-10-1 20:25:31

90999 发表于 2018-10-1 20:18
直接位操作不行么?

你的意思是,P0Mx寄存器能直接位操作?

myemcu 发表于 2018-10-1 20:26:28

我直接贴上关键部位代码吧,以证明事实的真实性:
P1M0 &= ~0xFF;        // P0.0、P0.1_U3之必备操作,不然不进串口中断
P1M1 |=0xFF;       
       
P0M0 &= ~0xFF;
P0M1 |=0xFF;
       
P0M0&=~0x0f; // 改成0x03,U3立即正常、稳定、可用
P0M1&=~0x0f; //               
       
Uart3_Init();
delay(100000);       
       
Uart4_Init();       
delay(100000);
       
P_SW2&=0x00;

wmm20031015 发表于 2018-10-1 21:07:59

应该问题不是在P0M0和P0M1上面,加一行:P0|=0x0f;把P00~P03置高

myemcu 发表于 2018-10-1 22:00:25

wmm20031015 发表于 2018-10-1 21:07
应该问题不是在P0M0和P0M1上面,加一行:P0|=0x0f;把P00~P03置高

从情怀上说,十分感谢这位兄台充满正能量的回答,但结果还是不行。

ap0705307 发表于 2018-10-2 12:33:00

P0M0,P0M1 拉低只是IO配置准双向口,跟串口无关,按你的说法这几个IO不能同时配置准双向口?
P0M0 = 0x00;                              //设置P0.0~P0.7为双向口模式
P0M1 = 0x00;

su33691 发表于 2018-10-2 15:28:37

STC的例程说的很明白:
       P_SW2 &= ~2;P0n_push_pull(0x02);       //串口3使用 P0.0 P0.1
       P_SW2 &= ~4;P0n_push_pull(0x08);       //串口4使用 P0.2 P0.3

X-h-p 发表于 2018-10-2 16:17:59

4个串口同可以时用,仔细看代码

myemcu 发表于 2018-10-2 19:06:55

su33691 发表于 2018-10-2 15:28
STC的例程说的很明白:
       P_SW2 &= ~2;P0n_push_pull(0x02);       //串口3使用 P0.0 P0.1
       P_SW2 &= ~4;P0 ...

你说的这个早试过了。

myemcu 发表于 2018-10-2 19:23:09

X-h-p 发表于 2018-10-2 16:17
4个串口同可以时用,仔细看代码

不仅看了,还亲自实践了,给你说个更诡异的事情吧,P0上的U3按理说与P1口(U2)的设置无关,但我要是注释掉P1口的设置,U3照样嗝屁。

myemcu 发表于 2018-10-2 20:31:27

最新测试结果出来了,U1,3,4共存,U2不共存,之前U3,4不共存的原因是杜邦线内部接触不好(眼睛看不出来,用手捂紧没事)。

myemcu 发表于 2018-10-2 20:31:54

感谢各位热心回复。

myemcu 发表于 2018-10-2 21:51:05

U3,4共存的关键是:P1M0 &= ~0xFF;
P1M1 |=0xFF;有它们,U3,4正常,U2不通,没它们U2正常,U3,4不通。

X-h-p 发表于 2018-10-3 15:54:04

    P0M1 = 0x00;
    P0M0 = 0x0a;       

TXD口推挽输出,RXD口准双向口
void        UART3_config(void)        //使用Timer3做波特率.
{
    u8        i;
    /*********** 波特率使用定时器3 *****************/
    S3CON |= (1<<6);        //BRT select Timer3
    T4T3M &= 0xf0;                //停止计数, 清除控制位
    IE2&= ~(1<<5);        //禁止中断
    T4T3M |=(1<<1);        //1T
    T4T3M &= ~(1<<2);        //定时
    T4T3M &= ~1;                //不输出时钟
    T3L = 0xD0;                //设定定时初值
    T3H = 0xFF;                //设定定时初值
    T4T3M |=(1<<3);        //开始运行
    S3CON &= ~(1<<5);        //禁止多机通讯方式
    S3CON &= ~(1<<7);        // 8位数据, 1位起始位, 1位停止位, 无校验
    IE2   |=(1<<3);        //允许中断
    S3CON |=(1<<4);        //允许接收
    P_SW2 &= ~2;                //切换到 P0.0 P0.1
}

void        UART4_config(void)        //使用Timer4做波特率.
{
    u8        i;
    /*********** 波特率使用定时器4*****************/
    S4CON |= (1<<6);        //BRT select Timer4
    T4T3M &= 0x0f;                //停止计数, 清除控制位
    IE2   &= ~(1<<6);        //禁止中断
    T4T3M |=(1<<5);        //1T
    T4T3M &= ~(1<<6);        //定时
    T4T3M &= ~(1<<4);        //不输出时钟
    TH4 = 0xff;
    TL4=0xD0;        ;
    T4T3M |=(1<<7);        //开始运行
    S4CON &= ~(1<<5);        //禁止多机通讯方式
    S4CON &= ~(1<<7);        // 8位数据, 1位起始位, 1位停止位, 无校验
    IE2   |=(1<<4);        //允许中断
    S4CON |=(1<<4);        //允许接收
    P_SW2 &= ~4;                //切换到 P0.2 P0.3
}

myemcu 发表于 2018-10-4 02:54:36

X-h-p 发表于 2018-10-3 15:54
P0M1 = 0x00;
    P0M0 = 0x0a;       



多谢,最后曲线救国了。。

tjx0512 发表于 2018-10-5 13:55:23

4个串口同时使用肯定是没问题的,只是后面两个不支持中优先级设置 ,实时性不高。

myemcu 发表于 2018-10-5 21:16:37

tjx0512 发表于 2018-10-5 13:55
4个串口同时使用肯定是没问题的,只是后面两个不支持中优先级设置 ,实时性不高。 ...

多谢,决定画个板试试。

No.5 发表于 2018-10-6 06:48:42

杜邦线……这种错误也算是经典了

myemcu 发表于 2018-10-6 22:15:54

No.5 发表于 2018-10-6 06:48
杜邦线……这种错误也算是经典了

不说了,推荐个电影《大师兄》感觉还不错http://www.xlp2.com/html/47204.html。。

zmh169 发表于 2018-10-9 08:11:19

myemcu 发表于 2018-10-2 20:31
最新测试结果出来了,U1,3,4共存,U2不共存,之前U3,4不共存的原因是杜邦线内部接触不好(眼睛看不出来,用 ...

莫非楼主调试都不用示波器?不然也不会被杜邦线给害了

myemcu 发表于 2018-10-9 08:46:14

zmh169 发表于 2018-10-9 08:11
莫非楼主调试都不用示波器?不然也不会被杜邦线给害了

两个字,穷。。

jssd 发表于 2018-10-9 09:15:56

我们的板子四个串口都在同时用呀。没发现什么问题。

bs1234 发表于 2018-10-9 09:40:39

我验证过,4个串口可以同时用,没有问题啊。是不是你代码有问题

myemcu 发表于 2018-10-10 08:48:58

bs1234 发表于 2018-10-9 09:40
我验证过,4个串口可以同时用,没有问题啊。是不是你代码有问题

目前只有个小问题,就是P0上的u3,u4受P1口的配置影响,如果不配置P1,则U3,4不能用。

makesoft 发表于 2018-10-10 10:47:52

myemcu 发表于 2018-10-10 08:48
目前只有个小问题,就是P0上的u3,u4受P1口的配置影响,如果不配置P1,则U3,4不能用。 ...

你这个确实不叫问题,记得DATASHEET上有描述,属于说明书阅读不仔细{:lol:}

myemcu 发表于 2018-10-10 16:23:36

makesoft 发表于 2018-10-10 10:47
你这个确实不叫问题,记得DATASHEET上有描述,属于说明书阅读不仔细

恩,板打回来再试试。

小李非刀 发表于 2018-10-10 17:34:26

楼主你联系过STC客服吗?
你可以联系STC客服要一个4串口同时中断收发的程序,4个全双工串口工作于不同的波特率,115200,57600,38400,19200,然后你可以接4台电脑的串口助手,同时测试,程序会数据原样返回,你可以每个串口测试1M字节看看,没有问题的。

myemcu 发表于 2018-10-13 21:22:27

小李非刀 发表于 2018-10-10 17:34
楼主你联系过STC客服吗?
你可以联系STC客服要一个4串口同时中断收发的程序,4个全双工串口工作于不同的波 ...

懂,等板打回来再说。。

不舍的六年 发表于 2018-10-14 10:49:04

4串口可以同时用,没问题的,我已经在项目中实践过了
页: [1]
查看完整版本: 感觉STC8A8K是个假的多串口,因为u3,u4不能同时在一个...