0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

詳解GPIO工作模式與寄存器2

jf_78858299 ? 來源:百問網(wǎng) ? 作者:韋東山 ? 2023-01-30 15:01 ? 次閱讀

2.3 模擬輸入模式

圖片

在這里插入圖片描述

  1. 輸出驅(qū)動器關閉
  2. 施密特觸發(fā)器關閉
  3. 弱上拉和下拉電阻被禁止
  4. 輸入數(shù)據(jù)寄存器的值為0(處于高阻抗)
  5. 功耗最小

因為模擬信號經(jīng)過施密特觸發(fā)器后只有0/1兩種狀態(tài),因此信號源輸入在施密特觸發(fā)器前。類似地,當GPIO 引腳用于DAC 作為模擬電壓輸出通道時,DAC 的模擬信號輸出就不經(jīng)過雙MOS 管結構,模擬信號直接輸出到引腳。

模擬狀態(tài)與模擬外設復用引腳 區(qū)別

圖片

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

2.4 復用模式

1675061794(1).png

在這里插入圖片描述

  1. 輸出可配置為推挽或者開漏模式,內(nèi)置外設的信號驅(qū)動輸出驅(qū)動器
  2. 施密特觸發(fā)器打開
  3. 弱上拉和下拉電阻被禁止
  4. 在每個APB2時鐘周期,出現(xiàn)在I/O腳上的數(shù)據(jù)被采樣到輸入數(shù)據(jù)寄存器
  5. 在開漏模式時,對輸入數(shù)據(jù)寄存器的讀訪問可得到I/O狀態(tài);在推挽式模式時,對輸出數(shù)據(jù)寄存器的讀訪問得到最后一次寫的
  • 復用推挽輸出

    1675061764(1).png

  • 復用開漏輸出1675061740(1).png


  • 對于復用的輸入功能,端口必須配置成輸入模式(浮空、上拉或下拉)且輸入引腳必須由外部驅(qū)動。
  • 對于復用輸出功能,端口必須配置成復用功能輸出模式(推挽或開漏)。
  • 對于雙向復用功能,端口位必須配置復用功能輸出模式(推挽或開漏)。

如果把端口配置成復用輸出功能,則引腳和輸出寄存器斷開,并和片上外設的輸出信號連接。

如果軟件把一個GPIO腳配置成復用輸出功能,但是外設沒有被激活,它的輸出將不確定。


注意

  • STM32復位后,IO端口處于浮空輸入狀態(tài)(CNFx[1:0]=01b,MODEx[1:0]=00b);JTAG引腳復位以后,處于上拉或者下拉狀態(tài)。
  • stm32具有GPIO鎖定機制,即鎖定GPIO配置,下次復位前不能再修改端口位的配置。
  • 所有IO端口都具有外部中斷能力,端口必須配置成輸入模式,才能使用外部中斷功能。
  • 當LSE振蕩器關閉時,OSC32_IN/OSC32_OUT可以用作通用GPIO PC14/PC15。當進入待機模式或者備份域由Vbat供電時,不能使用PC14/PC15的GPIO口功能。
  • PC13/PC14/PC15只能用于2MHz的輸出模式(LSE關閉,PC13關閉入侵檢測),最多只能帶30pF的負載,而且這些I/O口絕對不能當作電流源(如驅(qū)動LED)。(參考STM32中文手冊4.1.2)
  • 一般上下拉電阻的阻值都在30-50K之間。這樣可以增強MCU的抗干擾能力。
  • 芯片內(nèi)部上/下拉電阻不影響GPIO輸出模式。

3 GPIO模塊寄存器

注意必須以字(32位)的方式操作GPIO外設寄存器!

端口模式與輸出速度配置:1675061677(1).png

(//file.elecfans.com/web2/M00/8C/10/pYYBAGPXZCGACOv3AALmvH1WBmE220.jpg)

GPIO寄存器地址映像和復位值:1675061576(1).png

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-黃燈),系統(tǒng)時鐘啟動文件跳轉自動配置。

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5301

    瀏覽量

    119865
  • MOS
    MOS
    +關注

    關注

    31

    文章

    1242

    瀏覽量

    93368
  • GPIO
    +關注

    關注

    16

    文章

    1189

    瀏覽量

    51850
收藏 人收藏

    評論

    相關推薦

    基于DWC2的USB驅(qū)動開發(fā)-發(fā)送相關的寄存器DMA寄存器詳解

    本文轉自公眾號,歡迎關注 基于DWC2的USB驅(qū)動開發(fā)-發(fā)送相關的寄存器DMA寄存器詳解 (qq.com) 前言 如下寄存器DIEPxxx,
    的頭像 發(fā)表于 07-16 16:42 ?1558次閱讀
    基于DWC<b class='flag-5'>2</b>的USB驅(qū)動開發(fā)-發(fā)送相關的<b class='flag-5'>寄存器</b>DMA<b class='flag-5'>寄存器</b><b class='flag-5'>詳解</b>

    GPIO寄存器詳解

    STM32F4工程--IO口--GPIO寄存器詳解 ----芯片:STM32F429IGT6----參考資料:正點原子視頻一、基礎知識1、每組IO口包含10個寄存器,如果配置一個IO口
    發(fā)表于 01-18 06:53

    DSP2812寄存器詳解

    DSP2812寄存器詳解DSP2812寄存器詳DSP2812寄存器詳解
    發(fā)表于 01-08 14:17 ?8次下載

    STM32 GPIO寄存器ODR BSRR BRR

    STM32 GPIO寄存器ODR BSRR BRR詳細介紹
    發(fā)表于 07-29 10:27 ?2次下載

    51寄存器的所有寄存器名稱,(包括寄存器每一位的作用及用法)資源詳解

    51寄存器的所有寄存器名稱,(包括寄存器每一位的作用及用法)資源詳解
    發(fā)表于 10-16 13:04 ?14次下載
    51<b class='flag-5'>寄存器</b>的所有<b class='flag-5'>寄存器</b>名稱,(包括<b class='flag-5'>寄存器</b>每一位的作用及用法)資源<b class='flag-5'>詳解</b>

    STM32使用BSRR和BRR寄存器快速操作GPIO端口

    STM32的每個GPIO端口都有兩個特別的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器,通過這兩個寄存器可以直接對對應的GPIOx端口置1或置0。 GPIOx_BSRR的高1
    發(fā)表于 11-26 11:50 ?1次下載

    移位寄存器怎么用_如何使用移位寄存器_移位寄存器的用途

    移位寄存器是一個具有移位功能的寄存器,是指寄存器中所存的代碼能夠在移位脈沖的作用下依次左移或右移。本文主要介紹了移位寄存器的用途以及移位寄存器
    發(fā)表于 12-22 15:49 ?2w次閱讀

    基于stm32的GPIO寄存器學習解析

    GPIO即通用輸入/輸出 (General Purpose Input Output) 包括: 兩個32位的配置寄存器 GPIOx->CRL,GPIOx->CRH 兩個32位的數(shù)據(jù)
    的頭像 發(fā)表于 01-11 09:03 ?1.3w次閱讀
    基于stm32的<b class='flag-5'>GPIO</b><b class='flag-5'>寄存器</b>學習解析

    【嵌入式07】寄存器映射原理詳解GPIO端口的初始化設置步驟

    本文主要介紹STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化設置三步驟(時鐘配置、輸入輸出模式設置、最大速率設置)。
    發(fā)表于 12-04 12:06 ?11次下載
    【嵌入式07】<b class='flag-5'>寄存器</b>映射原理<b class='flag-5'>詳解</b>,<b class='flag-5'>GPIO</b>端口的初始化設置步驟

    STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化

    文章目錄一、STM32F103系列芯片的地址映射和寄存器映射原理1.寄存器2.地址映射和寄存器映射原理二、GPIO端口的初始化1.
    發(fā)表于 12-05 14:21 ?10次下載
    STM32F103系列芯片的地址映射和<b class='flag-5'>寄存器</b>映射原理,<b class='flag-5'>GPIO</b>端口的初始化

    GPIO寄存器

    ,一般高16位保留BSRR寄存器32位分為低16位BSRRL和高16位BSRRH,BSRRL配置一組IO口的16個IO口的狀態(tài)(1),BSRRH配置復位狀態(tài)(0)。每組GPIO端口的寄存器包括:4個32位配置
    發(fā)表于 12-08 17:06 ?5次下載
    <b class='flag-5'>GPIO</b><b class='flag-5'>寄存器</b>

    STM32寄存器點燈

    配置寄存器使STM32最小系統(tǒng)板上的LED燈點亮根據(jù)原理圖,要使D2點亮,需要將PC13拉低,分為以下步驟:使能GPIO的時鐘配置GPIO13為輸出
    發(fā)表于 12-08 17:21 ?3次下載
    STM32<b class='flag-5'>寄存器</b>點燈

    GPIO工作模式寄存器

    GPIO工作模式1、浮空輸入模式 GPIO_Mode_IN_FLOATING引腳狀態(tài)不確定,引腳懸空時,電平狀態(tài)是不確定的值,可以做KEY
    發(fā)表于 12-08 17:21 ?7次下載
    <b class='flag-5'>GPIO</b><b class='flag-5'>工作</b><b class='flag-5'>模式</b>和<b class='flag-5'>寄存器</b>

    STM32F103寄存器配置相關學習 —— GPIO

    1. GPIO相關寄存器1.1 配置寄存器(CRL、CRH)1.2 數(shù)據(jù)寄存器(IDR、ODR)1.3 位設置/清除寄存器(BSRR)1.4
    發(fā)表于 01-17 09:33 ?2次下載
    STM32F103<b class='flag-5'>寄存器</b>配置相關學習 —— <b class='flag-5'>GPIO</b>

    【STM32】GPIO的相關配置寄存器、庫函數(shù)、位操作

    STM32的每組GPIO口包括7個寄存器。也就是說,每個寄存器可以控制一組GPIO的16個GPIO口。這
    發(fā)表于 02-10 10:24 ?5次下載
    【STM32】<b class='flag-5'>GPIO</b>的相關配置<b class='flag-5'>寄存器</b>、庫函數(shù)、位操作