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文章
5619浏览量
130400 -
MOS
+关注
关注
32文章
1757浏览量
101229 -
GPIO
+关注
关注
16文章
1333浏览量
56445
发布评论请先 登录
相关推荐
热点推荐
基于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次下载
移位寄存器怎么用_如何使用移位寄存器_移位寄存器的用途
移位寄存器是一个具有移位功能的寄存器,是指寄存器中所存的代码能够在移位脉冲的作用下依次左移或右移。本文主要介绍了移位寄存器的用途以及移位寄存器
发表于 12-22 15:49
•2.1w次阅读
基于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次下载
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


评论