s3c2440的UART用法(14页).doc

上传人:1595****071 文档编号:36363363 上传时间:2022-08-26 格式:DOC 页数:14 大小:180.50KB
返回 下载 相关 举报
s3c2440的UART用法(14页).doc_第1页
第1页 / 共14页
s3c2440的UART用法(14页).doc_第2页
第2页 / 共14页
点击查看更多>>
资源描述

《s3c2440的UART用法(14页).doc》由会员分享,可在线阅读,更多相关《s3c2440的UART用法(14页).doc(14页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、-s3c2440的UART用法-第 14 页 s3c2440的UART用法 SPI、IIC和UART是最常用的三种串行总线,这三种总线在s3c2440中都被集成了。在这里我们主要介绍UART,另两个总线在后面的文章中给出。 UART(Universal Asynchronous Receiver/Transmitter,通用异步接收/发送装置)用于异步通信,可以实现全双工发送和接收。它不仅可以实现不同嵌入式系统之间的通信,还可以实现与PC之间的通信。 s3c2440提供了三个UART端口,它们都可以通过查询、中断和DMA方式传输数据,而且每个UART都分别有一个64个字节的接收FIFO和一个6

2、4个字节的发送FIFO。在这里,我们只给出非FIFO模式,即传输数据不利用FIFO缓存,一个字节一个字节地传输。 下面我们就给出如何用s3c2440来实现非FIFO的UART通信。要实现某种通信,就必须遵循该通信协议。UART的协议包括传输数据的位数,停止位的位数,以及是否进行奇偶校验,这些设置是利用ULCONn寄存器完成的。另一个很重要的地方就是设置波特率。s3c2440波特率的时钟源有三个:PCLK、FCLK/n和UEXTCLK。时钟源的选择是由UCONn的第10位和第11位来完成的。波特率的具体计算公式为:时钟源频率(波特率16)1这个计算结果很可能是小数,把该小数取最接近的整数,放入寄

3、存器UBRDIVn中就完成了波特率的设置。如我们选择波特率的时钟源为PCLK,它为50MHz,我们设置的波特率为115.2kHz,通过上式计算的结果为26.13,取整后得到26,那么我们把26放入UBRDIVn中即可。由于我们没有使用FIFO和MODEM,所以可以不用设置FIFO控制寄存器UFCONn和MODEM控制寄存器UMCONn。通过以上寄存器的设置,UART就可以正常传输数据。接收到的数据是放到接收缓存器URXHn中,要发送数据时,是把数据放入发送缓存器UTXHn中。由于UART是通过字节方式传输数据的,因此要区分是大端模式还是小端模式,也就是说这两个寄存器在这两种模式下,所在的地址是

4、不同。为了了解当前数据传输的各种状态,还需要一些状态寄存器。传输状态寄存器UTRSTATn非常有用,它的第0位可以用来判断接受缓存器内是否有可接收的数据,第1位和第2位可以用来判断发送缓存器中是否为空,为空时可以发送数据。由于在这里我们不进行传输数据时错误的判断,因此错误状态寄存器UERSTATn不需要,FIFO状态寄存器UFSTATn和MODEM状态寄存器UMSTATn在这里也不需要。 我们给出UART通信的两种方法:查询和中断。为了验证程序,使用任一款的串行通信软件来实现PC和s3c2440之间的通信即可。 首先给出的是查询程序。它是在主程序的循环体内不断查询UART端口,当有数据来时,就

5、接收数据,并再通过UART发送该数据。然后根据所接收数据的不同,分别执行不同的内容,如点亮、熄灭LED,蜂鸣器响、或不响。在这里,我们每次只完成一个字节的传输。#define rGPBCON (*(volatile unsigned *)0x56000010) /Port B control#define rGPBDAT (*(volatile unsigned *)0x56000014) /Port B data#define rGPBUP (*(volatile unsigned *)0x56000018) /Pull-up control B#define rGPHCON (*(vola

6、tile unsigned *)0x56000070) /Port H control#define rGPHUP (*(volatile unsigned *)0x56000078) /Pull-up control H#define rULCON0 (*(volatile unsigned *)0x50000000) /UART 0 Line control#define rUCON0 (*(volatile unsigned *)0x50000004) /UART 0 Control#define rUFCON0 (*(volatile unsigned *)0x50000008) /U

7、ART 0 FIFO control#define rUMCON0 (*(volatile unsigned *)0x5000000c) /UART 0 Modem control#define rUTRSTAT0 (*(volatile unsigned *)0x50000010) /UART 0 Tx/Rx status#define rUERSTAT0 (*(volatile unsigned *)0x50000014) /UART 0 Rx error status#define rUFSTAT0 (*(volatile unsigned *)0x50000018) /UART 0 F

8、IFO status#define rUMSTAT0 (*(volatile unsigned *)0x5000001c) /UART 0 Modem status#define rUBRDIV0 (*(volatile unsigned *)0x50000028) /UART 0 Baud rate divisor/little endian#define rUTXH0 (*(volatile unsigned char *)0x50000020) /UART 0 Transmission Hold#define rURXH0 (*(volatile unsigned char *)0x50

9、000024) /UART 0 Receive buffervoid Main(void)char ch;rGPBCON = 0x015551;rGPBUP = 0x7ff;rGPBDAT = 0x1e0;rGPHCON = 0x00faaa; /使用UART0功能rGPHUP = 0x7ff;rULCON0 = 0x3; /设置UART0无奇偶校验,一位停止位,8位数据rUCON0 = 0x245; /PCLK为时钟源,接收和发送数据为查询或中断方式rUFCON0 = 0; /rUMCON0 = 0; /rUBRDIV0 = 26; /设置波特率,PCLK为50MHz,波特率为115.2kH

10、zwhile(!(rUTRSTAT0 & 0x2); /等待并判断发送缓存是否为空rUTXH0 = 0xaa; /是空,则发送0xAA字节while(1) while(!(rUTRSTAT0 & 0x1); /等待并判断接收缓存是否准备好ch = rURXH0; /接收一个字节数据 while(!(rUTRSTAT0 & 0x2); /等待并判断发送缓存是否为空 rUTXH0 = ch; /发送一个字节数据switch(ch) /根据所接收数据的不同,执行不同的程序 case 0x11: /灭LED rGPBDAT |= 0x1e0; break; case 0x22: /亮LED rGPBD

11、AT &= 0x1f; break; case 0x33: /蜂鸣器不响 rGPBDAT &= 0x1e0; break; case 0x44: /蜂鸣器响 rGPBDAT |= 0x1; break; default: /LED灭,蜂鸣器不响 rGPBDAT = 0x1e0; break; 下面是UART中断程序,它要比查询复杂一些,因为涉及到了中断处理,并且UART发送数据和接收数据是一个中断源。主程序循环体内不执行任何程序,都在UART中断程序内执行。当接收到0x55字节数据时,亮两个LED,当接收到其他数据时,发送该字节,并在发送部分执行亮4个LED程序。#define _ISR_ST

12、ARTADDRESS 0x33ffff00#define pISR_UART0 (*(unsigned *)(_ISR_STARTADDRESS+0x90)#define U32 unsigned int#define rGPBCON (*(volatile unsigned *)0x56000010) /Port B control#define rGPBDAT (*(volatile unsigned *)0x56000014) /Port B data#define rGPBUP (*(volatile unsigned *)0x56000018) /Pull-up control B#

13、define rGPHCON (*(volatile unsigned *)0x56000070) /Port H control/#define rGPHDAT (*(volatile unsigned *)0x56000074) /Port H data#define rGPHUP (*(volatile unsigned *)0x56000078) /Pull-up control H#define rULCON0 (*(volatile unsigned *)0x50000000) /UART 0 Line control#define rUCON0 (*(volatile unsig

14、ned *)0x50000004) /UART 0 Control#define rUFCON0 (*(volatile unsigned *)0x50000008) /UART 0 FIFO control#define rUMCON0 (*(volatile unsigned *)0x5000000c) /UART 0 Modem control#define rUTRSTAT0 (*(volatile unsigned *)0x50000010) /UART 0 Tx/Rx status#define rUERSTAT0 (*(volatile unsigned *)0x50000014

15、) /UART 0 Rx error status#define rUFSTAT0 (*(volatile unsigned *)0x50000018) /UART 0 FIFO status#define rUMSTAT0 (*(volatile unsigned *)0x5000001c) /UART 0 Modem status#define rUBRDIV0 (*(volatile unsigned *)0x50000028) /UART 0 Baud rate divisor/little endian#define rUTXH0 (*(volatile unsigned char

16、*)0x50000020) /UART 0 Transmission Hold#define rURXH0 (*(volatile unsigned char *)0x50000024) /UART 0 Receive buffer#define rSRCPND (*(volatile unsigned *)0x4a000000) /Interrupt request status#define rINTMSK (*(volatile unsigned *)0x4a000008) /Interrupt mask control#define rINTPND (*(volatile unsign

17、ed *)0x4a000010) /Interrupt request status#define rSUBSRCPND (*(volatile unsigned *)0x4a000018) /Sub source pending#define rINTSUBMSK (*(volatile unsigned *)0x4a00001c) /Interrupt sub maskvoid _irq uartISP(void) char ch; rSUBSRCPND |= 0x3; rSRCPND = 0x128; rINTPND = 0x128; if(rUTRSTAT0 & 1) /接收数据处理部

18、分 ch = rURXH0; /接收字节数据 if(ch=0x55) rGPBDAT = 0x61; /亮两个LED else rUTXH0 = ch; /发送字节数据 else /发送数据处理部分 rGPBDAT = 0x1e1; /亮4个LEDvoid Main(void) rGPBCON = 0x015551;rGPBUP = 0x7ff; rGPBDAT = 0x1e0;rGPHCON = 0x00faaa; rGPHUP = 0x7ff;rULCON0 = 0x3; rUCON0 = 0x5;rUFCON0 = 0;rUMCON0 = 0;rUBRDIV0 = 26;rSRCPND

19、= 0x128; rSUBSRCPND = 0x3;rINTPND = 0x128; rINTSUBMSK = (0x3); /打开UART0发送和接收中断屏蔽 rINTMSK = (0x128); /打开UART0中断屏蔽 pISR_UART0 = (U32)uartISP;while(1)最后还要强调几点关于非FIFO模式下UART中断的一些注意事项:1. 对于s3c2440来说,接收数据是被动的,发送数据是主动的,因此一般来说,接收数据用中断方式,发送数据用查询方式较好;2. 在中断方式下,当接收到数据时,尽管可能该数据无用,但也一定要读取它,否则下次再接收数据时,不会再引起中断,因为接

20、收数据缓存器被上次接收到的数据所霸占,只要没有读取它,它就永远在那里;3. 由于UART中断涉及到SUBSRCPND寄存器,因此在中断处理程序中不仅要清SRCPND寄存器,还要清SUBSRCPND寄存器,它们的顺序一定是先清SUBSRCPND寄存器,再清SRCPND寄存器,否则就会引起一个中断两次响应的问题。因为是否中断由SRCPND寄存器决定,而SRCPND寄存器的相关状态位由SUBSRCPND寄存器决定,如果先清SRCPND寄存器,而还没有清SUBSRCPND寄存器的话,SRCPND寄存器的相关位还是会被置1,而一旦被置1,则一定还会引起中断。本文来自CSDN博客,转载请标明出处:基于AR

21、M9 2410的嵌入式串口编程20070417OHY 下面的程式是在2410研发平台上调试通过的,一个串口的发送实验程式serial.c。#include #include #include #include #include #include #include #include #include int main()char szsendbuf4;int fd,c,res,nsize = 4;FILE *pfile;int filel;struct termios oldtio,newtio;struct stat st;fd = open(/dev/ttyS0,O_RDWR | O_NOC

22、TTY);tcgetattr(fd, &oldtio);bzero(&newtio, sizeof(newtio);newtio.c_cflag = B115200 | CRTSCTS | CS8 | CLOCAL | CREAD;newtio.c_iflag = IGNPAR | ICRNL;tcflush(fd, TCIFLUSH);tcsetattr(fd, TCSANOW, &newtio);stat(a.txt, &st);pfile = fopen(a.txt, r);filel = st.st_size;while(4 = nsize)bzero(szsendbuf, 4);ns

23、ize = fread(szsendbuf, 1, 4, pfile);nsize = write(fd, szsendbuf, nsize);fclose(pfile);tcsetattr(fd, TCSANOW, &oldtio);close(fd); 代码写完以后,需要用ARM的GCC编译器来编译代码,而不能以GCC来编译代码。因为2410是ARM体系结构,和普通PC机的体系结构不相同的。 能将armv4l-unknown-linux-gcc这个文件拷贝到刚才编写C的源程式同一目录下,这样就不必使用一串长长的绝对路径了。如果需要将刚才的serial.c编译成一个名字为serial的可执行

24、文件,可使用下面的命令:./ armv4l-unknown-linux-gcc -o serial serial.c 在运行上述生成的文件时,先通过minicom将宿主机挂载到目标板上。例如宿主机的IP地址为:192.168.2.100,目标板的IP地址为:192.168.2.101。能通过下面的命令将其挂载:mount 192.168.2.100:/ /tmp 这样,宿主机的这个根目录就挂载到目标板上了。由于要进行串口的调试实验,minocom需要用来和目标板进行窗口通信。所有对目标板的操作控制,最佳通过telnet来进行,能通过下面命令实现:telnet 192.168.2.101 连接到

25、目标板上成功的时候,需要输入登陆的用户名和密码,一般是输入root按回车就能,也有例外的。 然后在目标板的/tmp目录中就能看到整个宿主机根目录的内容,再找到serial所在的目录,输入下面命令:./serial就可在宿主机的minicom中看到一个文件属性的输出了。s3c2440串口文档s3c2440的UART提供了三个同步串行IO口,第一个串口都可以使用中断模式和DMA模式,换句话说就是UART可以产生一个中断或者是DMA请求使数据在CPU和UART之间进行传递。UART在系统时钟下可以支持最高位传送为115.2K BPS.如果一个外部设备能过UEXTCLK为UART提供时钟,UART可以

26、达到更高的速度。每个UART通道包括两个64字节的FIFO作为接收数据和发送数据使用。 s3c2440的UART包括可编程的波特率,红外收发,一个或者两个停止位。5位,6们,7位,8位的数据位和校验检测。每一个UART包括一个波特率产生器,发送器,接收器和一个控制单元。如图111所示。波特率产生器可以使用PCLK,FCLK/n或者UEXTCLK之一控制。发送器和接收器包含64字节的FIFO和一个数据移位器。数据先写到FIFO中然后再拷贝到发送移位器中,然后再移位发送通过数据针TxDn。在些期间远端发送过来的数据通过针RxDn进入到移位器中再拷贝到接收器的FIFO中去。属性RxD0,TxD0,R

27、xD1,TxD1,Rxd2,和TxD2都可使用基于DMA的和中断的操作。UART通道0,1,和2都拥有IrDA和64字节的FIFOUART通道0和1:nRTS0,nCTS0,nRTS1,nCTS1收发数据时支持握手UART的操作UART的操作,包括数据传输,数据接收,产生中断,波特率的产生回环模式,红外模式和自动流控制。数据传输发送的数据帧是可以改变的,它由起始位58个数据位一个可选的校验位和12个停止位构成。这些都可以通过策略控制器ULCONn设置。数据发送器也可以产生一个停止标志,它可以强迫串口输出逻辑0达一帧的时间,它在一个字传输完成以后阻塞了停止信号的传送。然后继续传输数据到Tx FI

28、FO中。数据接收与数据的发送相似,接收到的数据帧也是可以修改的。它包括一个起始位,五到八个数据位,一个可选的校验位和一到两个停止位。接收器可检测到覆盖错误,校验错误,帧错误和终止的情况。每一种情况都会设置一个错误标志位。覆盖错误产生的情况是这样的,新数据覆盖掉了还没有来的及取出的旧数据,也就是说接收数据速度快于取出的速度导致一部分数据还没有取出就被新的数据盖掉了。校验错误是指接收到的数据经过计算与校验位不符。帧错误是指收到的数据不含有停止位。终止的情况是指RxDn端保持在逻辑零的状态时间长于一帧数据传送的时间。接收超时的情况是指在可以接收3个字的时间里没有收到任何的数据,并且在FIFO模式时R

29、x的FIFO非空。自动流量控制(AFC)S3C2440的UART 0和UART 1通过信号nRTS和nCTS支持自动流量控制。在这种情况下,它可以连接到外部的UARTs中去。如果用户想把串口连接到Modem上,需要关闭寄存器UMCONn的自动流控制位,并通过软件控制nRTS信号线。在AFC模式下,nRTS依赖于接收器,nCTS信号控制着发送器的操作。UART的数据发送器只在nCTS信号使能的时候才把数据传送到FIFO中(在AFC模式下nCTS的意思是其它UART的FIFO已经准备好接收数据了)。在UART开始接收数据之前,需要先根据数据接收器的FIFO剩余空间设置nRTS的值,如果剩余空间大于

30、32字节则nRTS使能,否则如果剩余空间小于32字节则nRTS关闭(在AFC模式下,nRTS的作用就是表示它所控制的接收器的FIFO准备好接收数据了)。 UART 2不支持AFC功能,因为S3C2440没有nRTS2和nCTS2非自动流量控制的例子(通过软件控制信号nRTS和nCTS)接收器对FIFO的操作1.选择接收模式(中断模式或者DMA模式)2.检查寄存器UFSTATn中Rx FIFO的值,如果这个值小于32,用户必须设置UMCONn0为“1”(使能nRTS),如果值大于32,用户必须设置UMCONn0的值为“0”(关闭nRTS)3.重复第2步。发送器对FIFO的操作1.选择一个发送模式

31、(中断或者DMA)2.检查UMSTATn0的值,如果为“1”(使能nCTS),用户写数据到Tx FIFO寄存器S3C2440的每个UART都有七个状态:覆盖错误,校验错误,帧错误,终止,接收缓冲区已准备好,发送缓冲区空,和发送移位器空。所有这些都对应到UART的状态寄存器中(UTRSTATn/UERSTATn).覆盖错误,校验错误,帧错误和终止属于接收错误,它们中的任何一个都可以引起一个叫“receive error status”的中断请求。如果这个中断请求在寄存器UCONn中的使能位被置为“1”,并且当这个请求被处理时通过读取UERSTSATn的值可知引起这个中断的信号,也就是找到是哪种错

32、误引起的中断。FIFO模式与非FIFO模式在FIFO模式下,接收器从接收移位器中收数据然后写入到FIFO中,如果收到数据的个数达到Rx FIFO的触发点,且在寄存器UCONn中的接收模式被设置成“1”(中断或者轮巡模式),将会产生一个Rx中断。在非FIFO模式下,不论是中断模式还是轮巡模式,只要有数据从接收移位寄存器中传送到数据接收保持寄存器中都会产生一个Rx中断。在FIFO模式下,如果发送模式在控制寄存器UCONn中被设置成中断模式或者轮巡模式,发送数据要从发送FIFO中传送到发送移位器中,如果在FIFO中剩余的数据个数达到了Tx FIFO的触发点,就是产生一个Tx中断。在非FIFO模式下,

33、发送的数据从发送保持寄存器传送到发送移位器中后会产生一个Tx中断,这个也是要求数据发送方送方式为中断模式或者是轮巡模式。如果在控制寄存器中数据发送方式和接收方式被设置成DMA模式,那么和上面的情况一样,只是产生的Rx和Tx中断被换成了DMA请求。UART的错误FIFOUART有一个“错误状态”FIFO组,它对应着接收器的FIFO,它指示在接收器的FIFO中哪个数据错误了。只有在接收器中错误数据被读取的时候才会产生错误中断。在从URXHn读取数据的时候同时读取UERSTATn寄存器的值就知道这个数据哪里错了,什么错误。例子假设UART顺序接收了A B C D E这五个数据,其中接收B的时候发生了

34、帧错误,接收D的时候发生了校验错误。在接收B的时候不会产生“错误中断”,在接收“D”的时候也不会产生“错误中断”。当读取B数据和D数据的时候“错误中断”才会产生。波特率的产生ART的波特率发生器为串行数据的发送与接收提供时钟,波特率发生器的“源时钟”可以是S3C2440的内部系统时钟也可以是外部时钟(UEXTCLK),换句话说就是通过设置UCONn的“时钟”选项可以改变除数因子。波特率是由“源时钟”(PCLK,FCLK/n UEXTCLK)除以16和一个除数因子。公式是这样的:除数因子(整型)(“源时钟”除以波特率乘以16)减1除数因子UBRDIVn的取值范围是1216-1,但当使用外部时钟U

35、EXTCLK时它却可以等于0.(这个外部时钟要低于PCLK)例如:如果波特率是115200bps,UART的时钟是40MHz,除数因子UBRDIVn是UBRDIVn = (int)(40000000 / (115200 x 16) ) -1= (int)(21.7) -1 round to the nearest whole number= 22 -1 = 21波特率的错误容忍度UART的帧错误必须低于1.87%ADS下的串口配置def.h 中的UART寄存器定义:#define rULCON0 (*(volatile unsigned *)0x50000000) /UART 0 Line c

36、ontrol#define rUCON0 (*(volatile unsigned *)0x50000004) /UART 0 Control#define rUFCON0 (*(volatile unsigned *)0x50000008) /UART 0 FIFO control#define rUMCON0 (*(volatile unsigned *)0x5000000c) /UART 0 Modem control#define rUTRSTAT0 (*(volatile unsigned *)0x50000010) /UART 0 Tx/Rx status#define rUERS

37、TAT0 (*(volatile unsigned *)0x50000014) /UART 0 Rx error status#define rUFSTAT0 (*(volatile unsigned *)0x50000018) /UART 0 FIFO status#define rUMSTAT0 (*(volatile unsigned *)0x5000001c) /UART 0 Modem status#define rUBRDIV0 (*(volatile unsigned *)0x50000028) /UART 0 Baud rate divisor#define rULCON1 (

38、*(volatile unsigned *)0x50004000) /UART 1 Line control#define rUCON1 (*(volatile unsigned *)0x50004004) /UART 1 Control#define rUFCON1 (*(volatile unsigned *)0x50004008) /UART 1 FIFO control#define rUMCON1 (*(volatile unsigned *)0x5000400c) /UART 1 Modem control#define rUTRSTAT1 (*(volatile unsigned

39、 *)0x50004010) /UART 1 Tx/Rx status#define rUERSTAT1 (*(volatile unsigned *)0x50004014) /UART 1 Rx error status#define rUFSTAT1 (*(volatile unsigned *)0x50004018) /UART 1 FIFO status#define rUMSTAT1 (*(volatile unsigned *)0x5000401c) /UART 1 Modem status#define rUBRDIV1 (*(volatile unsigned *)0x5000

40、4028) /UART 1 Baud rate divisor#define rULCON2 (*(volatile unsigned *)0x50008000) /UART 2 Line control#define rUCON2 (*(volatile unsigned *)0x50008004) /UART 2 Control#define rUFCON2 (*(volatile unsigned *)0x50008008) /UART 2 FIFO control#define rUMCON2 (*(volatile unsigned *)0x5000800c) /UART 2 Mod

41、em control#define rUTRSTAT2 (*(volatile unsigned *)0x50008010) /UART 2 Tx/Rx status#define rUERSTAT2 (*(volatile unsigned *)0x50008014) /UART 2 Rx error status#define rUFSTAT2 (*(volatile unsigned *)0x50008018) /UART 2 FIFO status#define rUMSTAT2 (*(volatile unsigned *)0x5000801c) /UART 2 Modem stat

42、us#define rUBRDIV2 (*(volatile unsigned *)0x50008028) /UART 2 Baud rate divisor#ifdef _BIG_ENDIAN#define rUTXH0 (*(volatile unsigned char *)0x50000023) /UART 0 Transmission Hold#define rURXH0 (*(volatile unsigned char *)0x50000027) /UART 0 Receive buffer#define rUTXH1 (*(volatile unsigned char *)0x50004023) /UART 1 Transmission Hold#define rURXH1 (*(volatile unsigned char *)0x50004027) /UART 1 Receive buffer#define rUTXH2 (*(volatile unsigned char *)0x50008023) /UART 2 Transmission Hold#define rURXH2 (*(volatile unsigned char *)0x50008027) /UAR

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com