我將P3端口的一個引腳設(shè)置成了推挽輸出? ?串口UART0接收不能用了? 是什么原因?
? ?和? bPN_OC? 有關(guān)嗎??
我的程序用的UART0例程? 就是添加了GPIO例程中? CH559GPIOModeSelt? 函數(shù)
main函數(shù)中調(diào)用了一下? ?CH559GPIOModeSelt(3,2,3);? ? ?UART0接收不能用了??
是需要改一下其他東西嗎? 求教一下
/********************************** (C) COPYRIGHT *******************************
* File Name? ? ? ? ? : UART0.C
* Author? ? ? ? ? ? ?: WCH
* Version? ? ? ? ? ? : V1.3
* Date? ? ? ? ? ? ? ?: 2016/06/24
* Description? ? ? ? : CH559 串口0自發(fā)自收演示
? ? ? ? ? ? ? ? ? ? ?(1)、串口0收發(fā)數(shù)據(jù),波特率可調(diào);? ? ? ? ? ? ? ? ?
*******************************************************************************/
#include "..\DEBUG.C"? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //調(diào)試信息打印
#include "..\DEBUG.H"
#pragma? NOAREGS
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?UINT8 DAT,FLAG;
/*******************************************************************************
* Function Name? : CH559UART0Interrupt()
* Description? ? : CH559UART0中斷處理函數(shù)
*******************************************************************************/
void CH559UART0Interrupt( )? interrupt INT_NO_UART0 using 1? ? ? ? ? ? ? ? ? ? //看門狗中斷服務(wù)程序,使用寄存器組1
{
? ? if(TI)
? ? {
? ? ? ? TI = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //清空發(fā)送中斷? ? ? ? ? ? ? ? ? ? ? ??
? ? }
? ? if(RI)
? ? {
? ? ? ? FLAG = 1;
? ? ? ? RI = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //清空接收中斷
? ? ? ? DAT = SBUF;
? ? }
}
/*******************************************************************************
* Function Name? : CH559GPIODrivCap(UINT8 Port,UINT8 Cap)
* Description? ? : 端口0、1、2、3驅(qū)動能力設(shè)置
* Input? ? ? ? ? : UINT8 Port端口選擇(0、1、2、3)
? ? ? ? ? ? ? ? ? ?UINT8 Cap驅(qū)動能力選擇((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){? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//驅(qū)動電流最大5mA
? ? PORT_CFG &= ~(bP0_DRV << Port);
? }
? else{
? ? PORT_CFG |= (bP0_DRV << Port);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//驅(qū)動電流最大20mA
? }
? return SUCCESS;
}
/*******************************************************************************
* Function Name? : CH559GPIOModeSelt(UINT8 Port,UINT8 Mode,UINT8 PinNum)
* Description? ? : 端口0、1、2、3引腳模式設(shè)置
* Input? ? ? ? ? : UINT8 Port端口選擇(0、1、2、3)
? ? ? ? ? ? ? ? ? ?UINT8 Cap驅(qū)動方式選擇(bPn_OC & Pn_DIR & Pn_PU)
? ? ? ? ? ? ? ? ? ?0(000):僅輸入,無上拉;
? ? ? ? ? ? ? ? ? ?1(001):僅輸入,帶上拉;
? ? ? ? ? ? ? ? ? ?2(01x):推挽輸出,高低電平強驅(qū)動;
? ? ? ? ? ? ? ? ? ?3(100):開漏輸出,無上拉,支持輸入;
? ? ? ? ? ? ? ? ? ?4(110):開漏輸出,無上拉,當轉(zhuǎn)變輸出由低到高時,僅驅(qū)動2個時鐘的高電平
? ? ? ? ? ? ? ? ? ?5(101):準雙向(標準51模式),開漏輸出,帶上拉
? ? ? ? ? ? ? ? ? ?6(111):準雙向(標準51模式),開漏輸出,帶上拉,當轉(zhuǎn)變輸出由低到高時,僅驅(qū)動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:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //推挽輸出,高低電平強驅(qū)動
? ? 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:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //開漏輸出,無上拉,當轉(zhuǎn)變輸出由低到高時,僅驅(qū)動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模式),開漏輸出,帶上拉,當轉(zhuǎn)變輸出由低到高時,僅驅(qū)動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);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//等待外部晶振穩(wěn)定??
//? CH559UART0Alter();? ??
? ?
FLAG = 0;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //標志位清空
? ? mInitSTDIO( );? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//串口0初始化函數(shù)
? ? ES = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //開啟UART0中斷
? ? EA = 1;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //總中斷開啟
? ? ?CH559GPIOModeSelt(3,2,3);
INT1 = 1;
while(1)
? {
? ? if(FLAG == 1)
? ? {
? ? ?SBUF = DAT;
? ? ?FLAG = 0;
? ? }
? }
}