STM32的GPIO的寄存器配置学习1

发布者:luanzgc最新更新时间:2020-12-22 来源: eefocus关键字:STM32  GPIO  寄存器配置 手机看文章 扫描二维码
随时随地手机看文章

本篇文章主要是学习以M3内核的STM32的GPIO的寄存器的配置,为什么要学习寄存器,而不利用库函数呢?我只能说为了让学的知识更加牢固吧!当然,你可以直接去利用库函数,但是如果你能认真读完本篇博客,你会对知识豁然开朗!加油吧!


STM32 的每个 IO 端口都有 7 个寄存器来控制。他们分别是:配置模式的 2 个 32 位的端口配置寄存器 CRL 和 CRH;2 个 32 位的数据寄存器 IDR 和 ODR;1 个 32 位的置位/复位寄存器BSRR;一个 16 位的复位寄存器 BRR;1 个 32 位的锁存寄存器 LCKR;这里我们仅介绍常用的几个寄存器,我们常用的 IO 端口寄存器只有 4 个:CRL、CRH、IDR、ODR 。


可能罗列了这么多的寄存器,小白可能会一头蒙(心想,用的时候再找呗,我想说,那还不如直接记住,对吧,哈哈哈)接下来我会每一个介绍一下,然后会有一个程序说明,仔细看完文章吧!


一、CRL、CRH

STM32的每个 IO 口都可以自由编程,但 IO 口寄存器必须要按 32 位字被编辑被访问(因为系统本身是32位),CRL 和 CRH 控制着每个 IO 口的模式及输出速率,只不过CRL是控制低8位的GPIO接口(GPIO0至GPIO7);CRH是控制高8位的GPIO接口(GPIO8至GPIO15)。而配置一个CRL或CRH都需要4位(MODE+CNF共4位)控制一个IO口。

下面以 CRL (CRH同样)进行描述解析:(可以跳过看图,下面可以根据所写,在回过来看图)

注意:图中共32位(是连续的呀,中间不是断的),MODE+CNF共4位用来控制一个IO口,可以配置GPIO0至GPIO7的IO口,


直接上例子,来说明问题:咱们来控制一个 PB5 为推挽输出(5是低7位中数呀,这时就需要使用CRL了),这时候需要看看上表中的信息了,从表中可以,如果想配置B系列的管脚5口为推挽输出,只需要将CNF5设置为00,将MODE5设置为11(此时设置的速率为最大,可以自己去选择)就可以了(简单吧,哈哈),那怎么写程序呢?首先明确的是要使用16进制写,此时的情况就是:00 00 00 00 00 11 00 00 00 00 00 00 00 00 00 00(注意这个是从高位到低写的),16进制也就是:0X00300000。


PB5管脚配置程序如下:

GPIOB->CRL&=0XFF0FFFFF;//清掉这个位原来的设置,同时也不影响其他位的设置

GPIOB->CRL|=0X00300000;//清掉完原来的设置,此时就可以设置PB5为推挽输出

同样,如果想配置PB8管脚为推挽输出呢?(8是高8位中的数呀,这时就需要使用CRH了),程序如下:

 GPIOB->CRH&=0XFFFFFFF0;//清掉这个位原来的设置,同时也不影响其他位的设置

GPIOB->CRH|=0X00000003;//清掉完原来的设置,此时就可以设置PB8为推挽输出

简单吧,(如果还不懂,就从头再看一遍)


二、IDR、ODR

IDR 是一个端口输入数据寄存器,只用了低 16 位。该寄存器为只读寄存器,并且只能以16 位的形式读出,你如果要想知道某个 IO 口的状态,你只要读这个寄存器,再看某个位的状态就可以了,使用起来是还是比较简单的。

需要注意的是IDR这是个只读寄存器,是不能给它赋值的。举例的程序为:

GPIOA->IDR & 0x0001 //即为 PA1的电平状态,IDR寄存器的16位对应了该GPIO的P0-P15

ODR 是一个端口输出数据寄存器,也只用了低 16 位。该寄存器为可读写,从该寄存器读出来的数据可以用于判断当前 IO 口的输出状态。而向该寄存器写数据,则可以控制某个 IO 口的输出电平。

举例的程序为:

GPIOA->ODR =1<<13 //即为 PA13的电平状态,IDR寄存器的16位对应了该GPIO的P0-P15

GPIOA->ODR =1<<5 //即为 PA5的电平状态,IDR寄存器的16位对应了该GPIO的P0-P15

没错,你没有看错,这句程序按照格式是可以罗列的。

如果IDR、ODR想调用,举例就是如果想读出PA1的状态,赋值给PA13,程序如下(需要借助一个变量:先定义一个变量unsigned short temp):

temp = GPIOA->IDR & 0x0001;

GPIOA->ODR = temp<<13;
如果看不懂,再看一下上面的内容(哈哈哈)         

下面我通过书上找的控制GPIO的PB5和PE5的LED灯使其交替闪烁为例,设置步骤:
1. 使能相关时钟
2. 设置相应的 IO 口为输入或输出
3. 设置输入输出的类型 设置输出的速度
4. 设置上拉下拉寄存器
5. 通过复位置位寄存器和输入输出数据寄存器进行操作。


程序如下: (led.c)

#include "led.h"

//初始化 PB5 和 PE5 为输出口.并使能这两个口的时钟

//LED IO 初始化

void LED_Init(void)

{

   RCC->APB2ENR|=1<<3; //使能 GPIOB 时钟  APB2ENR是APB2总线上的外设时钟使能寄存器

   RCC->APB2ENR|=1<<6; //使能 GPIOE 时钟

   GPIOB->CRL&=0XFF0FFFFF;

   GPIOB->CRL|=0X00300000;//PB.5 推挽输出

   GPIOB->ODR|=1<<5; //PB.5 输出高

   GPIOE->CRL&=0XFF0FFFFF;

   GPIOE->CRL|=0X00300000;//PE.5 推挽输出

   GPIOE->ODR|=1<<5; //PE.5 输出高

}

程序如下: (led.h)


#ifndef __LED_H

#define __LED_H

#include "sys.h"

//LED 端口定义 为了简化程序,设置宏定义

#define LED0 PBout(5) 

#define LED1 PEout(5) 

void LED_Init(void); //初始化

#endif

主程序如下(main.c)


#include "sys.h"

#include "delay.h"

#include "led.h"

 

int main(void)

 {

    Stm32_Clock_Init(9); //系统时钟设置

    delay_init(72); //延时初始化

    LED_Init(); //初始化与 LED 连接的硬件接口

    while(1)

        {

           LED0=0;

           LED1=1;

           delay_ms(300);

           LED0=1;

           LED1=0;

           delay_ms(300);

        }

 }

附:程序中的APB2ENR 是 APB2 总线上的外设时钟使能寄存器:

使能的GPIOB 和GPIOE 的时钟使能位,分别在 bit3 和 bit6,只要将这两位置 1 就可以使能 GPIOB 和GPIOE 的时钟了(简单吧!)


好了,就介绍到这,其实主要是介绍学习的方法,如何去分析,学会后,就可以很快的去接触一款新的控制器芯片。本专栏为一列,请关注。

关键字:STM32  GPIO  寄存器配置 引用地址:STM32的GPIO的寄存器配置学习1

上一篇:STM32L1xx的库函数有个Bug(stm32l1xx_gpio.c)
下一篇:STM32个人学习笔记-第二集(F4GPIO寄存器介绍)

推荐阅读最新更新时间:2024-11-03 17:29

解决STM32每次下载程序都需要断电
Stm32的启动模式由BOOT0和BOOT1进行配置,在下载模式下我们需要讲BOOT0配置成0电平,但往往忽略了BOOT1。 一般开发板厂家都会把BOOT0和BOOT0都做成可配置的。 问题就是在下载程序的时候只在BOOT0上接了跳线帽讲其接地,但是BOOT1确由其悬空着,因此每次下载都必须重新上电才能被下载器认可,后来将BOOT1用跳线帽接到高电平后,问题成功解决,每次下载前只需要按下复位按键就可以了。
[单片机]
解决<font color='red'>STM32</font>每次下载程序都需要断电
STM32+IAP方案 实现网络升级应用固件
关注了这个概念有些日子了,这段时间总算有机会实战==网络升级应用固件,这里记录下遇到的问题,及解决方案。 原理与网上流传的串口作为传输手段 一致;不同之处,无非我这里使用了网络设备传输。==(lwip)TFTP客户端的应用. 参考: IAR环境下STM32+IAP方案的实现 STM32浅谈之IAP.pdf 基于IAP和Keil MDK的远程升级设计 keil MDK中如何生成*.bin格式的文件 概况: 什么是IAP,为什么要IAP 可实现的原理 实现过程 细节及实现 以上基本都可以从【IAR环境下STM32+IAP方案的实现】中找到答案。这里只是贴图,醒目: IAP框架布局: STM32F103ZET6的
[单片机]
STM32+IAP方案 实现网络升级应用固件
STM32 学习笔记——GPIO口控制
在配置STM32外设的时候,任何都要先使能该外设的时钟!PB2ENR 是 APB2总线上的外设时钟使能寄存器 我们要使能的PORTA和PORTD的时钟使能位,分别在的时钟使能位,分别在bit2和bit5,只要将这两位置1就可以使能PORTA和PORTD了 STM32的每个IO端口都有7个寄存器来控制。 他们分别是:配置模式的2个32位的端口配置寄存器 CRL 和 CRH;2个32位的数据寄存器IDR 和 ODR ;1个32位的置 复位寄存器 BSRR ;一个 16 位的复寄存器 位的复寄存器 BRR ;1个 32 位的 锁存 寄存器 LCKR ; 这里我们仅介绍常用 的 几个寄存器,我们常用的 IO 端口寄存器只有 4
[单片机]
STM32串口接收不定长数据原理与源程序
今天说一下STM32单片机的接收不定长度字节数据的方法。由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。 IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。 如何判断一帧数据结束,就是我们今天讨论的问题。因为很多项目中都要用到这个,因为只有接收到一帧数据以后,你才可以判断这次收了几个字节和每个字节的内容是否符合协议要求。 看了前面IDLE中断的定义,你就会明白了,一帧数据
[单片机]
<font color='red'>STM32</font>串口接收不定长数据原理与源程序
STM32 ADC应用中信号源特性对转换结果的影响
STM32家族中的所有芯片都内置了逐次逼近寄存器型ADC模块.内部大致框架如下: 每次ADC转换先进行采样保持,然后分多步执行比较输出,步数等于ADC的位数,每个ADC时钟产生一个数据位。说到这里,用过STM32 ADC的人是不是想到了参考手册中关于12位ADC转换时间的公式: ST官方就如何保障或改善ADC精度写了一篇应用笔记AN2834。该应用笔记旨在帮助用户了解ADC误差的产生以及如何提高ADC的精度。主要介绍了与ADC设计的相关内容,比如外部硬件设计参数,不同类型的ADC误差来源分析等,并提出了一些如何减小误差的设计上建议。 这里我摘取部分内容,结合个人的理解加以整理与大家分享。更多细节可以去www.s
[单片机]
<font color='red'>STM32</font> ADC应用中信号源特性对转换结果的影响
STM32入门学习之GPIO(STM32F030F4P6基于CooCox IDE)(一)
1、CooCox IDE当前最新版本为V2,不过个人看网上的示例大都是基于旧版本的,个人也试过新版本,发现一些操作还不习惯,在此也还是介绍旧版本1.7.8。 http://www.coocox.org/software/coide.php 2、运行CoIDE,点击菜单栏的Project——New Project,填写项目名称HelloGPIO 3、选择Chip 4、选择ST——STM32F03x——STM32F030F4P6 5、系统将弹出 Repository,这里可直接选择程序需要的库,勾选GPIO,系统将自动勾选RCC、CMSIS BOOT、M0 Cmsis Core等,并直接生成对应 6、打开mai
[单片机]
<font color='red'>STM32</font>入门学习之<font color='red'>GPIO</font>(STM32F030F4P6基于CooCox IDE)(一)
基于STM32的LF RFID阅读器研究
射频识别技术(Radio Frequency Identification,RFID)是从八十年代起走向成熟的一项自动识别技术。RFID利用射频方式进行非接触双向通信,以达到识别目的并交换数据,主要通过空间耦合(交变磁场或电磁场)实现无接触信息传递并通过所传递的信息达到识别目的。 RFID技术在近年取得了长足的发展,目前已广泛应用的频段分布在LF、HF、UHF和徽波频段,各频段的RFID系统均有各自的优点和相应的应用范围。对于LF频段的RFID系统而言,最明显的优点在于拥有很好的穿透性能,如可穿透液体物质,建筑物,人体等,且各种动物体细胞和各种气体分子对LF频段的能量吸收很小。 可见LF RFID系统可以在需要良好穿透性
[单片机]
基于<font color='red'>STM32</font>的LF RFID阅读器研究
STM32的时钟系统
STM32(CORETEX-M3)有5中时钟源:HSI、HSE、LSI、LSE、PLL (1)HSI是高速内部时钟,又叫RC振荡器,晶振频率为8MHZ,精确度不高。 (2)HSE是高速外部时钟,可接石英、陶瓷谐振器;也可接如外部时钟信号,范围为4-16MHZ。 (3)LSI是低速内部时钟,RC振荡器,频率为40KHZ,提供低功耗时钟。 (4)LSE是低速外部时钟,外接频率为32.768KHZ石英晶体。 PLL为锁相环倍频输出,其时钟输入源可为HSI、HSE、HSE/2。倍频可选择2~16倍,最大不超过76MHZ。 sysclk的时钟来源:HSI、HSE、PLL 实时时钟 stm32的实时时钟是一个独立的定时器,这个定时器可以连
[单片机]
<font color='red'>STM32</font>的时钟系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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