CH559 設(shè)置P3口推挽輸出后 串口0無法接收數(shù)據(jù)

我將P3端口的一個引腳設(shè)置成了推挽輸出? ?串口UART0接收不能用了? 是什么原因?

? ?和? bPN_OC? 有關(guān)嗎??

image.png

我的程序用的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;

? ? }


? }

}











代碼中配置引腳輸入輸出模式的函數(shù)在配置推挽輸出的時候,image.png配置P3_DIR的時候多了‘~’符號,導(dǎo)致引腳模式配置錯誤,把這個‘~’去掉就好了。


在配置串口時配置一下RX和TX引腳模式分別為高阻輸入和推挽輸出。

image.png




十分感謝? 問題已解決??


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频