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