历史上的今天
返回首页

历史上的今天

今天是:2024年12月22日(星期日)

2020年12月22日 | STM32的GPIO的寄存器配置学习1

2020-12-22 来源:eefocus

本篇文章主要是学习以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 的时钟了(简单吧!)


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

推荐阅读

史海拾趣

ETEQ Microsystems Inc公司的发展小趣事

在电子行业的浪潮中,ETEQ Microsystems Inc于XXXX年应运而生,创始人带着对微型电子技术的深厚理解和远见,立志打造一家具有创新精神的芯片设计企业。初创期,公司面临资金短缺、人才匮乏和市场竞争激烈的挑战。然而,通过精心研发的几款高性能低功耗芯片,ETEQ Microsystems Inc迅速在市场上打开了局面,赢得了合作伙伴的认可。

安普康(AMPCOM)公司的发展小趣事

安普康(AMPCOM)自创立之初,就致力于将品牌推向国际市场。随着公司规模的扩大和产品线的丰富,安普康开始实施全球商标注册战略。从2011年首次申请安普康AMPCOM商标,到随后的几年内在泰国、日本、新加坡、老挝、澳大利亚等多个国家成功注册,安普康的品牌影响力逐渐扩大。这一过程中,公司不仅面临着不同国家法律法规的挑战,还需应对文化差异和市场需求的差异。然而,凭借专业的团队和精准的市场定位,安普康成功地将品牌推向了全球舞台。

FDK AMERICA公司的发展小趣事

在竞争激烈的电子市场中,FDK AMERICA公司始终坚持品质至上的原则。公司严格控制产品质量,从原材料采购到生产流程再到售后服务,每一个环节都力求做到精益求精。这种对品质的执着追求赢得了客户的信赖,也为公司树立了良好的品牌形象。

Eastman Kodak Company公司的发展小趣事

2012年1月,伊士曼柯达公司宣布申请破产保护。这一消息震惊了全球,也让人们不禁对这家百年老店的前景感到担忧。然而,在破产保护期间,柯达并没有放弃努力。公司积极寻求重组方案,通过出售非核心资产、削减成本等方式,逐步恢复了盈利能力。最终,在2013年5月,柯达成功退出了破产保护程序,开始了新的发展历程。

AAEON公司的发展小趣事

进入21世纪后,随着数码技术的迅速崛起,传统摄影市场遭受了巨大的冲击。面对这一挑战,伊士曼柯达公司开始尝试向数码领域转型。然而,由于公司在数码技术方面的积累相对较少,转型过程并不顺利。尽管如此,柯达仍然坚持创新,不断推出新的数码产品,以应对市场的变化。同时,公司还加强了与数码技术公司的合作,共同研发新产品,以提高市场竞争力。

GAIA Converter Inc公司的发展小趣事

随着全球化进程的加速,锋鸣电子(上海总部)于2015年启动了国际化战略。公司首先在东南亚地区设立生产基地,利用当地的成本优势扩大产能。随后,锋鸣电子积极参加国际展会,拓展海外市场,与多家国际知名企业建立了合作关系。通过国际化战略的实施,锋鸣电子不仅提升了品牌知名度,还实现了销售收入的快速增长。

问答坊 | AI 解惑

如何用软盘自动恢复D盘备份的VxWorks系统至C盘

复印机打印控制器使用的是VxWorks系统,机器配置如下: CPU:PⅢ 866MHz 硬盘:61G(C,D,E三分区) 内存:256M 软驱:1.44M 网卡:10M/100M 其它:1394接口卡 无显示器及输入设备。 现C盘系统损坏,无法启动,需恢复D盘备份系统至C盘: ...…

查看全部问答>

arm中断系统的疑惑

arm中断疑惑: 当中断产生时,通过中断向量表        b   ResetHandler       b   HandlerUndef    ;handler for Undefined mode     b   Handler ...…

查看全部问答>

关于UCLIBC支持locale support的问题?

我装了LIBXML2,用ARM-ELF-GCC编译程序时提示错误: attempted to include iconv.h when uclibc built local support 编译用的命令如下: arm-elf-gcc cmld.c -o cmld -lm -I /boot/xml/include/libxml2 -L /boot/xml/lib -l ...…

查看全部问答>

[高分]window mobile5 中操作通讯录

用vs2005(C++)写一个程序,在mobile5中能把数据按通讯录的格式导入数据到通讯录里。 请教各位大虾,如何实现,有哪些函数或方法…

查看全部问答>

关于usb固件编程,定义描述符时的问题

最近小弟我在研究usb固件编程,有一个疑惑,就是定义usb configuration descriptor的时候,其中的wTotalLength字段关于配置描述符的总长度时,为什么要进行高低字节交换。…

查看全部问答>

帮忙啦!谁有tornado2.2.1的补丁

谁有这两个补丁 make3_80.gvk_patches make3_80.tor2_2.new_dependency_rules 需要用。 谢谢! 原文地址:http://www.dre.vanderbilt.edu/~schmidt/DOC_ROOT/ACE/ACE-INSTALL.html#VxWorks/NT NOTE:The make (version 3.74) that is provide ...…

查看全部问答>

统计下SHT21焊接情况?

大家谈谈SHT21应该怎么焊接?https://bbs.eeworld.com.cn/thread-153506-1-1.html看来这个芯片焊接很需要功夫哦!…

查看全部问答>

lpc1343的开发板哪里能买到?

就是nxp网站上的那种,有卖的吗?现在做项目要用,已经错过申请板子的时间了 哪位有不用的话可以考虑转给我吗?价钱可以商量…

查看全部问答>

如何用msp430实现wifi 服务器

以前用ARM实现了wifi的发射,作为服务器使用。现在想移植到msp430上,本人对430一点不了解,请有经验的前辈给指明方法。谢谢!…

查看全部问答>

基于单片机的带有SD卡的MP3

想做一个基于单片机的带有SD卡的MP3,希望高手能够给些资料,谢谢!面临毕业,希望能够毕业前做些实事!…

查看全部问答>