General Purpose Input Output (通用輸入/輸出)簡稱為GPIO,或總線擴展器,人們利用工業(yè)標(biāo)準(zhǔn)I2C、SMBus或SPI接口簡化了I/O口的擴展。當(dāng)微控制器或芯片組沒有足夠的I/O端口,或當(dāng)系統(tǒng)需要采用遠端串行通信或控制時,GPIO產(chǎn)品能夠提供額外的控制和監(jiān)視功能。
GPIO的優(yōu)點:
低功耗:GPIO具有更低的功率損耗(大約1μA,μC的工作電流則為100μA)。
集成IIC從機接口:GPIO內(nèi)置IIC從機接口,即使在待機模式下也能夠全速工作。
小封裝:GPIO器件提供最小的封裝尺寸 ― 3mm x 3mm QFN!
低成本:您不用為沒有使用的功能買單。
快速上市:不需要編寫額外的代碼、文檔,不需要任何維護工作。
靈活的燈光控制:內(nèi)置多路高分辨率的PWM輸出。
可預(yù)先確定響應(yīng)時間:縮短或確定外部事件與中斷之間的響應(yīng)時間。
更好的燈光效果:匹配的電流輸出確保均勻的顯示亮度。
布線簡單:僅需使用2條就可以組成IIC總線或3條組成SPI總線。
與ARM 的幾組GPIO引腳,功能相似,GPxCON 控制引腳功能,GPxDAT用于讀寫引腳數(shù)據(jù)。另外,GPxUP用于確定是否使用上拉電阻。 x為A,B,,H/J,
GPAUP沒有上拉電阻。
GPIO的確切作用:
----輸出值可寫(高=1,低=0)。一些芯片也可以選擇驅(qū)動這些值的方式,以便支持“線-或”或類似方案(開漏信號線)。
----輸入值可讀(1,0)。一些芯片支持輸出管腳回讀,這在線或的情況下非常有用(以支持雙向信號線)。GPIO控制器可能具有一個輸入防故障/防反跳邏輯,有時還會有軟件控制。
----輸入經(jīng)常被用作中斷信號,通常是邊沿觸發(fā),但也有可能是電平觸發(fā)。這些中斷可以配置為系統(tǒng)喚醒事件,從而將系統(tǒng)從低功耗模式喚醒。
----一個GPIO經(jīng)常被配置為輸入/輸出雙向,根據(jù)不同的產(chǎn)品單板需求,但也存在單向的情況。
----大多是GPIO可以在獲取到spinlock自旋鎖時訪問,但那些通過串行總線訪問的通常不能如此操作(休眠的原因)。一些系統(tǒng)中會同時存在這兩種形式的GPIO。
----在一個給定單板上,每個GPIO用于一個特定的目的,如監(jiān)控MMC/SD卡的插入/移除,檢查卡寫保護狀態(tài),驅(qū)動LED,配置發(fā)送器,串行總線位拆,觸發(fā)一個硬件看門狗,觸發(fā)一個開關(guān)之類的。
什么是管腳復(fù)用?
所謂的管腳復(fù)用,就是除第一功能外,增加了第二功能,如單片機89C51的P3 I/O口同時還為中斷管腳,主要為節(jié)約芯片面積。當(dāng)然在利用程序控制時是不會影響的
為何要有管腳復(fù)用?
當(dāng):芯片上的引腳資源不夠用;芯片上,為了更高效率的利用引腳資源;就可能會出現(xiàn)引腳復(fù)用。物理上,同樣的一組引腳,pin腳;
可以被設(shè)置(通過軟件配置對應(yīng)的寄存器去控制)為不同的功能,這樣就可以實現(xiàn)可以根據(jù)實際需要,在不同的情況下,使用同一組引腳,實現(xiàn)不同的功能,用于不同的功能。
GPIO管腳的復(fù)用功能重映:
1、復(fù)用功能:內(nèi)置外設(shè)是與I/O口共用引出管腳(不同的功能對應(yīng)同一管腳)STM32 所有內(nèi)置外設(shè)的外部引腳都是與標(biāo)準(zhǔn)GPIO引腳復(fù)用的,如果有多個復(fù)用功能模塊對應(yīng)同一個引腳,只能使能其中之一,其它模塊保持非使能狀態(tài)。
2、重映射功能:復(fù)用功能的引出腳可以通過重映射,從不同的I/O管腳引出,即復(fù)用功能的引出腳位是可通過程序改變到其他的引腳上!
直接好處:PCB電路板的設(shè)計人員可以在需要的情況下,不必把某些信號在板上繞一大圈完成聯(lián)接,方便了PCB的設(shè)計同時潛在地減少了信號的交叉干擾。如:USART1:0: 沒有重映像(TX/PA9,RX/PA10);1: 重映像(TX/PB6,RX/PB7)[0,1為一寄存器的bit值]
下述復(fù)用功能的引出腳具有重映射功能:
- 晶體振蕩器的引腳在不接晶體時,可以作為普通I/O口
- CAN模塊; - JTAG調(diào)試接口;- 大部分定時器的引出接口; - 大部分USART引出接口 - I2C1的引出接口; - SPI1的引出接口;
舉例:對于STM32F103VBT6,47引腳為PB10,它的復(fù)用功能是I2C2_SCL和 USART3_TX,表示在上電之后它的默認功能為PB10,而I2C2的SCL和USART3的TX為它的復(fù)用功能;另外在TIM2的引腳重映射后,TIM2_CH3也成為這個引腳的復(fù)用功能。
?。?)要使用STM32F103VBT6的47、48腳的USART3功能,則需要配置47腳為復(fù)用推挽輸出或復(fù)用開漏輸出,配置48腳為某種輸入模式,同時使能USART3并保持I2C2的非使能狀態(tài)。
?。?)使用STM32F103VBT6的47腳作為TIM2_CH3,則需要對TIM2進行重映射,然后再按復(fù)用功能的方式配置對應(yīng)引腳。
下面跟大家說一下STM32單片機的端口重映射,因為是以自己為實例。這里是以USART1的重映射為例:
STM32上有很多I/O口,也有很多的內(nèi)置外設(shè)想I2C,ADC,ISP,USART等,為了節(jié)省引出管腳,這些內(nèi)置外設(shè)基本上是與I/O口共用管腳的,也就是I/O管腳的復(fù)用功能。但是STM32還有一特別之處就是:很多復(fù)用內(nèi)置的外設(shè)的I/O引腳可以通過重映射功能,從不同的I/O管腳引出,即復(fù)用功能的引腳是可通過程序改變的。
以上是我在配置GPIO管腳PA9 PA10時沒有發(fā)現(xiàn)的復(fù)用功能,
直到我添加了RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);這個函數(shù)才通。
重映射步驟為:
1.打開重映射時鐘和USART重映射后的I/O口引腳時鐘, RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);
2.I/O口重映射開啟。
GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
3.配制重映射引腳, 這里只需配置重映射后的I/O,原來的不需要去配置。 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_InitStructure);
只需要這三步,串口就可以正常使用了,簡單吧? 但是我糾結(jié)了大半個小時才搞定的,好多事情都是說起來容易做起來難的,希望我以后多多進步。不要眼高手低,嗯我正朝這個方向前進。
最后總結(jié)一下:
簡單的說 STM32的io有3個功能一個是默認的一個是復(fù)用一個是重映射功能(這個其實也屬于復(fù)用)
如果配置成復(fù)用則將使用第2個功能如果配置成復(fù)用同時相應(yīng)的重映射配置了則將使用第3個功能
通常一個口的復(fù)用+重映射有好多不止兩個這時候就看你使能哪個設(shè)備了(哪個被使能就用哪個)
開復(fù)用 + 使能設(shè)備+ 是否重映射就可以決定這個io口到底使用哪個功能 別忘了開啟USART1的外設(shè)時鐘。
評論