二,使用过程中,常常出现程序的 IO口设置,包括设置为交叉开关,推挽方式等。由于对这种设置方法不太了解,因此做一个专题。 //-------------------------------------------------------------------- // I/O初始化程序 //-------------------------------------------------------------------- // 配置交叉开关和 GPIO 端口 void xbar_init (void) { XBR0 = 0x07; // 允许 I2C SPI和 UART XBR1 = 0x00; // XBR2 = 0x40; // 允许交叉开关和弱上拉 //PRT0CF |= 0xff; // 允许 P0口的所有输出为弱上拉 //P0MDOUT // 让交叉开关将这些引脚配置为输入 //PRT1CF |= 0x40; // 允许 P1.6 (LED) 为弱上拉输出 } (通过对比几个程序的 I/O初始化,发现主要是对寄存器 XBR0~2以及 PRT(0~7)CF进行设置。特将与 IO口设置相关的寄存器做一个说明) 2.1 GPIO口和数字外设口 C8051F020/1/2/3 MCU 是高集成度的混合信号片上系统,有按8 位端口组织的64 个数字I/O 引脚。低端口(P0、P1、P2 和P3)既可以按位寻址也可以按字节寻址。高端口(P4、P5、P6 和P7)只能按字节寻址。所有引脚都耐5V 电压,都可以被配置为漏极开路或推挽输出方式和弱上拉。 C8051F020/1/2/3 器件有大量的数字资源需要通过4 个低端I/O 端口P0、P1、P2 和P3 才能使用。P0、P1、P2 和P3 中的每个引脚既可定义为通用的端口I/O(GPIO)引脚,又可以分配给一个数字外设或功能(例如:UART0 或/INT1),这种资源分配的灵活性是通过使用优先权交叉开关译码器实现的。注意,不管引脚被分配给一个数字外设或是作为通用I/O,总是可以通过读相应的数据寄存器得到端口I/O 引脚的状态。端口1 的引脚可以用做ADC1 的模拟输入。 优先权交叉开关译码器,或称为“交叉开关”,按优先权顺序将端口0 – 3 的引脚分配给 器件上的数字外设(UART、SMBus、PCA、定时器等)。端口引脚的分配顺序是从P0.0 开始,可以一直分配到P3.7。UART0 具有最高优先权,而CNVSTR 具有最低优先权。 2.2 交叉开关寄存器 当交叉开关配置寄存器XBR0、XBR1 和XBR2 中外设的对应使能位被设置为逻辑‘1’ 时,交叉开关将端口引脚分配给外设(参考C8051F02X.PDF参考第148页)。例如,如果UART0EN位(XBR0.2)被设置为逻辑‘1’,则TX0 和RX0 引脚将分别被分配到P0.0 和P0.1。因为UART0有最高优先权,所以当UART0EN 位被设置为逻辑‘1’时其...