我将P3端口的一个引脚设置成了推挽输出 串口UART0接收不能用了 是什么原因?
和 bPN_OC 有关吗
我的程序用的UART0例程 就是添加了GPIO例程中 CH559GPIOModeSelt 函数
main函数中调用了一下 CH559GPIOModeSelt(3,2,3); UART0接收不能用了
是需要改一下其他东西吗 求教一下
/********************************** (C) COPYRIGHT *******************************
* File Name : UART0.C
* Author : WCH
* Version : V1.3
* Date : 2016/06/24
* Description : CH559 串口0自发自收演示
(1)、串口0收发数据,波特率可调;
*******************************************************************************/
#include "..\DEBUG.C" //调试信息打印
#include "..\DEBUG.H"
#pragma NOAREGS
UINT8 DAT,FLAG;
/*******************************************************************************
* Function Name : CH559UART0Interrupt()
* Description : CH559UART0中断处理函数
*******************************************************************************/
void CH559UART0Interrupt( ) interrupt INT_NO_UART0 using 1 //看门狗中断服务程序,使用寄存器组1
{
if(TI)
{
TI = 0; //清空发送中断
}
if(RI)
{
FLAG = 1;
RI = 0; //清空接收中断
DAT = SBUF;
}
}
/*******************************************************************************
* Function Name : CH559GPIODrivCap(UINT8 Port,UINT8 Cap)
* Description : 端口0、1、2、3驱动能力设置
* Input : UINT8 Port端口选择(0、1、2、3)
UINT8 Cap驱动能力选择((0)5mA、(1)20mA(注意:P1口是10mA))
* Output : None
* Return : SUCCESS成功
FAIL失败
*******************************************************************************/
UINT8 CH559GPIODrivCap(UINT8 Port,UINT8 Cap)
{
if(Port >= 4){
return FAIL;
}
if(Cap == 0){ //驱动电流最大5mA
PORT_CFG &= ~(bP0_DRV << Port);
}
else{
PORT_CFG |= (bP0_DRV << Port); //驱动电流最大20mA
}
return SUCCESS;
}
/*******************************************************************************
* Function Name : CH559GPIOModeSelt(UINT8 Port,UINT8 Mode,UINT8 PinNum)
* Description : 端口0、1、2、3引脚模式设置
* Input : UINT8 Port端口选择(0、1、2、3)
UINT8 Cap驱动方式选择(bPn_OC & Pn_DIR & Pn_PU)
0(000):仅输入,无上拉;
1(001):仅输入,带上拉;
2(01x):推挽输出,高低电平强驱动;
3(100):开漏输出,无上拉,支持输入;
4(110):开漏输出,无上拉,当转变输出由低到高时,仅驱动2个时钟的高电平
5(101):准双向(标准51模式),开漏输出,带上拉
6(111):准双向(标准51模式),开漏输出,带上拉,当转变输出由低到高时,仅驱动2个时钟的高电平
UINT8 PinNum(引脚选择0-7)
* Output : None
* Return : SUCCESS成功
FAIL失败
*******************************************************************************/
UINT8 CH559GPIOModeSelt(UINT8 Port,UINT8 Mode,UINT8 PinNum)
{
UINT8 Pn_DIR,Pn_PU;
if(Port >= 4){
return FAIL;
}
switch (Mode){
case 0: //仅输入,无上拉
PORT_CFG &= ~(bP0_OC << Port);
Pn_DIR &= ~(1<
Pn_PU &= ~(1<
break;
case 1: //仅输入,带上拉
PORT_CFG &= ~(bP0_OC << Port);
Pn_DIR &= ~(1<
Pn_PU |= 1<
break;
case 2: //推挽输出,高低电平强驱动
PORT_CFG &= ~(bP0_OC << Port);
Pn_DIR |= ~(1<
break;
case 3: //开漏输出,无上拉,支持输入
PORT_CFG |= (bP0_OC << Port);
Pn_DIR &= ~(1<
Pn_PU &= ~(1<
break;
case 4: //开漏输出,无上拉,当转变输出由低到高时,仅驱动2个时钟的高电平
PORT_CFG |= (bP0_OC << Port);
Pn_DIR |= 1<
Pn_PU &= ~(1<
break;
case 5: //弱准双向(标准51模式),开漏输出,带上拉
PORT_CFG |= (bP0_OC << Port);
Pn_DIR &= ~(1<
Pn_PU |= 1<
break;
case 6: //准双向(标准51模式),开漏输出,带上拉,当转变输出由低到高时,仅驱动2个时钟的高电平
PORT_CFG |= (bP0_OC << Port);
Pn_DIR |= 1<
Pn_PU |= 1<
break;
default:
break;
}
if(Port == 0){
P0_DIR = Pn_DIR;
P0_PU = Pn_PU;
}
if(Port == 1){
P1_DIR = Pn_DIR;
P1_PU = Pn_PU;
}
if(Port == 2){
P2_DIR = Pn_DIR;
P2_PU = Pn_PU;
}
if(Port == 3){
P3_DIR = Pn_DIR;
P3_PU = Pn_PU;
}
return SUCCESS;
}
main( )
{
UINT8 i;
// CfgFsys( ); //CH559时钟选择配置
mDelaymS(5); //等待外部晶振稳定
// CH559UART0Alter();
FLAG = 0; //标志位清空
mInitSTDIO( ); //串口0初始化函数
ES = 1; //开启UART0中断
EA = 1; //总中断开启
CH559GPIOModeSelt(3,2,3);
INT1 = 1;
while(1)
{
if(FLAG == 1)
{
SBUF = DAT;
FLAG = 0;
}
}
}