IO的端口大部分都是复用的,见下图:
下面是一个典型的IO的结构:
- 读方向:则方向锁存器Q的数据被读到数据总线中。
- 写方向:写方向,则IO单元的输出被打开
- 写LAT和写端口是一样的:如果输出打开,则数据总线直接输出。
- 读LAT只读回刚刚写出的数据
- 读端口则是读引脚输入的值。
每一个IO都有四个寄存器:
- 方向:复位时都定义为输入!
- 端口:读端口是直接将端口数据读入,而写为写LAT,必须将端口设置为输出才能完成。部分指令为读+修改+写的操作,会引入一些意想不到的错误,要注意,尤其是在引脚带有电容负载的情况下。
- 锁存:如果借用这个功能,就好办了,写锁存和读锁存跟外部没有关系,不会读外面电容负载的影响。
- 开漏:3.3V系统如果要使用5V的电平,可以使用开漏,PIC24HJ128GP506开漏的电压VIH最高可达5.5V
外设复用:
如果外设使能了,则IO引脚输出被剥夺,而输入还是可以使用。
这里要注意,有些引脚是默认为与外设模块共享的,如果要使用IO,就算外设模块没有打开,就必须先将此位请出来.
上面的方框图还有一个细节,如果两个模块同时占用IO作为输出,则A明显会优先占有。
而输入都可以使用。
输入引脚的软件配置
一些引脚作为输入功能的时候,将不能使用它的输出功能,例如捕获功能。但是如果配置输入捕获为输出,有意思的事情来了,我们可以设置PORTX的值,来设置一个捕获信号,这个功能对于测试很有用,我们不需要给外部信号就可以设置输入了。
下面的模块就有这些功能:
还有一些则是由控制器完全控制的,为了避免通信出错:
CN的功能很好理解,方框图如下:
CN的寄存器也很简单:
CNENX:使能中断
CNXPUE:上拉,上拉主要是作为一个电流源,为按键提供一个弱上拉。
如何操作?
流程如下:
- 配置方向:作为一个数字输入
- 使能中断:设置CNEN设置某位的使能
- 使能上拉
- 清标志
- 中断优先级设置
- 通过CNIE设置CN模块的中断使能。
这里一定要注意,使用者必须读走PORTX的值,为下一次中断准备依据。
睡眠模式和闲置模式下的应用:
CN可以唤醒CPU,并通过优先级的比较来确定CPU是不是要理会。
文章评论(0条评论)
登录后参与讨论