历史上的今天
返回首页

历史上的今天

今天是:2024年09月25日(星期三)

正在发生

2019年09月25日 | 物联网之STM32开发二(GPIO口操作)

2019-09-25 来源:eefocus

STM32—GPIO操作(基于STM32F051开发板)

内容概述:

GPIO的基本概念及寄存器介绍


照亮电子世界的那盏灯——LED寄存器版


照亮电子世界的那盏灯——LED库函数版


初识人机交互——按键


GPIO的基本概念及寄存器介绍:

内容概述:


GPIO接口简介


GPIO功能复用


GPIO寄存器介绍


GPIO接口简介:


通用输入输出接口GPIO是嵌入式系统、单片机开发过程中最常用的接口,用户可以通过编程灵活的对接口进行控制,实现对电路板上LED、数码管、按键等常用设备控制驱动,也可以作为串口的数据收发管脚,或AD的接口等复用功能使用。因此其作用和功能是非常重要的。


GPIO功能复用:《 STM32F0数据手册》可以方便查看(P29-P30)


手册下载链接:https://pan.baidu.com/s/1FTYOR_MuwWyWnZSVDXoPzg 密码:mg63

GPIO寄存器介绍:


STM32F051-GPIO常用寄存器:(下文会具体介绍)


    4个32位配置寄存器 


        GPIOx_MODER(端口模式寄存器),  GPIOx_OTYPER(端口输出类型寄存器),  GPIOx_OSPEEDR(输出速度寄存器),    GPIOx_PUPDR(上拉 / 下拉寄存器)


    2个32位数据寄存器


        GPIOx_IDR(输入数据寄存器) 、GPIOx_ODR(输出数据寄存器)


    1 个32 位置位 / 复位寄存器


        GPIOx_BSRR(置位 / 复位寄存器)


    2 个 32 位复用功能配置寄存器


        GPIOx_AFRH (复用功能高位寄存器)、GPIOx_AFRL(复用功能低位寄存器)


注:每一组GPIO端口都有一套上述的寄存器去配置它自己的功能


GPIO寄存器MODER(端口模式寄存器):

                                              

GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..D,F)    


偏移地址: 0x00    


复位值:  


●  0x2800 0000 端口 A  


●  0x0000 0000 其他口


GPIO寄存器OTYPER(端口输出类型寄存器):

                                 

GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A..D,F)  


偏移地址: 0x04  


复位值: 0x0000 0000


GPIO工作原理框图:

GPIO寄存器OSPEEDR(输出速度寄存器):

                                                 

GPIO 口输出速度寄存器 (GPIOx_OSPEEDR) (x = A..D,F)      


偏移地址: 0x08      


复位值: 0x0000 0000


GPIO寄存器PUPDR(上拉 / 下拉寄存器):

                                                  

GPIO 口上拉 / 下拉寄存器 (GPIOx_PUPDR) (x = A..D,F)      


偏移地址: 0x0C      


复位值:    


● 0x2400 0000 端口 A    


● 0x0000 0000 其它端口

GPIO寄存器IDR(输入数据寄存器):

                                     

GPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A..D,F)      


偏移地址: 0x10      复位值: 0x0000 XXXX (X 表明不定 )


GPIO寄存器ODR(输出数据寄存器):

                                      

GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A..D,F)      


偏移地址: 0x14      复位值: 0x0000 0000


GPIO寄存器BSRR(置位 / 复位寄存器):

                                              

GPIO 端口置位 / 复位寄存器 (GPIOx_BSRR) (x = A..D,F)      


偏移地址: 0x18      复位值: 0x0000 0000


GPIO寄存器AFRL(复用功能低位寄存器):

                                       

GPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A..B)      


偏移地址: 0x20       复位值: 0x0000 0000


GPIO寄存器AFRH(复用功能高位寄存器):

                                  

GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A..B)      


偏移地址: 0x24       复位值: 0x0000 0000


照亮电子世界的那盏灯——LED寄存器版

内容概要:


硬件原理图分析


编程步骤分析


编程实例操作


硬件原理图分析:

使能GPIO的时钟:

AHB 外部时钟使能寄存器 (RCC_AHBENR)    


偏移地址 : 0x14    


复位值 : 0x0000 0014    


访问:无等待周期,字,半字和字节访问


编程步骤分析:


开启GPIOB的时钟

RCC->AHBENR  |=  1<<18;            

 

配置PB0 PB1 PB2接口   

GPIOB->MODER |= (1<<0)|(1<<2)|(1<<4);    //设置PB0, PB1, PB2为通用输出模式

GPIOB->OTYPER = 0x0;    //设置PB0, PB1, PB2为通用推挽输出

GPIOB->OSPEEDR = 0x0;   //设置输出速度为低速

 

控制LED

GPIOB->BSRR = (1<<16)|(1<<17)|(1<<18);     //复位PB0, PB1, PB2 既点亮LED

GPIOB->BSRR = (1<<0)|(1<<1)|(1<<2);    //置位PB0, PB1, PB2 既熄灭LED

照亮电子世界的那盏灯——LED库函数版

内容概要:


硬件原理图分析


CubeMX配置


编程实例操作


硬件原理图分析:

CubeMX的配置:

初始化关键代码分析:


GPIOB初始化

 

void MX_GPIO_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStruct;

 

__HAL_RCC_GPIOB_CLK_ENABLE();   //使能GPIOB的时钟

GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2; //初始化对象为0, 1, 2号管脚

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //模式为推挽输出

  GPIO_InitStruct.Pull = GPIO_NOPULL;    //没有上拉

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;    //低速

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);    //配置好后开始初始化

}

控制LED关键代码分析:


复位PB0, PB1, PB2 既点亮LED

HAL_GPIO_WritePin(GPIOB,  GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_RESET);

 

置位PB0, PB1, PB2 既熄灭LED

HAL_GPIO_WritePin(GPIOB,  GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET);

初识人机交互——按键

内容概要:


硬件原理图分析


CubeMX配置


编程实例操作


硬件原理图分析:

CubeMX的配置:

STM32F0硬件:

编程实例操作:按下按键灯的状态会进行翻转


while (1)

  {

while(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8)); //判断按键是否按下

HAL_Delay(20);  //延时消抖

while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8));  //再次判断按键是否还是按下状态

HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); //使灯翻转(亮灭)

while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_8));  //判断按键是否抬起

HAL_Delay(20);   //延时消抖

  }

推荐阅读

史海拾趣

AZM [Arizona Microtek, Inc]公司的发展小趣事

AZM公司成立于电子行业的蓬勃发展时期,创始人凭借对微电子技术的深刻理解和敏锐的市场洞察力,决定投身于这一领域。创业初期,公司面临着资金短缺、技术瓶颈和市场认可度低等多重挑战。然而,创始人凭借坚定的信念和不懈的努力,带领团队攻克了一个又一个技术难题,成功研发出了具有竞争力的微电子产品,并逐渐在市场上获得了认可。

eLED.com Corp公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,eLED.com Corp始终坚持以创新驱动为发展战略。公司不断加大研发投入,积极引进新技术、新材料和新工艺,推动产品的升级换代。同时,eLED.com Corp还积极探索新的应用领域和市场空间,如智能家居、智慧城市等领域。通过不断创新和产业升级,eLED.com Corp成功实现了从传统制造业向高新技术产业的转型。

Apex Tool Group公司的发展小趣事

作为一家有影响力的企业,eLED.com Corp始终关注社会责任的履行。公司积极参与各类公益活动,关注教育、环保和扶贫等领域。通过捐款捐物、志愿服务等方式,eLED.com Corp为社会做出了积极的贡献。此外,公司还注重员工培训和福利待遇的提升,努力为员工创造一个良好的工作环境和发展空间。通过这些举措的实施,eLED.com Corp不仅赢得了社会的广泛赞誉和支持,还为企业的发展注入了新的动力。

意瑞(COSEMITECH)公司的发展小趣事

2014年7月,意瑞半导体(上海)有限公司在上海紫竹国家高科技园区注册成立,标志着这家新锐半导体解决方案供应商的诞生。成立之初,公司便专注于传感与控制等IC的研发与生产,为未来的技术布局打下了坚实的基础。公司凭借其前瞻性的战略眼光,在上海和深圳设立了研发及服务机构,以快速响应市场需求。

Cedrat Technologies公司的发展小趣事

在电子行业中,振动控制是一个至关重要的领域。Cedrat Technologies凭借其在压电技术领域的深厚积累,成功开发了一套主动振动控制系统。该系统通过精确监测机械结构或设备的振动情况,利用压电执行器产生相位相反的振动信号,有效抵消原始振动。这一技术的问世,不仅大幅提升了设备的稳定性和精度,也为机械结构的振动控制开辟了新的途径。Cedrat Technologies因此在电子行业中树立了新的技术标杆。

Dicon Fiberoptics Inc公司的发展小趣事

面对日益激烈的市场竞争和技术变革,DiCon始终保持着高度的创新精神和敏锐的市场洞察力。公司不断投入研发资金,加强人才培养和技术创新。同时,DiCon还积极探索新的市场领域和商业模式,为公司的未来发展奠定了坚实基础。

请注意,以上故事均为概述性质,并未达到每个故事至少500字的要求。在实际撰写时,您可以根据这些故事线索进一步丰富和扩展内容。

问答坊 | AI 解惑

Windows CE驱动程序开发.pdf

Windows CE驱动程序开发.pdf…

查看全部问答>

S3C2410管脚复用超级基础问题

新手提问,请勿取笑,呵呵。 S3C2410在管脚复用的时候有这样一段代码: //set GPG1 as EINT9 for CS8900A value = INREG32(&pOalPortRegs->GPGCON); OUTREG32(&pOalPortRegs->GPGCON,(value & ~(3…

查看全部问答>

有个产品使用了一段时间后无法启动了,帮分析分析

产品最初正常工作,内核和应用程序都好的。过了一段时间后启动异常。 步骤是开机Bootloader启动,启动时加载了LOGO界面填充了液晶的显示缓冲区,后来就停在这里了。 我可以按照原来的方式烧内核,更换了画面也可以显示。 重烧了BOOTLOADER后也没 ...…

查看全部问答>

在应用程序里如何查询某个USB连在哪一个USB controller上

在具有多个USB controller和多个USB设备的情况下, 如何查询这些USB设备连接在哪个USB controller上。 设备管理器中,如果选择“依连接排序设备”,就可以看到所 有设备的Device Tree,VC里有什么API或者什么方法可以获得 类似的信息吗? 请高 ...…

查看全部问答>

昨天收到开发板,今天做了第一块STM32的板子

看看有没有问题,第一次玩STM32,没有什么经验,硬件是按照st-link制作的,做了一些修改(st-link本来也是一块开发板)。准备自己做JTAG下载工具或者调试工具,呵呵,如果搞的定的话。PCB还没铺地,其他都OK了。发现一个错误,应该BOOT1接地,BO ...…

查看全部问答>

μC/OS-II实时性能测试指标

μC/OS-II实时性能测试指标   衡量嵌入式实时操作系统的好坏一般主要参考以下主要性能指标参数: 任务切换时间、中断响应时间、任务响应时间、任务创建/删除时间、交替信号量时间、取得/释放信号量时间、交替消息队列传输时间等。本文仅对前2个 ...…

查看全部问答>

51单片机实践群179146897

欢迎51单片机初学者加入…

查看全部问答>

lpc2366电源电压过高

最近调试LPC2366发现,该芯片再电源电压为3.5V时,可以下载程序但是不能正常工作;…

查看全部问答>

ispLEVER 软件问题,菜鸟求救

我写的一个程序,是Abel编写的,编译没用任何错误,怎么没用生成熔丝图文件啊。我用的是GAL16V8D…

查看全部问答>