这段时间一直在学一款c8051f020的单片机。较之51功能强大了很多。C8051F020 MCU是高集成度的混合信号片上系统,有按8位端口组织的64个数字I/O引脚。低端口(P0、P1、P2和P3)既可以按位寻址也可以按字节寻址。高端口(P4、P5、P6和P7)只能按字节寻址。所有引脚都耐5V电压,都可以被配置为漏极开路或推挽输出方式和弱上拉。
C8051F020
器件有大量的数字资源需要通过
4
个低端
I/O
端口
P0
、
P1
、
P2
和
P3
才能使用。
P0
、
P1
、
P2
和
P3
中的每个引脚既可定义为通用的端口
I/O
(
GPIO
)引脚,又可以分配给一个数字外设或功能
(例如:
UART0
或
/INT1
)。系统设计者控制数字功能引脚分配,只受可用引脚数的限制。这种资源分配的灵活性是通过使用优先权交叉开关译码器实现的
。注意,不管引脚被分配给一个数字外设或是作为通用
I/O
,总是可以通过读相应的数据寄存器得到端口
I/O
引脚的状态。端口
1
的引脚可以用作
ADC1
的模拟输入。
在执行目标地址为片外
XRAM
的
MOVX
指令时,外部存储器接口可以在低端口或高端口有效。
高端口可作为
GPIO
引脚按字节访问。
端口
0-3
和优先权交叉开关译码器
优先权交叉开关译码器,或称为
“
交叉开关
”
,按优先权顺序将端口
0-3
的引脚分配给器件上的数字外设(
UART
、
SMBus
、
PCA
、定时器等)。端口引脚分配顺序是从
P0.0
开始,可以一直分配到
P3.7
。为数字外设分配端口引脚的优先权顺序如下图,
UART0
具有最高优先权,而
CNVSTR
具有最低优先权。
交叉开关引脚分配
当交叉开关配置寄存器
XBR0
、
XBR1
和
XBR2
中外设的对应使能位被设置为逻辑
‘1’
时,交叉开关将端口引脚分配给外设。
端口
0-3
种所有未被交叉开关分配的引脚都可以作为通用
I/O(GPIO)
引脚,通过读或写相应的端口数据寄存器访问,这是一组既可以按位寻址也可以按字节寻址的
SFR
。被交叉开关分配的那些端口引脚的输出状态受使用这些引脚的数字外设的控制。向端口数据寄存器(或相应的端口位)写入时对这些引脚的状态没有影响。
不管交叉开关是否将引脚分配给外设,读一个端口数据寄存器(或端口位)将总是返回引脚本身的逻辑状态。唯一的例外发生在执行读
-
修改
-
写指令(
ANL
、
ORL
、
XRL
、
CPL
、
INC
、
DEC
、
DJNZ
、
JBC
、
CLR
、
SET
和位写操作)期间。在读
-
修改
-
写指令的读周期,所读的值是端口数据寄存器的内容,而不是端口引脚本身的状态。
因为交叉开关寄存器影响器件外设的引脚分配,所以他们通常在外设被配置前由系统的初始化代码配置。一旦配置完毕,将不再对其重新编程。
交叉开关寄存器被正确配置后,通过将
XBARE
(
XBR2.6)
设置为逻辑
‘1’
来使能交叉开关。
在
XBARE
被设置为逻辑
‘1’
之前,端口
0-3
的输出驱动器应被明确禁止,以防对交叉开关寄存器和其它寄存器写入时在端口引脚上产生争用。
被交叉开关分配给输入信号(例如
RX0
)的引脚所对应的输出驱动器应被明确禁止;以保证端口数据寄存器和
PnMDOUT
寄存器的值不影响这些引脚的状态。
配置端口引脚的输出方式
在
XBARE
(
XBR2.6)
被设置为逻辑
‘1’
之前,端口
0-3
的输出驱动器保持禁止状态。
每个端口引脚的输出方式都可被配置为漏极开路或推挽方式,
缺省状态为漏极开路
。在推挽方式下,向端口数据寄存器中的相应位写逻辑
‘0’
将使端口引脚被驱动到
GND
,写逻辑
‘1’
将使端口引脚被驱动到
VDD
。在漏极开路方式,向端口数据寄存器中的相应位写逻辑
‘0’
将使端口引脚被驱动到
GND
,写逻辑
‘1’
将使端口引脚处于高阻状态。当系统中不同器件的端口引脚有共享连接,即多个输出连接到同一个物理线时(例如
SMBus
连接中的
SDA
信号),使用漏极开路方式可以防止不同期间之间的争用。
端口
0-3
引脚的输出方式由
PnMDOUT
寄存器中的对应位决定。例如
P3MDOUT.7
为逻辑
‘1’
时将
P3.7
配置为推挽方式;
P3MDOUT.7
为逻辑
‘0’
时将
P3.7
配置为漏极开路方式。
所有端口引脚的缺省方式为漏极开路
。
不管交叉开关是否将端口引脚分配给某个数字外设,端口引脚的输出方式都受
PnMDOUT
寄存器控制。例外情况是:连接到
SDA
、
SCL
、
RX0
(如果
UART0
工作于方式
0
)、
RX1
(如果
UART1
工作于方式
0
)的端口引脚总是被配置为漏极开路输出,而与
PnMDOUT
寄存器中的对应位的设置值无关。
配置端口引脚为数字输入
通过设置输出方式为
“
漏极开路
”
并向端口数据寄存器中的相应位写
‘1’
将使端口引脚配置为数字输入。例如,设置
P3MDOUT.7
为逻辑
‘0’
并设置
P3.7
为逻辑
‘1’
既可将
P3.7
配置为数字输入。
如果一个端口引脚奥被交叉开关分配给某个数字外设,并且该引脚的功能为输入(例如
UART0
的接受引脚
RX0
),则该引脚的输出驱动器被自动禁止。
外部中断(
IE6
和
IE7
)
除了外部中断
/INT0
和
/INT1
(其引脚由交叉开关分配)之外,
P3.6
和
P3.7
可被配置为边沿触发的中断源,用
IE6CF
(
P3IF.2)
和
IE7CF
(
P3IF.3)
位可以将这两个中断源配置为下降沿或上升沿触发。当检测到
P3.6
或
P3.7
有下降沿或上升沿发生时,
P3IF
寄存器中对应的外部中断标志(
IE6
或
IE7
)将被置
‘1’
。如果对应的中断被允许,将会产生一个中断,
CPU
将转向对应的中断向量地址。
弱上拉
每个端口引脚都有一个内部弱上拉部件,在引脚与
VDD
之间提供阻性连接(约
100k
Ω
),在缺省情况下该上拉被使能。弱上拉部件可以被总体禁止,通过向弱上拉禁止位(WEAKPUD,XBR2.7)写‘1’实现。当任何引脚被驱动为逻辑‘0’时,弱上拉自动取消;即输出引脚不能与其自身的上拉部件冲突。对于端口1的引脚,将引脚配置为模拟输入时上拉部件也被禁止。
配置端口1的引脚为模拟输入(AIN.[7:0])
端口1的引脚可以用作ADC1模拟多路开关的模拟输入。通过向PIMDIN寄存器(见图17.13)中对应位写'0'即可将端口引脚配置为模拟输入。缺省情况下端口引脚为数字输入方式。将一个端口引脚配置为模拟输入的过程如下:
- 禁止引脚的数字输入路径。这可以防止在引脚上的电压接近VDD/2时消耗额外的电源电流。读端口数据为将返回逻辑‘0’,与加在引脚上的电压无关。
- 禁止引脚的弱上拉 部件。
- 使交叉开关在为数字外设分配引脚时跳过该引脚
注意:被配置为模拟输入的引脚的输出驱动器并没有被明确地禁止。
因此被配置为模拟输入的引脚所对一个的P1MDOUT位应被设置为逻辑‘0’(漏极开路方式),对应的端口数据为应被设置为逻辑‘1’(高阻态)。需要注意的是,将一个端口引脚用作ADC1模拟多路开关输入时并不要求将配置为模拟输入,但强烈建议这样做。
外部存储器接口引脚分配
如果外部存储器接口(EMIF)被设置在低端口(端口0-3),EMIFLE(XBR2.1)位应被设置为逻辑‘1’
,以使交叉开关不将P0.7(/WR)、P0.7(/RD)和P0.5(/ALE)(如果外部存储器接口使用复用方式)分配给外设。
如果外部存储器接口被设置在低端口并且发生一次片外
MOVX
操作,则在该
MOVX
指令执行期间外部存储器接口将控制有关端口的输入状态,而不管交叉开关寄存器和端口数据寄存器的设置如何。端口引脚的输出配置不受
EMIF
操作的影响,但
读操作将禁止数据总线上的输出驱动器
。
端口
4-7
端口
4-7
的所有端口都可以用作通用
I/O
(
GPIO
),通过读和写相应的端口数据寄存器(见图
17.21
、图
17.22
、图
17.23
和图
17.24
)访问每个端口,这些端口数据寄存器是一组按字节寻址的特殊功能寄存器。
读端口数据寄存器时,返回的是端口引脚本身的逻辑状态。例外的情况发生在执行读
-
修改
-
写指令(
ANL
、
ORL
、
XRL
、
JBC
、
CPL
、
INC
、
DEC
、
DJNZ
、
JBC
、
CLR
、
SET
及位传送操作)期间。在读
-
修改
-
写指令的读周期,读入的是端口数据寄存器的内容,而不是端口引脚本身的状态。
外部存储器接口
如果外部存储器接口(
EMIF
)被设置在高端口(端口
4-7
),
EMIFLE
(
XBR2.1)
位应被设置为逻辑
‘0’
。
如果外部存储器接口被设置在高端口并且发生一次片外
MOVX
操作,则在该
MOVX
指令执行期间外部存储器接口将控制有关端口引脚的输出状态,而不管端口数据寄存器的设置如何。端口引脚的输出配置不受
EMIF
操作的影响,但读操作将禁止数据总线上的输出驱动器。