stm32之GPIO寄存器学习

发布者:MysticGarden最新更新时间:2020-09-04 来源: eefocus关键字:stm32  GPIO  寄存器 手机看文章 扫描二维码
随时随地手机看文章

GPIO即通用输入/输出 (General Purpose Input Output)


包括:

两个32位的配置寄存器 GPIOx->CRL,GPIOx->CRH

两个32位的数据寄存器  GPIOx->IDR,GPIOx->ODR


 一个32位的 set/reset 寄存器  GPIOx->BSRR


一位16位的 reset 寄存器 GPIOx->BRR


一位32位的锁定寄存器  GPIOx->LCKR


端口的模式包括:


浮空输入(Input floating)—— 即没有上拉电阻下拉电阻,电压呈不确定性,一般用来做ADC输入用,这样可以减少上下拉电阻对结果的影响


上拉输入(Input pull-up)


下拉输入(Input-pull-down)

模拟输入(Analog)


开漏输出(Output open-drain)—— 输出逻辑0,则N-MOS激活; 输出逻辑1,端口处于高阻(电阻非常大,但不是断路,此外,P-MOS从未激活)


推挽输出(Output push-pull)—— 输出逻辑0,则N-MOS激活;输出逻辑1,P-MOS激活


复用功能推挽输出(Alternate function push-pull)——片内外设功能(I2C的SCL,SDA)


复用功能开漏输出(Alternate function open-drain)——片内外设功能(USART的TX1,SPI的MOSI,MISO,SCK,SS)


复用开漏输出、复用推挽输出:可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用) 


注意:I / O端口寄存器被访问为32位字(半字或字节存取是不允许的)


其余具体的可以查看stm3210x 手册


GPIOx->CRL 低位(0-7)端口配置寄存器(x = A~ G,该寄存器偏移地址为:0x00):


GPIOx->CRH 高位(8-15)端口配置寄存器(x = A~ G,该寄存器偏移地址为:0x04):


GPIOx->IDR  端口数据输入寄存器(x = A~ G,该寄存器偏移地址为:0x08):只读,可以读取IO口输入的值


GPIOx->ODR 端口数据输出寄存器(x = A~ G,该寄存器偏移地址为:0x0C):可写可读,可以设置IO口输出的值


GPIOx->BSRR 低位端口配置寄存器(x = A~ G,该寄存器偏移地址为:0x10):0-15位——为1时,可以使ODRx相应的位置1,为0时,无变化 。15-31位——为1时,可以使ODRx相应的位清零,为0时,无变化(注:当set和reset都设置了,则set优先级高)


GPIOx->BSR 低位端口配置寄存器(x = A~ G,该寄存器偏移地址为:0x14): 0-15位——为1时,可以使ODRx相应的位清零,为0时,无变化


注:用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险,也就不需要关闭中断


GPIOx->LCKR 端口配置锁定寄存器(x = A~ G,该寄存器偏移地址为:0x18):用来锁定对应位的端口位配置,当端口被锁定时,不再有可能修改它的值,直到系统复位。每一个锁都冻结相应的4位控制寄存器(CRL,CRH)


例子:


 1 /*

 2     根据高8位的输入电平来决定低8位的输出电平

 3 */

 4 

 5 GPIOA->CRL = 0x33333333;       //GPIOA.0-GPIO0.7 output push-pull 50MHz

 6 GPIOA->CRH = 0x44444444;       //GPIOA.8-GPIOA.15 input floating

 7 

 8 while(1)

 9 {

10     if(GPIOA->IDR & 0xff00)

11         GPIOA->ODR = (GPIOA->IDR >> 8) & 0xff;     

12     else

13         GPIOA->ODR = 0;

14 }


关键字:stm32  GPIO  寄存器 引用地址:stm32之GPIO寄存器学习

上一篇:STM32学习笔记之GPIO(二)
下一篇:stm32 gpio 工作方式及 mos管的认识

推荐阅读最新更新时间:2024-11-08 12:23

中容量STM32处理器启动代码的理解
今天要介绍一下STM32的启动代码,我这里使用的是中容量的STM32f103c8t6,对应的启动文件就是startup_stm32f10x_md.s,我这里启动文件版本是V3.6.2 不多说废话,先上我注释过的源码: /** ****************************************************************************** * @file startup_stm32f10x_md.s * @author MCD Application Team * @version V3.6.2 * @date 28-February-2013 * @b
[单片机]
STM32的硬件CRC32使用
最近用到STM32的CRC32模块,看一下官网的Lib,感觉用起来十分简单.但是,你会发现直接使用起来会出现,与很多在线CRC32的网站或者PC端的CRC32校验工具计算结果不一致! 简直就是无语...... 搜索了一下,在21IC的论坛上面有关使用STM32的CRC32的大讨论,不过是09年的帖子.主要定论是STM32的CRC32与目前大多数的PC端软件使用的一些数据顺序及方法不一致.这里主要推荐看一下这个链接: STM32内置CRC模块的使用 讨论的很火. 如果真如,那帖子说的那样.那么作为MCU这端,是有必要进行转换,要适应潮流.当然这里不是说ST不好. 按照帖子的结论: 1、每个字节的位序相反。stm32f是按32位,高位
[单片机]
<font color='red'>STM32</font>的硬件CRC32使用
STM32 USB 设备音频数据流
音频数据流的应用 音频数据流是没有任何压缩的音频数据,我们可以直接通过I2S传输到数字功放,也可以对这些数字音频进行处理,比如EQ音量控制、音质补偿等等。 典型应用举例 首先是PC,然后PC通过USB数据线连接到MCU,MCU再通过I2S输出到功放,最后连接到喇叭或耳机。 当然,还有GUI的部分显示可以控制,同时还可以通过麦克风把音频传输到PC进行刻录或保存。 同步问题 USB外设时钟、I2C外设时钟和外部功放时钟是同步的,因为它们共用一个时钟域,但不能同步PC的时钟域。 这些不同的时钟域将会造成音频的不同步,出现断音或丢失部分音频。 主要问题 1. USB的参考时钟(SOF)并不跟系统时钟同步,主要表现在三个方面
[单片机]
STM32 SPI介绍
SPI特征 3线全双工同步传输 带货不带第三根双向数据线的双线单工同步传输 8或16位传输帧格式选择 主或从操作 8个模式波特率分频系数 从模式频率 主模式和从模式的快速通信:最大SPI速度达到了18MHz 主模式和从模式均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变 可编程的时钟极性和相位 可编程的数据顺序 可触发中断的专用发送和接受标志 SPI总线忙状态标志 支持可靠通信的硬件CRC 通常SPI通过4个管脚与外部器件相连 MISO:主设备输入/从设备输出管脚,该管脚在从模式下发送数据,在主模式下接收数据 MOSI
[单片机]
<font color='red'>STM32</font> SPI介绍
STM32 ST-LINK 下载错误解决方法
芯片下载程序后出现,以下错误。 can not connect to target please select connect under reset mode from target settings menu and try again if you're trying to connect to a low frequency application please select a lower swd frequency mode from target settings menu 解决办法,我直接用镊子把复位脚拉低,单击STM32 ST-LINK Utility连接,1秒左右断开复位,就直接搞定!
[单片机]
<font color='red'>STM32</font> ST-LINK 下载错误解决方法
STM32固件库文件编程结构思想的理解
STM32的固件库文件功能相当完善,提供的API完全能满足一般的项目需要。刚从51单片机转到STM32的人,肯定会被这么庞大的东东吓到,51单片机上对IO口操作,简简单单几行代码就搞定了,一个C源文件就搞定。假如用STM32,对IO口进行简单操作,远不是几行代码能搞定的。(其实直接操作寄存器也能搞定)。 废话不多说,这就带你解剖固件库文件,包你看完之后豁然开朗。 首先,请看一段简单的C语言代码 #include stdio.h #define base 0x0012ff60 #define flash ((TestType *)base) typedef struct { int i; in
[单片机]
经典_STM32_ADC多通道采样的例子
STM32 ADC多通道转换 描述:用ADC连续采集11路模拟信号,并由DMA传输到内存。ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ。在每次转换结束后,由DMA循环将转换的数据传输到内存中。ADC可以连续采集N次求平均值。最后通过串口传输出最后转换的结果。 程序如下: #i nclude stm32f10x.h //这个头文件包括STM32F10x所有外围寄存器、位、内存映射的定义 #i nclude eval.h //头文件(包括串口、按键、LED的函数声明) #i nclude SysTickDelay.h #i nclude UART_INTERFACE.h #i nclude stdio.h #def
[单片机]
stm32 mmc卡扫描指定文件夹下的所有文件 串口输出(文件名长度有限制)
硬件环境:神州一号开发板 软件环境:mdk 1、sd卡初始化 2、f_mount 3、扫描函数如下: #define _USE_LFN 0 FRESULT scan_files (char* path) { FRESULT res; FILINFO fno; DIR dir; int i; char *fn; #if _USE_LFN static char lfn ; fno.lfname = lfn; fno.lfsize = sizeof(lfn); #endif res = f_opendir(&dir, path); if (res == FR_OK) { i = strl
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved