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