STM32L GPIO
1. 每個(gè)GPIO均有以下寄存器:
- 4個(gè)32位配置寄存器:GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR和GPIOx_PUPDR
GPIOx_MODER :配置IO端口方向?yàn)檩斎?輸出/AF/模擬
GPIOx_OTYPER :選擇輸出類型:推挽/開漏
GPIOx_OSPEEDR :選擇IO速度(與IO端口方向無關(guān))
GPIOx_PUPDR :選擇上拉/下拉電阻(與IO端口方向無關(guān))
- 2個(gè)32位數(shù)據(jù)寄存器:GPIOx_IDR、GPIOx_ODR
- 1個(gè)32位置位/復(fù)位寄存器:GPIOx_BSRR(使用該寄存器讀寫寄存器可以避免在讀寫期間被IRQ中斷,該讀寫操作屬于一個(gè)原子操作)
該寄存器允許置位/復(fù)位GPIOx_ODR上指定的一位,GPIOx_ODR上每位關(guān)聯(lián)到兩個(gè)控制位:GPIOx_BSRR:BSRR(i) [Bits 15:0]和 GPIOx_BSRR:BSRR(i+SIZE)[Bits31:16];往GPIOx_BSRR:BSRR(i) [Bits 15:0]寫1 可以置位對(duì)應(yīng)的ODR;往GPIOx_BSRR:BSRR(i) [Bits 31:16]寫1 可以置位對(duì)應(yīng)的ODR;往該寄存器寫0不會(huì)產(chǎn)生任何影響
- 1個(gè)32位鎖定寄存器:GPIOx_LCKR
必需通過通過一個(gè)特殊的讀寫時(shí)序才能寫入該寄存器,但時(shí)序正確時(shí),bit16會(huì)置位(lock key active),bits[15:0]顯示哪些IO端口被鎖定了,端口被鎖定之后直到下一個(gè)復(fù)位才能解鎖,鎖定之后以下寄存器將被凍結(jié):GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_AFRH、GPIOx_AFRL
- 2個(gè)復(fù)用功能寄存器:GPIOx_AFRH、GPIOx_AFRL
2. 每個(gè)GPIO端口均可單獨(dú)設(shè)置為以下模式:
- 輸入+懸空
- 輸入+上拉
- 輸入+下拉
- 模擬(用作ADC、DAC輸出或者捕獲輸入情況下)
- 輸出+開漏+上拉/下拉(輸出模式下GPIO的輸出速度是可配置的)
- 輸出+推挽+上拉/下拉
- 復(fù)用功能+推挽+上拉/下拉
- 復(fù)用功能+開漏+上拉/下拉
3. GPIO一般用途
- 默認(rèn)情況或者剛復(fù)位后,所有IO端口被設(shè)置為輸入+懸空模式,除了調(diào)試接口默認(rèn)設(shè)置為了復(fù)用功能+上拉/下拉
- 當(dāng)端口被設(shè)置為輸出的時(shí)候,修改GPIOx_ODR對(duì)應(yīng)可改變輸出高低電平(一般會(huì)使用推挽或者開漏輸出(輸出低電平時(shí),只有N-MOS是接通的))
- 當(dāng)端口被設(shè)置為輸入的時(shí)候,每個(gè)AHB總線時(shí)鐘均會(huì)捕獲端口上高低電平,并存放在GPIOx_IDR寄存器
- 所有的GPIO端口均可通過配置寄存器使能或不使能內(nèi)部弱上拉/弱下拉
4 .I/O端口多路復(fù)用及映射
IO端口通過一個(gè)內(nèi)部的多路選擇器以允許在同一時(shí)刻只使用一種復(fù)用功能,這樣使得多個(gè)外圍電路共享同樣的IO端口
每個(gè)IO端口可以通過配置GPIOx_AFRL和GPIOx_AFRH設(shè)置所使能的復(fù)用功能(AF0~AF15)
- 復(fù)位之后,所有的IO連接到復(fù)用功能0(AF0)
- 外圍電路的復(fù)用功能映射到AF1~AF14
- Cortex-M3 EVENTOUT映射到AF15
以下說明如何使用復(fù)用功能:
- System Function:配置IO端口使能的復(fù)用功能(JTAG/SWD,在復(fù)位之后對(duì)應(yīng)端口會(huì)被調(diào)試器設(shè)置為調(diào)試功能下且不受GPIO寄存器的控制;RTC_50HZ,對(duì)應(yīng)端口需要設(shè)置為輸入+懸空;MCO,該端口必需配置在復(fù)用模式下)
- GPIO:根據(jù)需要配置GPIOx_MODER設(shè)置IO端口工作模式(輸入、輸入/模擬)
- Perpheral‘s Alternate Function:對(duì)于ADC/DAC,配置IO為模擬;對(duì)于其他外圍功能,配置GPIOx_MODER、GPIOx_OTYPE、GPIOx_PUPDR、GPIOx_OSPEEDER
- EVENTOUT:配置IO端口復(fù)用功能AF15,用于輸出Cortex-M3 EVENTOUT信號(hào)
5. 外部中斷/喚醒
所有的IO端口均有外部中斷功能,使用外部中斷功能時(shí),IO端口必需設(shè)置為輸入模式
6. 輸入模式配置
當(dāng)IO端口配置為輸入模式時(shí):
- 輸出模式被禁用
- 施密特觸發(fā)器被激活
- 根據(jù)GPIOx_PUPDR寄存器使能上拉/下拉電阻
- 每個(gè)AHB時(shí)鐘均會(huì)采樣IO端口上的值存放到輸入數(shù)據(jù)寄存器中
- 通過讀取輸入數(shù)據(jù)寄存器可以檢測IO狀態(tài)
7. 輸出模式配置
當(dāng)IO端口配置為輸出模式時(shí):
-- 開漏模式時(shí):輸出0時(shí),N-MOS導(dǎo)通(P-MOS任何情況下不會(huì)導(dǎo)通)
-- 推挽模式時(shí):輸出0時(shí),N-MOS導(dǎo)通;輸出1時(shí),P-MOS導(dǎo)通
- 根據(jù)GPIOx_PUPDR寄存器使能弱上拉/下拉
- 每個(gè)AHB時(shí)鐘均會(huì)采樣IO端口上的值存放到輸入數(shù)據(jù)寄存器中
- 通過讀取輸入數(shù)據(jù)寄存器可以檢測IO狀態(tài)
- 通過讀取輸出數(shù)據(jù)寄存器可以得到最后寫入的值
8. 復(fù)用功能配置
當(dāng)IO端口配置為復(fù)用功能時(shí):
- 輸出模式下可配置為開漏或推挽
- 復(fù)用功能的輸出信號(hào)將驅(qū)動(dòng)輸出緩沖區(qū)
- 輸入端的施密特觸發(fā)器被激活
- 根據(jù)GPIOx_PUPDR寄存器使能弱上拉/下拉
- 每個(gè)AHB時(shí)鐘均會(huì)采樣IO端口上的值存放到輸入數(shù)據(jù)寄存器中
- 通過讀取輸入數(shù)據(jù)寄存器可以檢測IO狀態(tài)
9. 模擬模式配置
當(dāng)IO端口配置為模擬模式時(shí):
- 輸出模式被禁用
- 輸入模式下的施密特觸發(fā)器被激活(為每個(gè)IO口的模擬值提供零功耗,施密特觸發(fā)器的輸出端被強(qiáng)制輸出為0)
- 弱上拉/下拉被禁用
- 讀取輸入寄存器獲取到0
10. 外部時(shí)鐘/外部晶振端口復(fù)用
- 沒有使用LSE時(shí),OSC32_IN和OSC32_OUT 可配置為一般用途的IO端口
- 沒有使用HSE時(shí),OSC_IN和OSC_OUT 可配置為一般用途的IO端口
11. 選擇RTC_AF1復(fù)用功能
STM32L152XX擁有以下特性
- 兩個(gè)GPIO端口可配置為喚醒源WKUP1和WKUP3
- 一個(gè)GPIO端口可配置為喚醒源WKUP2,可用于檢測篡改、時(shí)間戳事件,輸出RTC AFO_ALARM、AFO_CALIB
- 喚醒源(WKUP2):配置PWR_CSR寄存器中的EWUP2位
- RTC AFO_ALARM輸出:根據(jù)RTC_CR寄存器中的OSEL[1:0]輸出可配置為:RTC Alarm A、 RTC Alarm B、RTC Wakeup
- RTC AFO_CALIB輸出:配置RTC_CR寄存器中的COE[23]位
- RTC AFI_TAMPER1 : 篡改事件檢測
- 時(shí)間戳事件檢測
12. 初始化GPIO端口例子
- void Init_GPIOS(void){
- GPIO_InitTypeDef GPIO_InitStructure; //定義初始化結(jié)構(gòu)體
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); //使能對(duì)應(yīng)AHB總線時(shí)鐘
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //根據(jù)需求配置GPIO工作模式
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO端口
- }
STM32L GPIO
1. 每個(gè)GPIO均有以下寄存器:
- 4個(gè)32位配置寄存器:GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR和GPIOx_PUPDR
GPIOx_MODER :配置IO端口方向?yàn)檩斎?輸出/AF/模擬
GPIOx_OTYPER :選擇輸出類型:推挽/開漏
GPIOx_OSPEEDR :選擇IO速度(與IO端口方向無關(guān))
GPIOx_PUPDR :選擇上拉/下拉電阻(與IO端口方向無關(guān))
- 2個(gè)32位數(shù)據(jù)寄存器:GPIOx_IDR、GPIOx_ODR
- 1個(gè)32位置位/復(fù)位寄存器:GPIOx_BSRR(使用該寄存器讀寫寄存器可以避免在讀寫期間被IRQ中斷,該讀寫操作屬于一個(gè)原子操作)
該寄存器允許置位/復(fù)位GPIOx_ODR上指定的一位,GPIOx_ODR上每位關(guān)聯(lián)到兩個(gè)控制位:GPIOx_BSRR:BSRR(i) [Bits 15:0]和 GPIOx_BSRR:BSRR(i+SIZE)[Bits31:16];往GPIOx_BSRR:BSRR(i) [Bits 15:0]寫1 可以置位對(duì)應(yīng)的ODR;往GPIOx_BSRR:BSRR(i) [Bits 31:16]寫1 可以置位對(duì)應(yīng)的ODR;往該寄存器寫0不會(huì)產(chǎn)生任何影響
- 1個(gè)32位鎖定寄存器:GPIOx_LCKR
必需通過通過一個(gè)特殊的讀寫時(shí)序才能寫入該寄存器,但時(shí)序正確時(shí),bit16會(huì)置位(lock key active),bits[15:0]顯示哪些IO端口被鎖定了,端口被鎖定之后直到下一個(gè)復(fù)位才能解鎖,鎖定之后以下寄存器將被凍結(jié):GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR、GPIOx_PUPDR、GPIOx_AFRH、GPIOx_AFRL
- 2個(gè)復(fù)用功能寄存器:GPIOx_AFRH、GPIOx_AFRL
2. 每個(gè)GPIO端口均可單獨(dú)設(shè)置為以下模式:
- 輸入+懸空
- 輸入+上拉
- 輸入+下拉
- 模擬(用作ADC、DAC輸出或者捕獲輸入情況下)
- 輸出+開漏+上拉/下拉(輸出模式下GPIO的輸出速度是可配置的)
- 輸出+推挽+上拉/下拉
- 復(fù)用功能+推挽+上拉/下拉
- 復(fù)用功能+開漏+上拉/下拉
3. GPIO一般用途
- 默認(rèn)情況或者剛復(fù)位后,所有IO端口被設(shè)置為輸入+懸空模式,除了調(diào)試接口默認(rèn)設(shè)置為了復(fù)用功能+上拉/下拉
- 當(dāng)端口被設(shè)置為輸出的時(shí)候,修改GPIOx_ODR對(duì)應(yīng)可改變輸出高低電平(一般會(huì)使用推挽或者開漏輸出(輸出低電平時(shí),只有N-MOS是接通的))
- 當(dāng)端口被設(shè)置為輸入的時(shí)候,每個(gè)AHB總線時(shí)鐘均會(huì)捕獲端口上高低電平,并存放在GPIOx_IDR寄存器
- 所有的GPIO端口均可通過配置寄存器使能或不使能內(nèi)部弱上拉/弱下拉
4 .I/O端口多路復(fù)用及映射
IO端口通過一個(gè)內(nèi)部的多路選擇器以允許在同一時(shí)刻只使用一種復(fù)用功能,這樣使得多個(gè)外圍電路共享同樣的IO端口
每個(gè)IO端口可以通過配置GPIOx_AFRL和GPIOx_AFRH設(shè)置所使能的復(fù)用功能(AF0~AF15)
- 復(fù)位之后,所有的IO連接到復(fù)用功能0(AF0)
- 外圍電路的復(fù)用功能映射到AF1~AF14
- Cortex-M3 EVENTOUT映射到AF15
以下說明如何使用復(fù)用功能:
- System Function:配置IO端口使能的復(fù)用功能(JTAG/SWD,在復(fù)位之后對(duì)應(yīng)端口會(huì)被調(diào)試器設(shè)置為調(diào)試功能下且不受GPIO寄存器的控制;RTC_50HZ,對(duì)應(yīng)端口需要設(shè)置為輸入+懸空;MCO,該端口必需配置在復(fù)用模式下)
- GPIO:根據(jù)需要配置GPIOx_MODER設(shè)置IO端口工作模式(輸入、輸入/模擬)
- Perpheral‘s Alternate Function:對(duì)于ADC/DAC,配置IO為模擬;對(duì)于其他外圍功能,配置GPIOx_MODER、GPIOx_OTYPE、GPIOx_PUPDR、GPIOx_OSPEEDER
- EVENTOUT:配置IO端口復(fù)用功能AF15,用于輸出Cortex-M3 EVENTOUT信號(hào)
5. 外部中斷/喚醒
所有的IO端口均有外部中斷功能,使用外部中斷功能時(shí),IO端口必需設(shè)置為輸入模式
6. 輸入模式配置
當(dāng)IO端口配置為輸入模式時(shí):
- 輸出模式被禁用
- 施密特觸發(fā)器被激活
- 根據(jù)GPIOx_PUPDR寄存器使能上拉/下拉電阻
- 每個(gè)AHB時(shí)鐘均會(huì)采樣IO端口上的值存放到輸入數(shù)據(jù)寄存器中
- 通過讀取輸入數(shù)據(jù)寄存器可以檢測IO狀態(tài)
7. 輸出模式配置
當(dāng)IO端口配置為輸出模式時(shí):
-- 開漏模式時(shí):輸出0時(shí),N-MOS導(dǎo)通(P-MOS任何情況下不會(huì)導(dǎo)通)
-- 推挽模式時(shí):輸出0時(shí),N-MOS導(dǎo)通;輸出1時(shí),P-MOS導(dǎo)通
- 根據(jù)GPIOx_PUPDR寄存器使能弱上拉/下拉
- 每個(gè)AHB時(shí)鐘均會(huì)采樣IO端口上的值存放到輸入數(shù)據(jù)寄存器中
- 通過讀取輸入數(shù)據(jù)寄存器可以檢測IO狀態(tài)
- 通過讀取輸出數(shù)據(jù)寄存器可以得到最后寫入的值
8. 復(fù)用功能配置
當(dāng)IO端口配置為復(fù)用功能時(shí):
- 輸出模式下可配置為開漏或推挽
- 復(fù)用功能的輸出信號(hào)將驅(qū)動(dòng)輸出緩沖區(qū)
- 輸入端的施密特觸發(fā)器被激活
- 根據(jù)GPIOx_PUPDR寄存器使能弱上拉/下拉
- 每個(gè)AHB時(shí)鐘均會(huì)采樣IO端口上的值存放到輸入數(shù)據(jù)寄存器中
- 通過讀取輸入數(shù)據(jù)寄存器可以檢測IO狀態(tài)
9. 模擬模式配置
當(dāng)IO端口配置為模擬模式時(shí):
- 輸出模式被禁用
- 輸入模式下的施密特觸發(fā)器被激活(為每個(gè)IO口的模擬值提供零功耗,施密特觸發(fā)器的輸出端被強(qiáng)制輸出為0)
- 弱上拉/下拉被禁用
- 讀取輸入寄存器獲取到0
10. 外部時(shí)鐘/外部晶振端口復(fù)用
- 沒有使用LSE時(shí),OSC32_IN和OSC32_OUT 可配置為一般用途的IO端口
- 沒有使用HSE時(shí),OSC_IN和OSC_OUT 可配置為一般用途的IO端口
11. 選擇RTC_AF1復(fù)用功能
STM32L152XX擁有以下特性
- 兩個(gè)GPIO端口可配置為喚醒源WKUP1和WKUP3
- 一個(gè)GPIO端口可配置為喚醒源WKUP2,可用于檢測篡改、時(shí)間戳事件,輸出RTC AFO_ALARM、AFO_CALIB
- 喚醒源(WKUP2):配置PWR_CSR寄存器中的EWUP2位
- RTC AFO_ALARM輸出:根據(jù)RTC_CR寄存器中的OSEL[1:0]輸出可配置為:RTC Alarm A、 RTC Alarm B、RTC Wakeup
- RTC AFO_CALIB輸出:配置RTC_CR寄存器中的COE[23]位
- RTC AFI_TAMPER1 : 篡改事件檢測
- 時(shí)間戳事件檢測
12. 初始化GPIO端口例子
- void Init_GPIOS(void){
- GPIO_InitTypeDef GPIO_InitStructure; //定義初始化結(jié)構(gòu)體
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE); //使能對(duì)應(yīng)AHB總線時(shí)鐘
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //根據(jù)需求配置GPIO工作模式
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIO端口
- }
|