0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解GPIO工作模式与寄存器2

jf_78858299 来源:百问网 作者:韦东山 2023-01-30 15:01 次阅读

2.3 模拟输入模式

图片

在这里插入图片描述

  1. 输出驱动器关闭
  2. 施密特触发器关闭
  3. 弱上拉和下拉电阻被禁止
  4. 输入数据寄存器的值为0(处于高阻抗)
  5. 功耗最小

因为模拟信号经过施密特触发器后只有0/1两种状态,因此信号源输入在施密特触发器前。类似地,当GPIO 引脚用于DAC 作为模拟电压输出通道时,DAC 的模拟信号输出就不经过双MOS 管结构,模拟信号直接输出到引脚。

模拟状态与模拟外设复用引脚 区别

图片

  • 模拟状态:表示引脚功能选择为模拟模式,但不作为任何片内模拟外设(ADC)的复用引脚,只是为了减少系统功耗。
  • 模拟外设复用引脚:表示引脚作为片内模拟外设的复用引脚,用于完成相应功能操作,如ADC信号采集。

2.4 复用模式

1675061794(1).png

在这里插入图片描述

  1. 输出可配置为推挽或者开漏模式,内置外设的信号驱动输出驱动器
  2. 施密特触发器打开
  3. 弱上拉和下拉电阻被禁止
  4. 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器
  5. 在开漏模式时,对输入数据寄存器的读访问可得到I/O状态;在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的
  • 复用推挽输出

    1675061764(1).png

  • 复用开漏输出1675061740(1).png


  • 对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动。
  • 对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
  • 对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。

如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。

如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。


注意

  • STM32复位后,IO端口处于浮空输入状态(CNFx[1:0]=01b,MODEx[1:0]=00b);JTAG引脚复位以后,处于上拉或者下拉状态。
  • 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口绝对不能当作电流源(如驱动LED)。(参考STM32中文手册4.1.2)
  • 一般上下拉电阻的阻值都在30-50K之间。这样可以增强MCU的抗干扰能力。
  • 芯片内部上/下拉电阻不影响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-黄灯),系统时钟启动文件跳转自动配置。

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5037

    浏览量

    117764
  • MOS
    MOS
    +关注

    关注

    30

    文章

    1129

    浏览量

    91480
  • GPIO
    +关注

    关注

    16

    文章

    1137

    浏览量

    50596
收藏 人收藏

    评论

    相关推荐

    详解ARM处理寄存器与运行模式

    指示ARM执行T=1 指示Thumb执行c. 模式控制位M4、M3、M2、Ml和M0(M[4:0])是模式位,决定处理工作
    发表于 11-27 19:32

    编程寄存器相关位详解

    目录一,涉及编程寄存器相关位详解二,源代码及解析:三,时钟设置的框图步骤分解stm32上电后默认使用的是内部8MHZ的HSI,速度比较慢,所以上电后要首先进行时钟的配置,让CPU工作在72MHZ
    发表于 08-12 06:41

    GPIO相关寄存器配置

    1. GPIO相关寄存器1.1 配置寄存器(CRL、CRH)1.2 数据寄存器(IDR、ODR)1.3 位设置/清除寄存器(BSRR)1.4
    发表于 08-17 06:10

    GPIO寄存器详解

    STM32F4工程--IO口--GPIO寄存器详解 ----芯片:STM32F429IGT6----参考资料:正点原子视频一、基础知识1、每组IO口包含10个寄存器,如果配置一个IO口
    发表于 01-18 06:53

    DSP2812寄存器详解

    DSP2812寄存器详解DSP2812寄存器详DSP2812寄存器详解
    发表于 01-08 14:17 8次下载

    STM32 GPIO寄存器ODR BSRR BRR

    STM32 GPIO寄存器ODR BSRR BRR详细介绍
    发表于 07-29 10:27 2次下载

    51寄存器的所有寄存器名称,(包括寄存器每一位的作用及用法)资源详解

    51寄存器的所有寄存器名称,(包括寄存器每一位的作用及用法)资源详解
    发表于 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单片机GPIO寄存器的功能解析

    对于GPIO端口,每个端口有16个引脚,每个引脚的模式寄存器的四个位控制,每四位又分为两位控制引脚配置(CNFy[1:0]),两位控制引脚的模式及最高速度(MODEy[1:0]),其
    发表于 12-04 14:54 1.2w次阅读
    STM32单片机<b class='flag-5'>GPIO</b><b class='flag-5'>寄存器</b>的功能解析

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

    文章目录一、STM32F103系列芯片的地址映射和寄存器映射原理1.寄存器2.地址映射和寄存器映射原理二、GPIO端口的初始化1.GPIO
    发表于 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口的状态(1),BSRRH配置复位状态(0)。每组GPIO端口的寄存器包括:4个32位配置
    发表于 12-08 17:06 5次下载
    <b class='flag-5'>GPIO</b><b class='flag-5'>寄存器</b>

    STM32寄存器点灯

    配置寄存器使STM32最小系统板上的LED灯点亮根据原理图,要使D2点亮,需要将PC13拉低,分为以下步骤:使能GPIO的时钟配置GPIO13为输出模式配置
    发表于 12-08 17:21 3次下载
    STM32<b class='flag-5'>寄存器</b>点灯

    GPIO工作模式寄存器

    GPIO工作模式1、浮空输入模式 GPIO_Mode_IN_FLOATING引脚状态不确定,引脚悬空时,电平状态是不确定的值,可以做KEY
    发表于 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 数据寄存器(IDR、ODR)1.3 位设置/清除寄存器(BSRR)1.4
    发表于 01-17 09:33 2次下载
    STM32F103<b class='flag-5'>寄存器</b>配置相关学习 —— <b class='flag-5'>GPIO</b>

    【STM32】GPIO的相关配置寄存器、库函数、位操作

    STM32的每组GPIO口包括7个寄存器。也就是说,每个寄存器可以控制一组GPIO的16个GPIO口。这
    发表于 02-10 10:24 5次下载
    【STM32】<b class='flag-5'>GPIO</b>的相关配置<b class='flag-5'>寄存器</b>、库函数、位操作

    详解GPIO工作模式寄存器1

    * **电源符号含义** `VDD`:D=device 表示芯片内部工作电源(一般VDD
    的头像 发表于 01-30 15:00 2254次阅读
    <b class='flag-5'>详解</b><b class='flag-5'>GPIO</b><b class='flag-5'>工作</b><b class='flag-5'>模式</b>与<b class='flag-5'>寄存器</b>1