2.3 模擬輸入模式

在這里插入圖片描述
因為模擬信號經過施密特觸發器后只有0/1兩種狀態,因此信號源輸入在施密特觸發器前。類似地,當GPIO 引腳用于DAC 作為模擬電壓輸出通道時,DAC 的模擬信號輸出就不經過雙MOS 管結構,模擬信號直接輸出到引腳。
模擬狀態與模擬外設復用引腳 區別 :

- 模擬狀態:表示引腳功能選擇為模擬模式,但不作為任何片內模擬外設(ADC)的復用引腳,只是為了減少系統功耗。
- 模擬外設復用引腳:表示引腳作為片內模擬外設的復用引腳,用于完成相應功能操作,如ADC信號采集。
2.4 復用模式

在這里插入圖片描述
- 輸出可配置為推挽或者開漏模式,內置外設的信號驅動輸出驅動器
- 施密特觸發器打開
- 弱上拉和下拉電阻被禁止
- 在每個APB2時鐘周期,出現在I/O腳上的數據被采樣到輸入數據寄存器
- 在開漏模式時,對輸入數據寄存器的讀訪問可得到I/O狀態;在推挽式模式時,對輸出數據寄存器的讀訪問得到最后一次寫的
-
復用推挽輸出:
-
復用開漏輸出:
- 對于復用的輸入功能,端口必須配置成輸入模式(浮空、上拉或下拉)且輸入引腳必須由外部驅動。
- 對于復用輸出功能,端口必須配置成復用功能輸出模式(推挽或開漏)。
- 對于雙向復用功能,端口位必須配置復用功能輸出模式(推挽或開漏)。
如果把端口配置成復用輸出功能,則引腳和輸出寄存器斷開,并和片上外設的輸出信號連接。
如果軟件把一個GPIO腳配置成復用輸出功能,但是外設沒有被激活,它的輸出將不確定。
注意 :
- STM32復位后,IO端口處于
浮空輸入狀態(CNFx[1:0]=01b,MODEx[1:0]=00b);JTAG引腳復位以后,處于上拉或者下拉狀態。 - stm32具有GPIO鎖定機制,即鎖定GPIO配置,下次復位前不能再修改端口位的配置。
- 所有IO端口都具有外部中斷能力,端口必須配置成輸入模式,才能使用外部中斷功能。
- 當LSE振蕩器關閉時,
OSC32_IN/OSC32_OUT可以用作通用GPIOPC14/PC15。當進入待機模式或者備份域由Vbat供電時,不能使用PC14/PC15的GPIO口功能。 PC13/PC14/PC15只能用于2MHz的輸出模式(LSE關閉,PC13關閉入侵檢測),最多只能帶30pF的負載,而且這些I/O口絕對不能當作電流源(如驅動LED)。(參考STM32中文手冊4.1.2)- 一般上下拉電阻的阻值都在
30-50K之間。這樣可以增強MCU的抗干擾能力。 - 芯片內部上/下拉電阻不影響GPIO輸出模式。
3 GPIO模塊寄存器
注意 :必須以字(32位)的方式操作GPIO外設寄存器!
端口模式與輸出速度配置:
(//file.elecfans.com/web2/M00/8C/10/pYYBAGPXZCGACOv3AALmvH1WBmE220.jpg)
GPIO寄存器地址映像和復位值:
GPIO外設基地址與相對于APB2總線(0x4001 0000)的偏移地址:
| GPIO外設 | 基地址 | 相對APB2總線偏移地址 |
|---|---|---|
| GPIOA | 0x4001 0800 | 0x0000 0800 |
| GPIOB | 0x4001 0C00 | 0x0000 0C00 |
| GPIOC | 0x4001 1000 | 0x0000 1000 |
| GPIOD | 0x4001 1400 | 0x0000 1400 |
| GPIOE | 0x4001 1800 | 0x0000 1800 |
| GPIOF | 0x4001 1C00 | 0x0000 1C00 |
| GPIOG | 0x4001 2000 | 0x0000 2000 |
4 應用示例
直接使用寄存器點燈(PA8-紅燈 PD2-黃燈),系統時鐘啟動文件跳轉自動配置。
led.h:
#ifndef __LED_H
#define __LED_H
#include
typedef unsigned int uint32_t;
#define _IO volatile
#define _I volatile const
#define _O volatile
#define PERIPH_BASE 0x40000000UL
#define APB1_BASE PERIPH_BASE
#define APB2_BASE (PERIPH_BASE + 0x10000)
#define AHB_BASE (PERIPH_BASE + 0x20000)
#define GPIOA_BASE (APB2_BASE + 0x0800)
#define GPIOD_BASE (APB2_BASE + 0x1400)
#define RCC_BASE (AHB_BASE + 0x1000)
typedef struct
{
_IO uint32_t CRL;
_IO uint32_t CRH;
_I uint32_t IDR;
_IO uint32_t ODR;
_IO uint32_t BSRR;
_IO uint32_t BRR;
_IO uint32_t LCKR;
} GPIO_Init_t;
typedef struct
{
_IO uint32_t CR;
_IO uint32_t CFGR;
_IO uint32_t CIR;
_IO uint32_t APB2RSTR;
_IO uint32_t APB1RSTR;
_IO uint32_t AHBENR;
_IO uint32_t APB2ENR;
_IO uint32_t APB1ENR;
_IO uint32_t BDCR;
_IO uint32_t CSR;
} RCC_t;
#define GPIOA ((GPIO_Init_t*)GPIOA_BASE)
#define GPIOD ((GPIO_Init_t*)GPIOD_BASE)
#define RCC ((RCC_t *) RCC_BASE)
#define RED_LED_GPIO_PORT GPIOA
#define RED_LED_GPIO_PIN (0x0100) // PIN8
#define YELLOW_LED_GPIO_PORT GPIOD
#define YELLOW_LED_GPIO_PIN (0x0004) // PIN2
#define RED_LED_ON (RED_LED_GPIO_PORT->BRR |= RED_LED_GPIO_PIN)
#define RED_LED_OFF (RED_LED_GPIO_PORT->BSRR |= RED_LED_GPIO_PIN)
#define RED_LED_TOGGLE (RED_LED_GPIO_PORT->ODR ^= RED_LED_GPIO_PIN)
#define YELLOW_LED_ON (YELLOW_LED_GPIO_PORT->BRR |= YELLOW_LED_GPIO_PIN)
#define YELLOW_LED_OFF (YELLOW_LED_GPIO_PORT->BSRR |= YELLOW_LED_GPIO_PIN)
#define YELLOW_LED_TOGGLE (YELLOW_LED_GPIO_PORT->ODR ^= YELLOW_LED_GPIO_PIN)
void LED_Init(void);
#endif /* __LED_H */
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
led.c & main.c :
void LED_Init(void)
{
RCC->APB2ENR |= 1 << 2; // PortA
RCC->APB2ENR |= 1 << 5; // PortD
RED_LED_GPIO_PORT->CRH &= ~(0x0f << (0 * 4));
RED_LED_GPIO_PORT->CRH |= 0x03 << (0 * 4);
RED_LED_GPIO_PORT->BSRR |= 0x01 << 8;
YELLOW_LED_GPIO_PORT->CRL &= ~(0x0f << (2 * 4));
YELLOW_LED_GPIO_PORT->CRL |= 0x03 << (2 * 4);
YELLOW_LED_GPIO_PORT->BSRR |= 0x01 << 2;
}
int main()
{
LED_Init();
while(1)
{
YELLOW_LED_TOGGLE;
HAL_Delay(500);
}
}
1234567891011121314151617181920212223
END
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
寄存器
+關注
關注
31文章
5608瀏覽量
130001 -
MOS
+關注
關注
32文章
1741瀏覽量
100731 -
GPIO
+關注
關注
16文章
1328瀏覽量
56231
發布評論請先 登錄
相關推薦
熱點推薦
基于DWC2的USB驅動開發-發送相關的寄存器DMA寄存器詳解
本文轉自公眾號,歡迎關注 基于DWC2的USB驅動開發-發送相關的寄存器DMA寄存器詳解 (qq.com) 前言 如下寄存器DIEPxxx,
GPIO寄存器詳解
STM32F4工程--IO口--GPIO寄存器詳解 ----芯片:STM32F429IGT6----參考資料:正點原子視頻一、基礎知識1、每組IO口包含10個寄存器,如果配置一個IO口
發表于 01-18 06:53
STM32使用BSRR和BRR寄存器快速操作GPIO端口
STM32的每個GPIO端口都有兩個特別的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器,通過這兩個寄存器可以直接對對應的GPIOx端口置1或置0。 GPIOx_BSRR的高1
發表于 11-26 11:50
?1次下載
基于stm32的GPIO寄存器學習解析
GPIO即通用輸入/輸出 (General Purpose Input Output)
包括:
兩個32位的配置寄存器 GPIOx->CRL,GPIOx->CRH
兩個32位的數據
【嵌入式07】寄存器映射原理詳解,GPIO端口的初始化設置步驟
本文主要介紹STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化設置三步驟(時鐘配置、輸入輸出模式設置、最大速率設置)。
發表于 12-04 12:06
?11次下載
STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化
文章目錄一、STM32F103系列芯片的地址映射和寄存器映射原理1.寄存器2.地址映射和寄存器映射原理二、GPIO端口的初始化1.
發表于 12-05 14:21
?10次下載
GPIO寄存器
,一般高16位保留BSRR寄存器32位分為低16位BSRRL和高16位BSRRH,BSRRL配置一組IO口的16個IO口的狀態(1),BSRRH配置復位狀態(0)。每組GPIO端口的寄存器包括:4個32位配置
發表于 12-08 17:06
?5次下載
STM32寄存器點燈
配置寄存器使STM32最小系統板上的LED燈點亮根據原理圖,要使D2點亮,需要將PC13拉低,分為以下步驟:使能GPIO的時鐘配置GPIO13為輸出
發表于 12-08 17:21
?3次下載
GPIO工作模式和寄存器
GPIO工作模式1、浮空輸入模式 GPIO_Mode_IN_FLOATING引腳狀態不確定,引腳懸空時,電平狀態是不確定的值,可以做KEY
發表于 12-08 17:21
?7次下載
配置STM32寄存器控制GPIO點亮LED
STM32點亮LED 寄存器方式IO簡介1、每個IO可以自由編程,但是IO口寄存器必須按照32位字被訪問。2、每個IO端口都有7個寄存器來控制。CRL 【0-7】端口配置
發表于 01-13 16:15
?4次下載
STM32F103寄存器配置相關學習 —— GPIO
1. GPIO相關寄存器1.1 配置寄存器(CRL、CRH)1.2 數據寄存器(IDR、ODR)1.3 位設置/清除寄存器(BSRR)1.4
發表于 01-17 09:33
?2次下載
【STM32】GPIO的相關配置寄存器、庫函數、位操作
STM32的每組GPIO口包括7個寄存器。也就是說,每個寄存器可以控制一組GPIO的16個GPIO口。這
發表于 02-10 10:24
?5次下載
詳解GPIO工作模式與寄存器2
評論