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