精华内容
下载资源
问答
  • IO之Socket网络编程

    2019-05-13 13:32:00
    一、Socket  Socket不是Java中独有概念,而是一个语言无关标准。任何可以实现网络编程编程语言都有Socket。...socket本质是编程接口(API),对TCP/IP封装,TCP/IP也要提供供程序员做网...

    一、Socket

      Socket不是Java中独有的概念,而是一个语言无关标准。任何可以实现网络编程的编程语言都有Socket。

    1,Socket概念

      网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。

      建立网络通信连接至少要一个端口号。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。

      Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

    2,Socket连接步骤

      根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。【如果包含数据交互+断开连接,那么一共是五个步骤】

    (1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

    (2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

    (3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

    3,Socket在Java中应用

      在java.net 包是网络编程的基础类库。其中ServerSocket 和Socket 是网络编程的基础类型。ServerSocket 是服务端应用类型。Socket 是建立连接的类型。当连接建立成功后,服务器和客户端都会有一个Socket 对象示例,可以通过这个Socket 对象示例,完成会话的所有操作。

      对于一个完整的网络连接来说,Socket 是平等的,没有服务器客户端分级情况。

    二、IO阻塞与非阻塞

      阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作方法的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入方法会立即返回一个状态值。
    以银行取款为例:

      阻塞 : ATM排队取款,你只能等待(使用阻塞IO时,Java调用会一直阻塞到读写完成才返回);

      非阻塞 : 柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到号你就不能去,你可以不断问大堂经理排到了没有,大堂经理如果说还没到你就不能去(使用非阻塞IO时,如果不能读写Java调用会马上返回,当IO事件分发器通知可读写时再继续进行读写,不断循环直到读写完成)

    三、IO同步与异步

      同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO 操作并等待或者轮询的去查看IO 操作是否就绪,而异步是指用户进程触发IO 操作以后便开始做自己的事情,而当IO 操作已经完成的时候会得到IO 完成的通知。

    以银行取款为例:  

      同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO 时,Java 自己处理IO 读写);

      异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO 时,Java 将IO 读写委托给OS 处理,需要将数据缓冲区地址和大小传给OS(银行卡和密码),OS 需要支持异步IO操作API)。

    四、同步异步阻塞非阻塞区别

      在研究同步异步阻塞非阻塞时,总感觉阻塞/非阻塞和同步/异步有异曲同工的地方,其实,这两者存在本质的区别,面向的对象是不同的。

      阻塞/非阻塞:进程/线程需要操作的数据如果尚未就绪,是否妨碍了当前进程/线程的后续操作。

      同步/异步:数据如果尚未就绪,是否需要等待数据结果。

    转载于:https://www.cnblogs.com/guanghe/p/10856128.html

    展开全文
  • 除了少数罕见特例以外,几乎所有电子系统都至少拥有一个时钟功能,这...但对于当今复杂电子产品,一个单一时钟远远不够,多数产品都需要几个不同时钟用于各种外部连接接口(如以太网、PCI、RapidIO和USB端口
  • 除了少数罕见特例以外,几乎所有电子系统都至少拥有一个时钟功能,这...但对于当今复杂电子产品,一个单一时钟远远不够,多数产品都需要几个不同时钟用于各种外部连接接口(如以太网、PCI、RapidIO和USB端口
  • IO口连接外设一定要考虑复位以后安全电平,避免因为复位造成系统出现安全隐患,例如:接是继电器控制电机起停,这个设计时就要注意复位时不要出现误动作,合理编程,外设接口该上拉上拉,该下拉下拉。
  • 对于一个多功能可编程接口芯片,我们要想使用它,必须 先确定需求,要用什么芯片去干什么 设置芯片工作方式 然后再让芯片工作 至于设置方式,当然是软件编程。 同时重点注意,例如8255A,它一次只能写8位数据...

    核心

    对于一个多功能可编程接口芯片,我们要想使用它,必须

    1. 先确定需求,要用什么芯片去干什么
    2. 设置芯片的工作方式
    3. 然后再让芯片工作

    至于设置的方式,当然是软件编程。

    同时重点注意,例如8255A,它一次只能写8位数据,像多干活,就多写几次就好了,反正速度快。需要理解不是一次性完成就好。

    与CPU控制接口的方式结合理解

    • 无条件
    • 查询
    • 中断
    • DMA

    前提

    CPU能够对接口进行读写控制,通过IO译码能够选中端口地址,进行数据读写。

    控制字的编码含义

    我们将8位控制字编码拆开看!

    D7 D6 D5 D4 D3 D2 D1 D0
    1 x x x x x x x
    0 x x x x x x x

    首先看最高位D7

    • D7 = 1:方式选择控制
    • D7 = 0:C端口置0置1控制

    方式选择控制

    对于方式选择控制,我们拆开看

    D7 D6 D5 D4 D3 D2 D1 D0
    1
    • 最高位是1
    • D6~D3:A组控制
    • D2~D0:B组控制
    A组控制
    D6 D5 D4 D3
    • D6D5:A组的方式选择(很好记,与二进制的十进制值一样)
      • 00:方式0
      • 01:方式1
      • 10、11:方式2
    • D4:A端口输入输出控制
    • D3:C端口高4位输入输出控制

    B组控制

    D2 D1 D0
    • D2:B组方式选择
      • 0:方式0
      • 1:方式1
    • D1:B端口输入输出控制
    • D0:C端口低四位输输出控制

    一些通用法则

    1. A组和B组控制是相互独立的
    2. 端口的输入,就是1(input的i就像1);端口输出,就是0(output)
    3. 方式的选择,二进制的十进制值与方式对应
    4. A、B端口只能作为输入或输出,用于传送外设数据
    5. C端口不同方式下的含义不同
      1. 可以设置D7 = 0来设置C寄存器的每一位的值
      2. 方式0下是作为独立的输入输出的
      3. 其他方式下,作为A组或B组的补充信息位,用于表示A端口或B端口传送状态,空闲位仍可以独立使用
      4. A组与B组的工作方式可以不一样,因此C端口的高4位和低4位的作用也可以不一样,相互独立
    6. 如果没有用到,就写0,当然这只是习惯

    总之,二进制编码分开看待,相互独立,不同情况下含义不同,一样分开看,就什么都能看清楚了

    C端口置0置1控制

    D7 D6 D5 D4 D3 D2 D1 D0
    0 x x x
    • x可以直接都写0就好
    • D3D2D1:3位编码对应C端口的8个二进制位,用于选中某一位
    • D0:0的时候将选中的位置0,1的时候置1

    这个控制字的作用,就是控制C端口某一位的值的,如果有单独控制的需要,就设置就好了。

    • 可能是设置空闲位
    • 也可能设置状态位

    对待每种工作方式的思考点

    • 接口:如何设置,原理和功能
    • CPU :如何控制,控制方式,汇编指令
    • 外设:能干啥(数据肯定行,但是响应信号之类的呢?它能不能干,能不能用?)

    其实也就这些了,还是内3个器件,4个箭头的事儿。

    接下来,将会具体阐述每个工作方式下,二进制编码的含义。


    见下一篇。

    展开全文
  • 8.4.4 函数gethostbyname()不可重入的例子 229 8.5 协议名称处理函数 230 8.5.1 xxxprotoxxx()函数 231 8.5.2 使用协议族函数的例子 232 8.6 小结 235 第9章 数据的io和复用 236 9.1 io函数 236 9.1.1 使用...
  • Winsock提供的编程接口中socket默认是阻塞,比如send,recv,connect,可以通过ioctlsocket进行设置非阻塞,server端要管理多个连接可能不是一件容易事,windows下提供了不少模型供使用,比如标题三个,然后...

    Winsock提供的编程接口中socket默认是阻塞的,比如send,recv,connect,可以通过ioctlsocket进行设置非阻塞,server端要管理多个连接可能不是一件容易的事,windows下提供了不少模型可供使用,比如标题的三个,然后完成端口,libevent等库,此文仅写标题的三个,另外两个单独写。先看MSDN的介绍
    MSDN:
    The WSAEventSelect function specifies an event object to be associated with the specified set of FD_XXX network events.
    The return value is zero if the application's specification of the network events and the associated event object was successful.

    The WSAAsyncSelect function requests Windows message-based notification of network events for a socket.
    If the WSAAsyncSelect function succeeds, the return value is zero provided the application's declaration of interest in the network event set was successful. 

    The select function determines the status of one or more sockets, waiting if necessary, to perform synchronous I/O.
    The select function returns the total number of socket handles that are ready and contained in the fd_set structures, zero if the time limit expired, or SOCKET_ERROR if an error occurred

    我个人理解是select需要指定一个集合,把所有需要监听的socket添加到这个集合中,再轮询集合,select函数返回后删除没有自己所关心事件的socket,然后对有用的socket进行处理。所以缺点就是如果集合内的socket数过多,则效率会直线下降。WSAAsyncSelect是最简单的一个,但需要创建一个窗口,对于每个socket调用WSAAsyncSelect后即为这个socket绑定了一个消息,当有关心的事件发生就会给这个窗口发送消息,然后WPARAM为消息的句柄,LPARAM通过WSAGETSELECTEVENT与 WSAGETSELECTERROR两个宏定义可以获取到事件以及错误,然后就像处理一般消息一样处理socket的网络消息。WSAEventSelect与WSAAsyncSelect类似,但是它不需要创建窗口,它对事件的绑定是在一个内核对象上,然后使用一个辅助函数来得到内核对象上发生的网络事件,然后就跟WSAAsyncSelect处理一样了。WSAAsyncSelect与WSAEventSelect都会自动将socket设置为非阻塞,select不会自动设置。分别看他们的工作流程

    分别记录下每个模型中的注意点:
    select:
    1.当使用int nFds = select(0, &readSocketFd, &writeSocketFd, NULL, NULL); 当正确调用时nFds为当前有多少个socket上有网络事件,加入一个socket上有两个网络事件,返回值为1,不是2
    2.select调用后比如有可读事件,此时readSocketFd中只会保留那个有可读事件的socket,其他项都会被删除。
    3.select本身不会把socket设为非阻塞模式,所以还是有可能发生阻塞
    WSAAsyncSelect:
    1.每次未读完缓冲区的recv()调用,都会重新触发一个FD_READ消息,所以如果需要循环读取的话则需要先关闭对FD_READ的监听
    2.FD_WRITE的触发条件(这个应该在其他模型应该也是适用的)

    • 套接字刚建立连接时,表明准备就绪可以立即发送数据。
    • 一次失败的send()调用后缓冲区再次可用时。如果系统缓冲区已经被填满,那么此时调用send()发送数据,将返回SOCKET_ERROR,使用WSAGetLastError()会得到错误码WSAEWOULDBLOCK表明被阻塞。这种情况下当缓冲区重新整理出可用空间后,会向应用程序发送FD_WRITE消息

       所以说如果需要发送消息,直接调用send()发送即可。如果该次调用返回值为SOCKET_ERROR且WSAGetLastError()得到错误码WSAEWOULDBLOCK, 这意味着缓冲区已满暂时无法发送,此刻需要将待发数据保存起来,等到系统发出FD_WRITE消息后尝试重新发送。  

    WSAEventSelect
    1.通过 WSACreateEvent();创建的对象默认为要手动重置为非信号态

    下面是记录下一些socket编程时的一些经验:

    1. 对于非阻塞socket,当发生WSAEWOULDBLOCK之后此时的操作无效,比如发送数据,其实没有发送出去
    2. 对于send函数,有可能想要发送的长度为10k,但实际只发了7k,此时返回值为7k,那剩下的3k还需要自己重新发送,所以可以自己封装一个函数
      bool CClient::SendData(char *data, int len, bool isFile)
      {
      	int totalLen = len;
      	int sendLen = 0;
      	int haveSendLen = 0;
      	while (haveSendLen != len)
      	{
      		//send返回值大于0,则为发送的长度,=0则为关闭了sokcet, 小于0则为异常
      		sendLen = send(m_socket, data + haveSendLen, totalLen, 0);
      		if (sendLen>0)
      		{
      			haveSendLen += sendLen;
      			//此处用于客户端接收不全的情况,比如发送10k,但只接收了3k,则sendLen返回3k
      			totalLen -= sendLen;
      		}
      		else if (sendLen == 0)
      		{
      			//关闭了Socket
      			::closesocket(m_socket);
      		}
      		else
      		{
      			if (WSAGetLastError() == WSAEWOULDBLOCK)
      			{
      				sendLen = 0;
      			}
      			else
      			{
      				AddLog("SendData error");
      				return false;
      			}
      		}
      
      	}
      	return true;
      }
      

       

    3. 缓冲区默认大小为8k,最大可设置64k
    4. 对于文件的分包发送(假设服务端发送给客户端文件),可先发送一个数据包头,里面包含了文件大小等其他文件信息,然后等待客户端返回自己已经收到了这个数据包,然后正式开始发送文件时肯定需要把文件分成很多个小份来发送,可每次发送这个小份前先发送一个类似的数据包给客户端,表明此次的包的大小,客户端收到后确认一个应答包,服务端收到后开始正式发送第一个文件包,客户端不断接收,发现与数据包中给出的长度相同,则发送确认信息给服务端,然后服务端再发送下一个数据包头,表明此次文件大小,客户端再确认收到数据包,等待接收。。。。重复以上动作,直到全部发送完成。
    5. 如果在发送数据的过程中(send()没有完成,还有数据没发送)而调用了closesocket(),以前我们一般采取的措施是"从容关闭"shutdown(s,SD_BOTH),但是数据是肯定丢失了,如何设置让程序满足具体应用的要求(即让没发完的数据发送出去后在关闭socket)?
      struct linger {
          u_short    l_onoff;
          u_short    l_linger;
      };
      linger m_sLinger;
      m_sLinger.l_onoff=1;//(在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)
      // 如果m_sLinger.l_onoff=0;则功能和2.)作用相同;
      m_sLinger.l_linger=5;//(容许逗留的时间为5秒)
      setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger))
       

    上面的一些实例代码:https://download.csdn.net/download/hlw0522/10791026

    其中WSAAsyncSelect使用了MFC窗口程序,客户端用的select,实现的文件传输

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • GPIO和IO的区别:前者通过自由编程实现复用功能,而后者功能基本就是固定或唯一。 在介绍STM32F4系列MCUGPIO之前,先来区分一下“接口端口、引脚”三者概念。接口(interface):主机(CPU)与外部...

    注意:本文中所有陈述的内容全部适用于STM32F4系列MCU,其他系列的MCU可能因些许差异不太完全适用。
    GPIO和IO的区别:前者可通过自由编程实现复用功能,而后者的功能基本就是固定的或唯一的。
    在介绍STM32F4系列MCU的GPIO之前,先来区分一下“接口、端口、引脚”三者的概念。

    接口(interface):主机(CPU)与外部设备(指MCU片上外设)之间缓冲电路。它用于完成主机与外部设备设间速度匹配、信号转换,并完成某些控制功能。按数据的传输方式可分为并行接口和串行接口,并行接口指一般I/O接口或通用I/O接口,而串行接口有I2C/SPI/UART等等。

    端口(port):I/O接口电路中已经编址并能进行读写操作的寄存器。端口分为数据端口、状态端口及控制端口,普遍存在于各个接口电路中。每个接口电路中都包含一组寄存器,CPU与外部设备进行信息交换时,各类信息在接口中存入不同的寄存器,这些寄存器就是I/O端口,简称I/O口,也称为I/O端口寄存器。

    引脚(pin):集成电路与外围电路连接的管脚。

    接口(端口)概念是对并行接口和串行接口(I2C/SPI/UART等片上外设)而言的,MCU中大多数的功能模块都有接口电路。狭义上,端口概念往往特指I/O并行接口电路中的寄存器。此外,通常我们所说的“I/O口”指的就是“I/O端口”。

    一、GPIO的模式选择

    通过GPIO模式寄存器GPIOx_MODER(x是端口名称,x=A…I/J/K)来设置GPIO端口位的方向:
    1、输入模式(复位状态
    2、GPIO输出模式
    3、复用功能模式
    4、模拟功能模式
    GPIOx_MODER的设置方法,详见技术参考手册TRM。

    二、GPIO端口寄存器

    每个I/O端口均有下列寄存器,每个端口位均可自由编程,但I/O端口寄存器必须按32位字、半字或字节被访问。其中,GPIOx_BSRR寄存器旨在实现对GPIOx_ODR寄存器进行原子读取/修改访问,具有对GPIOx_ODR按位写权限。

    1、4个32位配置寄存器:GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR,这些寄存器位可通过软件写入。其中,输出类型寄存器GPIOx_OTYPER是用1个寄存器位设置1个I/O位,其他配置寄存器均是用2个寄存器位设置1个I/O位。

    GPIOx_MODER:选择I/O端口方向为 输入/通用输出/AF/模拟,复位状态为输入。

    GPIOx_OTYPER:选择输出类型为 推挽/开漏,复位状态为推挽输出。

    GPIOx_OSPEEDR:选择I/O输出驱动电路的响应速度为 低速/中速/快速/高速,用于噪声控制。(由下面Table 22. Port bit configuration table 可知,这个速度寄存器只对输出模式AF起作用)。
    注意:GPIO的引脚速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关。此外,如果较高频率的信号经过较低频率的驱动电路输出,那么输出的信号就会产生失真,所以驱动电路的频率和信号的频率之间满足采样定理的要求。驱动电路的频率应该适当不能过大(建议10~20倍于信号的频率),以便降低噪声、功耗和电磁辐射。

    GPIOx_PUPDR:选择I/O端口为 无上拉或下拉/上拉/下拉/保留(与IO端口方向无关)。

    2、2个32位数据寄存器:GPIOx_IDR、GPIOx_ODR

    GPIOx_IDR:这些寄存器位为只读 形式,并且只能模式下访问。

    GPIOx_ODR:这些寄存器位可通过软件读取和写入。

    3、1个32位置位复位寄存器:GPIOx_BSRR

    GPIOx_BSRR低半字用来置位GPIOx_ODR,即写入“1”,而高半字用来复位GPIOx_ODR,即写入“0”。GPIOx_BSRR旨在对GPIOx_ODR寄存器进行原子读写操作,它只能在字、半字、字节模式下被访问对GPIOx_ODR进行原子操作。

    4、1个32位锁定寄存器:GPIOx_LCKR

    锁定寄存器GPIOx_LCKR的每个锁定位用于锁定端口位的配置。冻结的寄存器包括:GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_AFRH、GPIOx_AFRL,它只能以字的方式被访问。锁定寄存器锁定配置后,就会避免因意外改写端口寄存器配置造成大电流损坏芯片的故障或其他故障。

    5、2个32位复用功能选择寄存器:GPIOx_AFRH、GPIOx_AFRL

    GPIOx_AFRL:用四位寄存器位选择一个对应的复用功能。该寄存器用于选择AF0~AF7。

    GPIOx_AFRH:用四位寄存器位选择一个对应的复用功能。该寄存器用于选择AF8~AF15。

    复用功能选择寄存器只能通过字被访问。

    三、GPIO的工作模式

    通过对4种端口配置寄存器进行编程,可将GPIO口的各个端口位配置成以下8种工作模式:

    输入+悬空
    输入+上拉
    输入+下拉
    模拟(用作ADC输入、DAC输出或者捕获输入情况下)
    输出+开漏+上拉/下拉(输出模式时GPIO的输出速度是可配置的)
    输出+推挽+上拉/下拉(输出模式时GPIO的输出速度是可配置的)
    复用功能+推挽+上拉/下拉(复用功能时速度是可配置的)
    复用功能+开漏+上拉/下拉(复用功能时速度是可配置的)

    四、GPIO 8种工作模式端口位的结构

    这里写图片描述这里写图片描述

    图1是GPIO端口位的电路结构:
    ● I/O输入通道有个TTL施密特触发器,它用于将变化缓慢的输入信号整形成边沿陡峭的矩形脉冲。同时,施密特触发器利用其回差电压提高了电路的抗干扰能力;
    ● 所有的I/O口均兼容TTL电平和CMOS电平;
    ● 大多数I/O是5V电压容限(FT 结构的I/O是5V容限,其他结构的I/O不是。详细情况请参见相应的STM32F4数据手册);
    ● 当GPIO被配置为模拟功能时,I/O不再是5V电压容限,这时以VDDA为电压容限;
    ● 除了端口A和B(主要是PA13/PA14/PA15/PB3/PB4这5个端口位复位后专门用于片上调试模块,不受4个GPIO控制寄存器控制),其他端口的所有端口位复位期间或者复位后都是悬空输入状态;
    ● 输出通道中,输出数据寄存器和复用功能输出接到多路复用器,再经过输出控制连接到推挽电路的门极。值得注意的是输出控制会将输出数据寄存器和复用功能输出的电平进行反转(即’1’变’0’,’0’变’1’)。仔细观察会发现P-MOS管的门极有个小圈“。”,它表示P-MOS的门极为低电平’0’时,P-MOS导通。反之,N-MOS是门极为高电平’1’时导通;
    ● 推挽输出的驱动能力强,并且推挽输出时,若P-MOS导通,引脚上的电压不会因为外部器件或设备(即引脚带负载)而有所降低;
    ● I/O端口位的最大状态切换频率为90MHZ。


    这里写图片描述

    由图2可以看出,当I/O端口被配置为输入时:
    ● 输出缓冲器被禁止;
    ● 施密特触发输入被激活;
    ● 根据寄存器GPIOx_PUPDR中的值选择引脚为弱上拉或弱下拉或悬空输入;
    ● I/O引脚上的数据在每个AHB1时钟周期被采样到输入数据寄存器;
    ● 对输入数据寄存器的读访问可获得I/O状态。


    这里写图片描述

    由图3可以看出,当I/O端口被配置为GPIO输出时:
    ● 输出缓冲器被激活
    ─ 开漏模式:输出寄存器上的 ‘0’ 激活N-MOS,而输出寄存器上的 ‘1’ 将端口置于高阻状态(PMOS从不被激活);
    ─ 推挽模式:输出寄存器上的 ‘0’ 激活N-MOS,而输出寄存器上的 ‘1’ 将激活P-MOS;
    ● 施密特触发器输入被激活;
    ● 选择引脚为弱上拉或弱下拉输出或悬空;
    ● I/O脚上的数据在每个AHB1时钟周期被采样到输入数据寄存器;
    ● 对输入数据寄存器的读访问可得到I/O状态;
    ● 对输出数据寄存器的读访问得到最后一次写的值。


    这里写图片描述

    由图4可以看出,当I/O端口被配置为复用功能AF(Alternate Function)时:
    ● 输出缓冲器可以被配置成开漏或推挽;
    ● 输出缓冲器被片上外设信号驱动;
    ● 施密特触发器输入被激活;
    ● 根据寄存器GPIOx_PUPDR中的值选择引脚为弱上拉或弱下拉或悬空输出;
    ● I/O脚上的数据在每个AHB1时钟周期被采样到输入数据寄存器;
    ● 对输出数据寄存器的读访问得到最后一次写的值。


    这里写图片描述

    由图5可以看出,档I/O端口被配置为模拟功能时:
    ● 输出缓冲器被禁止;
    ● 施密特触发器输入被暂停,0功耗,并且输出一直维持在0值状态;
    ● 管脚的弱上拉和下拉被禁止;
    ● 访问输入数据寄存器得到的数值为0;


    五、GPIO引脚作为一般IO输入时,引脚的状态和端口输入寄存器GPIOx_IDR的状态是否一致?

    在学习51核单片机时,由于51单片机I/O接口电路结构的原因,I/O输入时,I/O的引脚状态会出现与锁存器不一样的情况。所以,往往在I/O上拉输入前,提前向锁存器写入“1”,指令上也分为读引脚和读锁存器指令。

    那么,基于Cortex-M内核的MCU的I/O引脚输入时是否也有与51单片机同样的问题呢??

    答案是否定的!因为Cortex-M内核的MCU的GPIO引脚在被配置为I/O输入时,其输出电路是断开的。这样,输出电路就不会影响到引脚的状态。所以,引脚上的状态和输入寄存器GPIOx_IDR中的数据始终一致。

    展开全文
  • 11、用Keil C编程,用户编程有困难的可把工艺流程发给我司,我司代为开发程序。三、应用场合1、用于各数字量输入输出控制系统,控制气缸、电磁阀、继电器等;外接各种光电传感器、红外开关。2、控制温度...
  • 1.7 Linux软件开发的可借鉴之处........................:.................. 12 1-8 .................................................................13 第2 章Linux编程环境...................................
  • 3.2 多接口................................................ 129 3.2.1 对象接口................................129 3.2.2 辅助接 U ................................130 3.3 抽象性.............................
  • 需并行编程器仅需用P15,P16 和P17,这三个IO 仅仅是下载程序时 候使用,并影响程序使用。 ③结合上位机软件免费就实现PC 对其编程硬件电路连接简单如图3.3 所 示。 104 C3 1K R1 S1 VCC D1 1N4007 ...
  •  final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构一部分,表示总是执行。 finalize是Object类一个方法,在垃圾收集器执行时候会调用被回收对象...
  • 5.3.2 通信接口的测试 81 5.3.3 内核中的缓冲区链表结构 83 5.3.4 输入:内核中的请求处理中的安全检查 84 5.3.5 输出处理与卸载清理 85 第6章 64位和32位内核开发差异 88 6.1 64位系统新增机制 88 6.1.1 WOW...
  • 5.3.2 通信接口的测试 81 5.3.3 内核中的缓冲区链表结构 83 5.3.4 输入:内核中的请求处理中的安全检查 84 5.3.5 输出处理与卸载清理 85 第6章 64位和32位内核开发差异 88 6.1 64位系统新增机制 88 6.1.1 WOW...
  • 基于JAVA聊天系统设计与实现

    热门讨论 2012-12-01 01:19:55
    在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类java.net.Socket,使得编写网络应用程序相对容易。服务器采用多线程以满足多用户的请求,并通过创建一个ServerSocket对象来监听来自客户的连接...
  • 实例005——使用C++实现格式化数据的IO 实例006——实现数字金额的中文大写转换 实例007——将十进制数转换为二进制输出 实例008——产生随机数 实例009——实现排序操作 实例010——使用Windows API创建程序...
  • CUB:CUB为CUDA编程模式每一层提供了最新的可重用软件组件。 cuda-api-wrappers:轻量级现代C++封装器,用于CUDA GPU运行时API编程。 cupla:通过Alpaka在OpenMPA、线程、TBB……运行CUDA/C++C++ API。 ...
  • 服务网关,对外暴露统一规范的接口和包装响应结果,包括各个子系统交互接口、对外开放接口、开发加密接口接口文档等服务,在该模块支持验签、鉴权、路由、限流、监控、容错、日志等功能。示例图: zheng-cms...
  • 注:名称中不可出现中文和空格。 2.5在弹出Define Module中I/O Port Definition,输入设计模块所需的端口,并设置端口防线,如果端口为总线型,勾选Bus选项,并通过MSB和LSB确定总线宽度。完成后...
  • RTC4MRrar,一、简介JMDM-RTC4MR是深圳市精敏数字机器有限公司自主研发一款具有实时时钟定时,电池电压自动检测和自动充电,可实现4路继电器联机或脱机控制,高可靠稳定性工业可编程逻辑控制器。二、功能特性1、...
  • java 面试题 总结

    2009-09-16 08:45:34
     final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构一部分,表示总是执行。 finalize是Object类一个方法,在垃圾收集器执行时候会调用被回收对象...
  • python cookbook(第3版)

    2016-01-06 22:24:38
    11.12 理解事件驱动的IO 11.13 发送与接收大型数组 第十二章:并发编程 12.1 启动与停止线程 12.2 判断线程是否已经启动 12.3 线程间通信 12.4 给关键部分加锁 12.5 防止死锁的加锁机制 12.6 保存线程的...
  • 疯狂JAVA讲义

    2014-10-17 13:35:01
    6.4.5 缓存实例的不可变类 186 6.5 抽象类 188 6.5.1 抽象方法和抽象类 188 6.5.2 抽象类的作用 191 6.6 更彻底的抽象:接口 192 6.6.1 接口的概念 192 6.6.2 接口的定义 193 6.6.3 接口的继承 195 6.6.4 ...
  • 例如演示站点前端部署于 GitHub Pages 服务,从而使用个性域名(*.github.io),还能减少一定流量开销。 Fork 本项目,进入 gh-pages 分支(该分支内容和 www 目录相同),编辑 conf.js 文件: 节点列表...
  • PCI.EXPRESS系统体系结构标准教材.pdf

    热门讨论 2013-02-17 16:21:16
    3.1.4 系统路由策略是可编程的 3.2 两种类型本地链路流量 3.2.1 有序集 3.2.2 数据链路层数据包(dllp) 3.3 处理层数据包路由基础 3.3.1 用于访问4种地址空间tlp 3.3.2 使用分离事务协议了吗 3.3.3 tlp路由3种...
  •  8.2.1 中断请求(IRQ)与可编程中断控制器(PIC)  8.2.2 高级可编程控制器(APIC)  8.2.3 中断请求级(IRQL)  8.2.4 线程调度与线程优先级  8.2.5 IRQL变化  8.2.6 IRQL与内存分页  8.2.7 控制...
  • Invoke:用于管理面向 shell 子进程,同时支持将执行 Python 代码组织成命令行调用状态。 tmuxp: tmux 会话管理器。 高级 CLI httpie:一个命令行 HTTP 客户端,cURL 替代品,易用性更好。 i...
  • Android 上百实例源码分析以及开源分析 集合打包4

    千次下载 热门讨论 2012-07-10 21:54:03
    Api 包含共享的编程接口。处理所有ip(可用)“沟通”这个类别。 这是很重要类。 BootBroadcast 广播接收机,设置在系统启动时iptables规则。这是必要,因为这些规则是持久。 HelpDialog对话框中显示...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    另外初学者要具备单片机I/O接口的应用知识,这在于周边应用电路及各种元器件的使用,须配合自己所学的电子学及电路学等。 14. 符合44PIN的80系列8位单片机的MCU有哪些? 答:符合44PIN的80系列8位单片机有Z...

空空如也

空空如也

1 2 3
收藏数 53
精华内容 21
关键字:

不可编程接口的io端口