论坛首页 > 创客天地 > 方案应用展 > 基于stm8L单片机的IrDA红外数据...
查看:4434  |  回复:25
基于stm8L单片机的IrDA红外数据通讯实验
立创快报
【官方工作人员】
8
主题
1
回复
发表于Wed May 17 10:39:42 CST 2017   |  只看该作者 1# 电梯直达

基于stm8L单片机的IrDA红外数据通讯实验

 作者 立创赵工 

1、作品简介

       最近发现立创商城上有个IrDA收发器出现!玩够了常见的WIFI、蓝牙、GPRS2.4G nRF24L01电子器件和模块,笔者对IrDA还是没用过,决定尝尝鲜咯!因此,做了下面这个IrDA红外数据通讯实验。

    实验板外形图:

 

    PS: 这个实验板,因为电路较简单,笔者采用的是立创商城上,下单即可免费拿的“STM8L051+LT8920+ME6209的评估板模块(PCB空板)”进行改装的,该板的商品编号是:C94731 

    什么是IrDA? 顺此,先给大家简单介绍一下:

IrDA是红外数据组织(Infrared Data Association)的简称,目前广泛采用的IrDA红外连接技术就是由该组织提出的.到目前为止,全球采用IrDA技术的设备超过了5000万部。 IrDA已经制订出物理介质和协议层规格,以及2个支持IrDA标准的设备可以相互监测对方并交换数据。 初始的IrDA1.0标准制订了一个串行,半双工的同步系统,传输速率为2400bps115200bps,传输范围1 m,传输半角度为15度到30度。最近IrDA扩展了其物理层规格使数据传输率提升到4Mbps

    IrDA数据协议由物理层,链路接入层和链路管理层三个基本层协议组成,另外,为满足各层上的应用的需要,IrDA栈支持IrLAP, IrLMP, IrIAS, IrIAP, IrLPT, IrCOMM,IrOBEXIrLAN等。

    需要特别指出的是:本实验只是IrDA物理层的通讯实验。

2、作品亮点


    ① 所选用的IrDA收发器TFBS4711是一个小体积的红外收发模组,尺寸6x3x1.9mm

    ② 符合IrPHY1.2 标准,IrFM快速链接需求。

    ③ 通信速率:115.2kbs (SIR),支持双向、全半工的通讯链接。

    ④ 可实现的直线通讯距离:~1米。

    ⑤ 使用内置支持IrDA底层信号编码和解码的低功耗单片机STM8L051F3P6做主控。

    ⑥ IrDA模组耗电量极小,关断电流只有大概10nA

    ⑦ 采用最常用的MicroUSB插座作为电源输入接口。

     本实验所用的IrDA通信具有功耗低、链接时间短、通信安全、无电磁干扰等优点!

3、硬件原理图描述

    首先,我们先来这个实验电路的构架图:

    其中,单片机驱动部分的原理图,可为多个部分,下面逐个介绍:

    第一部分: 单片机主控部分

    备注说明: 上图采用ST公司的低功耗单片机STM8L051F3P6进行设计,该单片机的PC5PC6分别链接到IrDA收发器TFBS4711TXRX端口,而单片机的PB4用来控制TFBS4711的电源使能端,当PB4=0的时候,IrDA收发器才可正常工作,反之PB4=1,那么IrDA收发器关断,此时的耗电量极少噢!D1D2是工作状态指示灯,分别连接到PC0PC1

    第二部分:单片机外围部分

    备注说明: 如上图所示,P2SWIM接口,单片机STM8L051F3P6的程序,可通过ST-LINK/V2 开发工具对该芯片下载或仿真。而S1~S4是轻触按键,本实验电路,只焊接安装了S4按键,因为其它按键用不到。

    第三部分:系统的供电电源部分

    备注说明: 如上图所示,F1是可恢复保险丝(0.2A), U33.3VLDOD3是电源指示灯。

第四部分:IrDA模组TFBS4711的相关简介

TFBS4711是一个小体积的红外收发模组,它支持半双工的IrDA红外通信,传输速率可达115 .2kbit/s(SIR). 模组内部包含了一个PIN类型的光电二极管、一个红外发射管(IRED)和一个低功耗的CMOS控制芯片。它是为低功耗的IRDA标准而设计,直线通信高达至1。支持低功耗模式,当SD引脚有效的时候,这个模组的电流消化才10nA左右。相比一般的无线电传输(蓝牙、WIFI2.4G nRF24系列等等),红外传输具有无电磁干扰、通信距离短但安全性高、使用简单的特点,比如STM8或者STM32一般都集成了IrDA的硬件支持单元,结合使用TFBS4711即可快速建立起一个基于光技术的“无线”数据通信系统。

 4、材料清单(BOM列表)

    以下是这个电子制作的BOM列表,器件全部采购来自立创商城http://www.szlcsc.com,PCB板的制造在深圳嘉立创完成。

5、软件部分的描述

    本实验的主控单片机stm8L051F3P6 使用IAR公司的编译器进行软件开发,结合ST官方网站可下载的stm8L函数驱动库,进行coding。软件实现的主要功能是,按键S4触发后,两块同样配置和固件的PCBA板之间进行数据信息的交换,驱动LED等等。如下是实验代码的关键片段:


     6-1、单片机stm8L051F3P6IrDA 初始化片段

      6-2、主控程序片段


PS 该实验的完整软件、工程源码在这里,点击下载:TFBS4711的IrDA测试工程源码.rar 



6、现场试验&视频

    具体的实验视频链接如下:

      http://v.youku.com/v_show/id_XMjc2NzUxNDQwMA==.html


       

      

    

7、总结

      通过以上相关实验介绍,特别是视频方面的功能演示,相信大家对IrDA有了一定的了解。相比一般的无线电传输(蓝牙、WIFI、2.4G nRF24系列等等),红外传输具有无电磁干扰、通信距离短但安全性高、使用简单的特点,STM8或者STM32一般都集成了IrDA的硬件支持单元,操作IrDA就像操作串口一样简单!结合使用IrDA器件TFBS4711即可快速建立起一个基于光技术的“无线”数据通信系统。后续,我们将通过光纤的引入,进一步来介绍TFBS4711的高级应用,比如可隔离数万伏高电压的远距离数据通信或完整的IrDA协议栈功能应用等等。。。

  该帖子已被立创快报于Fri May 19 12:02:32 CST 2017编辑过
此账号用于发布《立创快报》最新资讯及相关趣味文章,欢迎大家多多关注!!!
回复 收藏
  举报
立创商城赵...
【官方工作人员】
130
主题
1324
回复
发表于Thu May 18 11:20:19 CST 2017   |  只看该作者 2#

今天,大致又看了一下stm8L051的手册,发现ST芯片的功能还是挺多,比如除了对 IrDA的编解码支持,它还支持对普通红外遥控(器)那种编码格式和相关硬件的支持:

 点击查看大图


《立创快报》总编辑、立创电子公共实验室建设者,企业QQ:2355740879
立创商城赵...
【官方工作人员】
130
主题
1324
回复
发表于Thu May 18 11:25:53 CST 2017   |  只看该作者 3#

实际应用中,如果单独设计这个IrDA的模组,建议的电路图和BOM如下:

 


《立创快报》总编辑、立创电子公共实验室建设者,企业QQ:2355740879
立创商城赵...
【官方工作人员】
130
主题
1324
回复
发表于Thu May 18 11:39:14 CST 2017   |  只看该作者 4#

读者思考一下,为何单片机的TXD引脚(波特率: 115200bps )输出的是这个波形? 

 

《立创快报》总编辑、立创电子公共实验室建设者,企业QQ:2355740879
立创商城赵...
【官方工作人员】
130
主题
1324
回复
发表于Thu May 18 11:45:13 CST 2017   |  只看该作者 5#

相应的,IrDA器件TFBS4711在收到串口的IrDA编码数据后,它的RXD引脚输出的实际波形如下:

 


《立创快报》总编辑、立创电子公共实验室建设者,企业QQ:2355740879
xcl123
0
主题
8
回复
发表于Thu Oct 12 10:09:09 CST 2017   |  只看该作者 6#
赵工,这个可以用串口进行数据透传吗?
立创商城赵...
【官方工作人员】
130
主题
1324
回复
发表于Thu Oct 12 11:02:48 CST 2017   |  只看该作者 7#
xcl123 发表于 Thu Oct 12 10:09:09 CST 2017  6# 赵工,这个可以用串口进行数据透传吗?

完全可以!  MCU1串口的输出 = MCU2串口的输入。

但使用这个IrDA器件,需要该单片机内部硬件支持IrDA的编码或解码, 还好ST的单片机比如 stm8或stm32 绝大部分都是支持的。

使用该功能,单片机只需初始化,使能一下IrDA的编码或解码即可,随后的“无线传输“ 跟一般的串口操作一模一样。


使用这个器件,比使用红外遥控器那种3个脚的接收器,简单的多了。

传统使用遥控器那种,单片机还要解码或编码(载波+数据,进行联合调制),代码量还挺多,一般的初学者未必能写出来或写好。


《立创快报》总编辑、立创电子公共实验室建设者,企业QQ:2355740879
遇见好时光
0
主题
1
回复
发表于Wed Oct 25 10:39:46 CST 2017   |  只看该作者 8#

5V系统中对于这个模块有什么要注意的。

立创商城赵...
【官方工作人员】
130
主题
1324
回复
发表于Wed Oct 25 11:56:12 CST 2017   |  只看该作者 9#
遇见好时光 发表于 Wed Oct 25 10:39:46 CST 2017  8# 5V系统中对于这个模块有什么要注意的。

对于5V:

VCC2 这个引脚不能直接接较高电压,比如5V。如果接5V需要串联一个电阻,确保Ired <= 85mA(建议用半,即85/2mA即可)

VCC1 这个是输入给芯片用的,可直接接入5V,但TXD和RXD跟外部的3.3V设备接口对接,要注意电平兼容或转换问题。
《立创快报》总编辑、立创电子公共实验室建设者,企业QQ:2355740879
yesterdat
0
主题
4
回复
发表于Sun Dec 03 15:41:24 CST 2017   |  只看该作者 10#

楼主辛苦了!

请问下这个红外收发器,传输距离可以有多远呀,6米能做到么?谢谢!

贪恋小白
0
主题
2
回复
发表于Tue Jan 16 13:38:20 CST 2018   |  只看该作者 11#
立创商城赵工 发表于 Thu May 18 11:39:14 CST 2017  4# 读者思考一下,为何单片机的TXD引脚(波特率: 115200bps )输出...
我猜测:第一个高电平是起始位,后面八位是数据位,LSB位在前面。这是被加码后的数据吧,加码规则:0转换成窄脉冲,1不做处理
贪恋小白
0
主题
2
回复
发表于Tue Jan 16 13:38:44 CST 2018   |  只看该作者 12#
yesterdat 发表于 Sun Dec 03 15:41:24 CST 2017  10# 楼主辛苦了! 请问下这个红外收发器,传输距离可以有多远呀,6...
手册上好像是说1米
立创商城赵...
【官方工作人员】
130
主题
1324
回复
发表于Tue Jan 16 14:57:05 CST 2018   |  只看该作者 13#
yesterdat 发表于 Sun Dec 03 15:41:24 CST 2017  10# 楼主辛苦了! 请问下这个红外收发器,传输距离可以有多远呀,6...

IrDA 主要是从安全性和低功耗考虑,因此传输距离都很近,一般1米多以内,这款也是。

当然,如果脑洞大开些,用光纤进行传播,距离就相当远了。


在空旷地,如果想传输30米以上,就得增加IR发射管的驱动电流,也可直接对接UART的收发引脚,不用额外编解码。但这个是另外一个方案了。


《立创快报》总编辑、立创电子公共实验室建设者,企业QQ:2355740879
孤君style
0
主题
1
回复
发表于Sun Apr 01 16:04:52 CST 2018   |  只看该作者 14#
赵工你好,如果用遥控功能,能达到2米吗?在这个距离下这个模块的发送和接收的电流能做到多低?谢谢
FOCUS电路...
3
主题
129
回复
发表于Sun Apr 01 21:26:17 CST 2018   |  只看该作者 15#
学习学习
立创商城赵...
【官方工作人员】
130
主题
1324
回复
发表于Mon Apr 16 15:37:50 CST 2018   |  只看该作者 16#
孤君style 发表于 Sun Apr 01 16:04:52 CST 2018  14# 赵工你好,如果用遥控功能,能达到2米吗?在这个距离下这个模块...

就这个器件来说,对射达不到2米,除非是用光纤进行对射传播。

得使用其它办法,比如类似这种TSAL6100大功率的发射管,就可以传很远(30米估计有的)

《立创快报》总编辑、立创电子公共实验室建设者,企业QQ:2355740879
WENTONG
0
主题
3
回复
发表于Mon May 28 10:11:22 CST 2018   |  只看该作者 17#

如何设置红外模式。stm32f103 MUC还是不行。请指教。

#include "stm32f10x.h"   
#include "delay.h"   
   
/** @addtogroup StdPeriph_Examples  
  * @{  
  */   
   
/** @addtogroup USART_IrDA_Receive  
  * @{  
  */    
   
/* Private typedef -----------------------------------------------------------*/   
/* Private define ------------------------------------------------------------*/   
#define  NOKEY  0x00   
#define  SEL    0x01   
#define  RIGHT  0x02   
#define  LEFT   0x03   
#define  UP     0x04   
#define  DOWN   0x05   
   
/* Private macro -------------------------------------------------------------*/   
/* Private variables ---------------------------------------------------------*/   
USART_InitTypeDef USART_InitStructure;   
uint8_t ReceivedData = 0;   
   
/* Private function prototypes -----------------------------------------------*/   
void RCC_Configuration(void);   
void GPIO_Configuration(void);   
   
/* Private functions ---------------------------------------------------------*/   
   
/**  
  * @brief  Main program  
  * @param  None  
  * @retval : None  
  */   
int main(void)   
{   
  /* System Clocks Configuration */   
  RCC_Configuration();   
   
  /* Configure the GPIO ports */   
  GPIO_Configuration();   
   
/* USART3 configuration ------------------------------------------------------*/   
  /* USART3 configured as follow:  
        - BaudRate = 115200 baud    
        - Word Length = 8 Bits  
        - One Stop Bit  
        - No parity  
        - Hardware flow control disabled (RTS and CTS signals)  
        - Receive and transmit enabled  
  */   
  USART_InitStructure.USART_BaudRate = 9600;   
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;   
  USART_InitStructure.USART_StopBits = USART_StopBits_1;   
  USART_InitStructure.USART_Parity = USART_Parity_No ;   
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   
     
  /* Configure the USART3 */   
  USART_Init(USART2, &USART_InitStructure);   
  /* Enable the USART3 */   
  USART_Cmd(USART2, ENABLE);   
   
  /* Set the USART3 prescaler */   
  USART_SetPrescaler(USART2, 0x1);   
  /* Configure the USART3 IrDA mode */   
  USART_IrDAConfig(USART2, USART_IrDAMode_Normal);   
   
  /* Enable the USART3 IrDA mode */   
  USART_IrDACmd(USART2, ENABLE);  
  
  
  
  
  USART_InitStructure.USART_BaudRate = 9600;   
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;   
  USART_InitStructure.USART_StopBits = USART_StopBits_1;   
  USART_InitStructure.USART_Parity = USART_Parity_No ;   
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   
     
  /* Configure the USART3 */   
  USART_Init(USART1, &USART_InitStructure);   
  /* Enable the USART3 */   
  USART_Cmd(USART1, ENABLE);   
   
  /* Set the USART3 prescaler */   
  USART_SetPrescaler(USART1, 0x1);   
  /* Configure the USART3 IrDA mode */   
  USART_IrDAConfig(USART1, USART_IrDAMode_Normal);   
   
  /* Enable the USART3 IrDA mode */   
  USART_IrDACmd(USART1, ENABLE);  
   
  while (1)   
  {   
    
    USART_SendData(USART1,1);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)   
    {   
    }
    delay_ms(1000);
    
    /* Wait until a byte is received */   
    while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET)   
    {   
    }   
    /* Read the received byte */   
    ReceivedData = USART_ReceiveData(USART2);   
   
    switch(ReceivedData)   
    {   
      case UP:   
        //GPIO_Write(GPIO_LED, GPIO_Pin_6);        
        break;   
      case DOWN:   
        //GPIO_Write(GPIO_LED, GPIO_Pin_7);   
        break;   
      case LEFT:   
        //GPIO_Write(GPIO_LED, GPIO_Pin_8);   
        break;   
      case RIGHT:   
        //GPIO_Write(GPIO_LED, GPIO_Pin_9);   
        break;   
      case SEL:   
        GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_SET);  
        break;   
      case NOKEY:   
        break;   
      default:   
        break;   
    }   
  }   
}   
   
/**  
  * @brief  Configures the different system clocks.  
  * @param  None  
  * @retval : None  
  */   
void RCC_Configuration(void)   
{   
  /* Setup the microcontroller system. Initialize the Embedded Flash Interface,    
     initialize the PLL and update the SystemFrequency variable. */   
  SystemInit();   
       
  /* Enable GPIOC, GPIO_LED and AFIO clocks */   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    
  /* Enable USART3 clocks */   
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
}   
   
/**  
  * @brief  Configures the different GPIO ports.  
  * @param  None  
  * @retval : None  
  */   
void GPIO_Configuration(void)   
{   
  GPIO_InitTypeDef GPIO_InitStructure;   
   
  /* Configure USART1 Tx (PA.9)as alternate function push-pull */   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   
  GPIO_Init(GPIOA, &GPIO_InitStructure);   
     
  /* Configure USART1 Rx PA.10 as input floating */   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
  GPIO_Init(GPIOA, &GPIO_InitStructure);   
  
  /* Configure USART2 Tx (PA.2)as alternate function push-pull */  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;   
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   
  GPIO_Init(GPIOA, &GPIO_InitStructure);   
     
  /* Configure USART2 Rx PA.3 as input floating */   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
  GPIO_Init(GPIOA, &GPIO_InitStructure);  
    
}   
   
#ifdef  USE_FULL_ASSERT   
   
/**  
  * @brief  Reports the name of the source file and the source line number  
  *   where the assert_param error has occurred.  
  * @param file: pointer to the source file name  
  * @param line: assert_param error line source number  
  * @retval : None  
  */   
void assert_failed(uint8_t* file, uint32_t line)   
{    
  /* User can add his own implementation to report the file name and line number,  
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */   
   
  /* Infinite loop */   
  while (1)   
  {   
  }   
}   
#endif   
   
/**  
  * @}  
  */    
   
/**  
  * @}  
  */    
   
/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FI****


WENTONG
0
主题
3
回复
发表于Mon May 28 10:25:00 CST 2018   |  只看该作者 18#

 使用两种模式:

  普通的RS232:一个TFBS4711TX接RS232的TX,另外一个TFBS4711的RX监控

 一个TFBS4711TX接仿真器CHANNEL 0另外一个TFBS4711的RX仿真器CHANNEL 1

通过RS232直接发‘AA’实验图片如下

NUCLEO-F103RB MCU:

USART1 Tx (PA.9)USART1 Rx PA.10USART2 Tx (PA.2)USART2 Rx PA.3

下载上面程序,通过仿真器现象一样,说明红外模式设置没有成功。

点击查看大图

立创商城赵...
【官方工作人员】
130
主题
1324
回复
发表于Mon May 28 11:46:24 CST 2018   |  只看该作者 19#
WENTONG 发表于 Mon May 28 10:11:22 CST 2018  17# 如何设置红外模式。stm32f103 MUC还是不行。请指教。 #include ...

STM32F103 需要这样打开IrDA功能,才能使用这个IrDA收发模组,大致如下:

 

《立创快报》总编辑、立创电子公共实验室建设者,企业QQ:2355740879
WENTONG
0
主题
3
回复
发表于Mon May 28 12:09:45 CST 2018   |  只看该作者 20#

 

1.上图是我们的待测试板,TXD 接到NUCLEO-F103RB MCU板上USART2 Tx (PA.2),RXD接到 NUCLEO-F103RB MCU板上USART2 Rx PA.3------板子VCC为3.3V。

2.还有一个单独U2我们接到一块小板子上,IRED_A上拉12OHM电阻到3V3 ,SD直接拉GND,TXD 接到NUCLEO-F103RB MCU板上USART2 Tx (PA.9),RXD接到 NUCLEO-F103RB MCU板上USART2 Rx PA.10上。

新际星空
0
主题
2
回复
发表于Wed Jun 20 15:30:06 CST 2018   |  只看该作者 21#
赵工,您好。IrDA红外收发器/TFBS4711-TR1这个模组能不能使用在人体感应上面?比如当我人在50cm处,这个模组会收到红外被档的信号。。。谢谢!
立创商城赵...
【官方工作人员】
130
主题
1324
回复
发表于Wed Jun 20 16:24:02 CST 2018   |  只看该作者 22#
新际星空 发表于 Wed Jun 20 15:30:06 CST 2018  21# 赵工,您好。IrDA红外收发器/TFBS4711-TR1这个模组能不能使用在...

TFBS4711 这个用在人体感应上不合适,因为它收发是一体的,结构上太靠近。实际观察到,它发射的同时,也能收到数据,不管是否前面有反射物。

可以简单用红外发射二极管和光敏二极管或光敏三极管,通过拉开一定的距离和隔离,是可以做到你的需求。

  

《立创快报》总编辑、立创电子公共实验室建设者,企业QQ:2355740879
新际星空
0
主题
2
回复
发表于Wed Jun 20 18:56:11 CST 2018   |  只看该作者 23#
立创商城赵工 发表于 Wed Jun 20 16:24:02 CST 2018  22# TFBS4711 这个用在人体感应上不合适,因为它收发是一体的,结构...
谢谢。如何用简单用红外发射管与接收管的话,它的反应速度达不到要求。上升沿太慢了。而且距离只能到30CM.,,,
立创商城赵...
【官方工作人员】
130
主题
1324
回复
发表于Thu Jun 28 22:04:40 CST 2018   |  只看该作者 24#
新际星空 发表于 Wed Jun 20 18:56:11 CST 2018  23# 谢谢。如何用简单用红外发射管与接收管的话,它的反应速度达不到...

 

不考虑价格,可以参考这个光电模组:


《立创快报》总编辑、立创电子公共实验室建设者,企业QQ:2355740879
青龙
76
主题
726
回复
发表于Sun Jul 01 19:24:25 CST 2018   |  只看该作者 25#
方案很好,打算测试下,单片机计划用APT32F003带触摸按键,32位MCU,引脚兼容STM8S003,并且是大存储器2KB RAM,36KB Flash,功耗更低,成本低很多。
该回复已删除! 26#
  • 温馨提示:标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考:社区发帖规则
  • 您当前输入了 0个文字。还可以输入8000个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

顶部