一、背景:很久前用過C8051,現(xiàn)在有相關(guān)需求需要重新使用C8051,然后發(fā)現(xiàn)一年前開發(fā)的相關(guān)經(jīng)驗都忘得基本上差不多了。連最基本的GPIO口配置還得重新來看手冊,所以有此文,做個記錄,以備下次快速開發(fā)。二、正文:首先是GPIO口的配置步驟:1.用端口輸入方式寄存器(PnMDIN)選擇所有端口引腳的輸入方式(模擬或數(shù)字)。2.用端口輸出方式寄存器(PnMDOUT)選擇所有端口引腳的輸出方式(漏極開路或推挽)。3.用端口跳過寄存器(PnSKIP)選擇應(yīng)被交叉開關(guān)跳過的那些引腳。4.將引腳分配給要使用的外設(shè)(XBR0、XBR1、XBR2)。5.使能交叉開關(guān)(XBARE=1)。先著重說明下,什么是"優(yōu)先交叉開關(guān)譯碼器(PriorityCrossbarDecoder)":這玩意兒的這個名稱,我暫時只在Silicon的單片機上見過,也許是因為只有該類型MCU用這種IO口分配機制吧。我們平時使用的MCU,其IIC,UART,SPI等等這些外設(shè)接口已經(jīng)被廠商配置成某個或者某幾個IO上,若是需要要用這些功能,直接將該引腳配置成相應(yīng)規(guī)定好的第二功能即可,若是該IO口引腳不得以被使用,還可以使用重映射功能,將該功能映射到廠商規(guī)定的第二個備用IO口。但是Slicon卻不然,它提供的MCU原理圖上,光光的,什么都沒有,也就是說,基本上這些第二功能接口幾乎可被配置在任意一個IO口上。也就是交叉開關(guān)會將這些外設(shè)功能按照下圖外設(shè)功能分配優(yōu)先級,從高到低分配給不同的外設(shè)引腳,外設(shè)功能的優(yōu)先級如下圖:
從優(yōu)先權(quán)最高的UART0開始,這個被固定配置在"P0.4","P0.5",接著在"XBR0"內(nèi),SPI配置為啟用,且P0SKIP的第"0""1""2""3"位未被選擇為跳過,則對應(yīng)SPI引腳被配置到"P0.0","P0.1","P0.2","P0.3"上;若是SPI配置為禁用,IIC啟用,且P0SKIP的第"0""1"位未被選擇為跳過,則IIC的"SDA","SCL"被配置在"P0.0","P0.1"上。即若是該引腳已經(jīng)被配置,或者在端口跳過寄存器中被設(shè)置,則交叉開關(guān)會跳過這些引腳,然后分配到接下來空閑的引腳上,該配置選項即對應(yīng)于GPIO口配置步驟的3、4、5。Uart口的分配是固定的原因在于下載引導(dǎo)程序內(nèi),需要固定此IO口。說到這,那就一步步詳解GPIO口配置步驟吧。"1"步驟:決定引腳輸入模式,要么是模擬輸入,要么是數(shù)字輸入,數(shù)字輸入為復(fù)位后的默認配置。寄存器:"PnMDIN","n"為對應(yīng)的port口:-->"0",配置為模擬輸入;-->"1",配置為數(shù)字輸入。"2"步驟:配置引腳輸出方式:寄存器:"PnMDOUT","n"為對應(yīng)的port口:-->"0",漏極開路;配合外部上拉電阻,通常用來檢測輸入。-->"1",推挽輸出。"3"步驟:對應(yīng)的引腳是否被交叉開關(guān)分配為第二功能:寄存器:"PnSKIP","n"為對應(yīng)的port口:-->"0",對應(yīng)的引腳不被交叉開關(guān)跳過;-->"1",對應(yīng)的引腳被交叉開關(guān)跳過。此步驟注意:若是引腳已被規(guī)定了特殊的使用,譬如VREF,XTAL1/2等IO口,或者被配置為模擬輸入的引腳,對應(yīng)位在該寄存器內(nèi)必須被配置為"1"。"4"步驟:對應(yīng)外設(shè)功能是否被分配到IO口引腳:寄存器:"XBR0","XBR1"為-->"0",不需要分配IO口引腳;-->"1",需要分配IO口引腳。對于給定的XBRn設(shè)置,可以使用優(yōu)先權(quán)譯碼表確定I/O引腳分配;另一種方法是使用SiliconLabsIDE軟件的配置向?qū)Чδ軄泶_定基于XBRn寄存器設(shè)置的端口I/O引腳分配。"5"步驟使能交叉開關(guān),在使能交叉開關(guān)未被打開前,外部引腳保持標準端口I/O方式(輸入)。配置完畢后,未被交叉開關(guān)選擇到的IO口,均可當(dāng)做通用IO口使用,通過對應(yīng)的端口數(shù)據(jù)寄存器訪問端口P3-0,這些寄存器既可以按位尋址也可以按字節(jié)尋址。端口P4(僅C8051F340/1/4/5)使用的SFR只能按字節(jié)尋址。向端口寫入時,數(shù)據(jù)被鎖存到端口數(shù)據(jù)寄存器中,以保持引腳上的輸出數(shù)據(jù)值不變。讀端口數(shù)據(jù)寄存器將總是返回端口輸入引腳的邏輯狀態(tài),而與XBRn的設(shè)置值無關(guān)(即使在引腳被交叉開關(guān)分配給其它信號時,端口寄存器總是讀其對應(yīng)的端口I/O引腳)。但在對端口SFR執(zhí)行下面的讀-修改-寫指令(ANL、ORL、XRL、JBC、CPL、INC、DEC、DJNZ)和對端口SFR中的某一位執(zhí)行MOV、CLR、SETB期間例外。這些指令讀端口寄存器(而不是引腳)的值,修改后再寫回端口SFR。三、參考文獻詳細解說開漏輸出和推挽輸出http://blog.sina.com.cn/s/blog_14e0394720102vewa.html至此,記錄完畢。