迪文科技论坛

 找回密码
 立即注册
搜索
查看: 1125|回复: 4

【提问】请问有uart3配置使用的例程么

[复制链接]

2

主题

5

回帖

63

积分

注册会员

Rank: 2

积分
63
发表于 2020-5-29 09:45:08 | 显示全部楼层 |阅读模式
如题,找了大半天了,头发都快白了。只看到uart2、4、5的。俺用的T5L
回复

使用道具 举报

0

主题

72

回帖

2625

积分

金牌会员

Rank: 6Rank: 6

积分
2625
发表于 2020-5-29 10:41:04 | 显示全部楼层

【提问】

在os里面进行配置uart3,其他的使用都是一样的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

1

主题

28

回帖

832

积分

高级会员

Rank: 4

积分
832
发表于 2020-5-29 14:40:17 | 显示全部楼层
回复

使用道具 举报

0

主题

106

回帖

959

积分

高级会员

Rank: 4

积分
959
发表于 2020-5-30 20:00:57 | 显示全部楼层
/*串口3配置*//**/
void Uart3Init(void)
{
  P0MDOUT    |= 0xC0;//配置串口输出推动状态,11000000/P0.6  P0.7为输出
  MUX_SEL    |= 0x20;//配置 1=UART3 接口引出为 P0.6、P0.7 作为串口
uart3_busy = 0;     //发送标记
  uart3_rx_count = 0;
  SCON1      = 0xD0;//11010000  .7=1=8bit UART;   .4=REN=1
  SREL1H     = 0x03;     //   /*1024-FOSC/(32*波特率)*/
  SREL1L     = 0xC8;
  IEN2       = 0x01;     //开启串口3中断触发标记,RI =.0   TI=.1 位
}

/*串口3接收中断*/
void UART3_ISR_PC(void)    interrupt 16
{
  uint8_t res=0;//暂存区
  EA=0;
  if(SCON1&0x01)//判断接收完成
  {
    res=SBUF1;
    Uart3_Rx[uart3_rx_count]=res; //开始读取针数据
    uart3_rx_count++;
    SCON1 &= 0xFE;  //清零接收标记//必须写两次
    SCON1 &= 0xFE;  //清零接收标记 /必须写两次
  }
  if(SCON1&0x02)  //判断发发送完成
  {
    SCON1&=0xFD;    //清零硬件发送完成标记
    SCON1&=0xFD;      //清零硬件发送完成标记
    uart3_busy=0;
  }   
  EA=1;
}

/*发送单个字节数据*/
void Uart3SendByte(uint8_t dat)
{
  while(uart3_busy==1);//等上个数据发送完成
  uart3_busy=1;//标记发送中,一个一个数据分开
  SBUF1 = dat;//下个数据
}
/*串口3发送字符串*/
void Uart3SendStr(uint8_t *pstr,uint8_t strlen)
{
  if((NULL == pstr)||(0 == strlen))
  {
    return;
  }
  while(strlen--)
  {
    Uart3SendByte(*pstr);//将指针数据发送到SBUF1
    pstr++;                    //偏移指针地址
  }  
}

希望可以帮到你!

回复

使用道具 举报

2

主题

5

回帖

63

积分

注册会员

Rank: 2

积分
63
 楼主| 发表于 2020-6-1 10:40:41 | 显示全部楼层
调通了,谢谢各位的回答,代码都有了(我的代码是P0MDOUT |= 0x40,P07设成了输入)。
说下我主要耗费,免得后来的同仁走相同的弯路,主要是我对编译器理解的问题。
我的波特率是9600,使用的编译器是keil uVision4,
一开始我的设置是这样:
        SREL1H = (1024 - SYSTEM_SEQUENCE / (32 * 9600)) / 256;
        SREL1L = (1024 - SYSTEM_SEQUENCE / (32 * 9600)) % 256;
调不通,
后来设置是这样:
        SREL1H = (1024 - SYSTEM_SEQUENCE / 32 / 9600) / 256;
        SREL1L = (1024 - SYSTEM_SEQUENCE / 32 / 9600) % 256;
调通了。
看出区别来了没?32 * 9600溢出了。
再次谢谢各位的热心,尤其kehu20190527 的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-7-10 11:06 , Processed in 0.052365 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表