当前位置: 首页 > news >正文

【STM32】GPIO控制LED(寄存器版)

 在开始之前记得先准备好环境:

STM32F103核心板下载教程.pdf · 林何/STM32F103C8 - 码云 - 开源中国 (gitee.com)

一、STM32的GPIO模块数据手册详解

每个GPIO端口对应16个引脚,例GPIOA(PA0~PA15)
内核cpu就可以通过APB2总线对寄存器读写,完成输出电平和读取电平的功能

 1.GPIO和APIO

GPIO:通用输入/输出IO

APIO:备用输入/输出IO

2.GPIO功能描述

3.配置模式

【STM32】GPIO工作原理(八种工作方式超详细分析,附电路图)-CSDN博客

1.输入浮动,输入上拉,输入下拉(数字状态)

都是数字模式,数字IO,只关心电平是1还是0

输入浮空:就是当电平输入进来后,直接输入到寄存器中【不对其进行操作】

输入上拉:在内部有一个上拉电阻(将电平拉高),只能外部接地,才能将电平拉低,如果TTL肖特基触发器:输入的是高电平或者干扰信号,则会将其过滤调。

2.模拟输入(模拟状态)

AD转换

可以工作在模拟电路或者数字电路

3.输出

开漏输出

推挽输出

4.备用

将不用的引脚配置成备用引脚(GPIO)才可以被使用

4.输出字节数控制

1)输出32位字:使用GPIO_CRL---效率低,但是兼容性好

2)输入小于32位字:使用CPIOx_BSRR--效率高,但是兼容性差

5.I/O 端口位框图

6.端口位配置表

7.输出模式位

8.外部中断/唤醒线

将IO口和相对应的中断映射起来

9.GPIO寄存器描述

1. 端口配置低寄存器(GPIOx_CRL)

由于每个GPIO口需要4位来进行配置输入输出模式(2位配置MODE,2位配置CNF),这样的话每组16个GPIO口则需要64位,这也就表明需要两个32位寄存器。于是GPIOx_CRL用于配置GPIO0-GPIO7的输入输出模式。同理GPIOx_CRH则用于配置GPIO8-GPIO15的输入输出模式。

控制PX0---PX7引脚工作模式

四个位控制一个引脚

2. 端口配置高寄存器(GPIOx_CRH)

控制PX8---PX15引脚工作模式

3.端口输入数据寄存器(GPIOx_IDR) 

4. 端口输出数据寄存器(GPIOx_ODR)

5. 端口位设置/复位寄存器(GPIOx_BSRR)

如果想要将bit7和bit6置为0,则表示要将bit7和bit6写为1,其他位置为0

对复位上写1表示复位

对置位上写1表示置为

如果置位和复位同时设置,则置位起作用。

6.端口位复位寄存器(GPIOx_BRR)

7.端口配置锁定寄存器(GPIOx_LCKR)

8.复用功能I/O和调试配置(AFIO)

二、原理图分析

1.硬件接线

1)杜邦线连接到P0端口到LCD的J19接口,这样相当于8个LED分别对应PB8-PB15

2)因为GPIO接到LCD的负极,所以输入0亮,输入1暗

三、MDK工程建立

与前面51建立工程是一样的

1.注意点1:

2.注意点2:

单片机中用到的c语言其实不是原始c语言,而是有点定制性c语言

之前认识:整个程序从main函数开始执行,main执行完整个程序就结束

起始代码:从CPU复位开始执行的第一句指令,到main函数之前所做的事情就是起始代码

3.起始代码

1)起始代码是从哪里来的:编译环境提高的,STM32CPU提供的

2)不同CPU的起始代码一般是不同的

3)起始代码是用汇编写的

四、写代码控制GPIO点亮和熄灭

1.寄存器现象确认

我们使用的是P0端口(对应PB8-PB15),所以我们要去对应查找PB的寄存器起始地址

1)STM32 PortB的起始是0x4001 0c00

2.有可能使用到的GPIO的地址:

因为我们是PB8-PB15,所以我们只使用CRH

3.C语言操作寄存器

1)ARM是内存与IO统一编址的,所以ARM中的所有外设都是通过寄存器的方式来操作的

2)每一个寄存器都有地址,c语言通过这些地址来操作这些寄存器位,用到的c语言的技巧主要是c与的位操作和c语言指针

3)常见面试题:用c语言向内存地址0x3000 0004写入16

        *(unsigned int *)0x3000 0004=16;

等价于

        unsigned int *p=(unsigned int *)0x3000 0004;

        *p=16;

4.解析寄存器

1.端口配置高寄存器(GPIOx_CRH)-高8位

	//向CRH寄存器写内容,将GPIO_GPB15配置为输出模式【此时高位有用】//推挽输出模式,输出的速率为50MHZ【0011 0011 0011 0011.。。】*((unsigned int *)GPIOB_CRH)=0x33333333;//表示将GPIO_CRH的值设置为0x33333333

2.端口输出数据寄存器(GPIOx_ODR)

	//向CRH寄存器写内容,将GPIO_GPB15配置为输出模式【此时高位有用】//推挽输出模式,输出的速率为50MHZ【0011 0011 0011 0011.。。】*((unsigned int *)GPIOB_CRH)=0x33333333;//表示将GPIO_CRH的值设置为0x33333333

5.注意点:

记得在操作GPIO的时候要先打开时钟

#define GPIOB_CRH		0x40010C04
#define GPIOB_ODR		0x40010C0C#define RCC_APB2ENR		0x40021018void main(void){//STM32所有外设默认关闭//所以我们在打开时钟*((unsigned int *)RCC_APB2ENR)=0x00000008;//向CRH寄存器写内容,将GPIO_GPB15配置为输出模式//推挽输出模式,输出的速率为50MHZ【0011 0011 0011 0011.。。】*((unsigned int *)GPIOB_CRH)=0x33333333;//表示将GPIO_CRH的值设置为0x33333333//输出1,点亮LED//ff:对应15-8位*((unsigned int *)GPIOB_ODR)=0x0000f000;while(1);}

五、其他寄存器的测试

1.端口位设置/清除寄存器(GPIOx_BSRR)

将bit8-bit15置0(变亮),因为我们前面是使用了GPIO_GRH(所以只能控制8-15个引脚),所以此时改变0-7是无效的

	//使用寄存器【GPIOB_BSRR】:将bit8-bit15置0(此时表示全亮) //*((unsigned int *)GPIOB_BSRR)=0x00000000;//因为前面我们是控制GPIOB_CRH,所以只有8-15位才起效果,0-7无论设置什么都无所谓//*((unsigned int *)GPIOB_BSRR)=0x000000ff;//此时全亮,与上面效果一样//0101 0101//*((unsigned int *)GPIOB_BSRR)=0x00005500;//此时2,4,6,8亮//此时led1,led3不亮,其他亮//使用置位*((unsigned int *)GPIOB_BSRR)=0x00005500;//此时2,4,6,8亮//使用复位:将高4位全部复位*((unsigned int *)GPIOB_BSRR)=0xf0000000;

2.端口位清除寄存器(GPIOx_BRR)

只能操作bit0-bit15

BRR:只能用来复位,不能置位(所以只能将其置为0,而不能置为1)

    //使用寄存器【GPIOB_BRR】:将bit8-bit15置0(此时表示全亮) //GPIOB_BRR:只能进行复位(意思是只能将电平置为0)//前面16-32是无效位*((unsigned int *)GPIOB_BRR)=0x00000000;//全亮*((unsigned int *)GPIOB_BRR)=0x0000ffff;//全亮//*((unsigned int *)GPIOB_BRR)=0x0000ff00;//只亮高4位(led的4-7)

六、总结

对数据操作的三种方法:

ODR:可以进行任何操作,但是只能一次性操作32位,效率低,但是移植性高【其次考虑】

BSRR:原子操作,效率高;移植性差【优先考虑】

BRR:只能进行复位,不能置位,原子操作,效率高;移植性差

1.代码

#define GPIOB_CRH		0x40010C04
#define GPIOB_CRL		0x40010C00
#define GPIOB_ODR		0x40010C0C
#define GPIOB_BSRR	0x40010C10
#define GPIOB_BRR		0x40010C14#define RCC_APB2ENR		0x40021018void main(void){//STM32所有外设默认关闭//所以我们在打开时钟*((unsigned int *)RCC_APB2ENR)=0x00000008;//向CRH寄存器写内容,将GPIO_GPB15配置为输出模式【此时高位有用】//推挽输出模式,输出的速率为50MHZ【0011 0011 0011 0011.。。】*((unsigned int *)GPIOB_CRH)=0x33333333;//表示将GPIO_CRH的值设置为0x33333333//输出0,点亮LED//ff:对应15-8位//*((unsigned int *)GPIOB_ODR)=0x00000000;//使用寄存器【GPIOB_BSRR】:将bit8-bit15置0(此时表示全亮) //*((unsigned int *)GPIOB_BSRR)=0x00000000;//因为前面我们是控制GPIOB_CRH,所以只有8-15位才起效果,0-7无论设置什么都无所谓//*((unsigned int *)GPIOB_BSRR)=0x000000ff;//此时全亮,与上面效果一样//0101 0101//*((unsigned int *)GPIOB_BSRR)=0x00005500;//此时2,4,6,8亮//此时led1,led3不亮,其他亮//使用置位//*((unsigned int *)GPIOB_BSRR)=0x00005500;//此时2,4,6,8亮//使用复位:将高4位全部复位//*((unsigned int *)GPIOB_BSRR)=0xf0000000;//使用寄存器【GPIOB_BRR】:将bit8-bit15置0(此时表示全亮) //GPIOB_BRR:只能进行复位(意思是只能将电平置为0)//前面16-32是无效位*((unsigned int *)GPIOB_BRR)=0x00000000;//全亮*((unsigned int *)GPIOB_BRR)=0x0000ffff;//全亮//*((unsigned int *)GPIOB_BRR)=0x0000ff00;//只亮高4位(led的4-7)while(1);}

2.对宏定义的封装

#define GPIOB_CRH		0x40010C04
#define GPIOB_CRL		0x40010C00
#define GPIOB_ODR		0x40010C0C
#define GPIOB_BSRR	0x40010C10
#define GPIOB_BRR		0x40010C14#define RCC_APB2ENR		0x40021018#define rGPIOB_CRH 		(*((unsigned int *)GPIOB_CRH))
#define rGPIOB_ODR 		(*((unsigned int *)GPIOB_ODR))
#define rGPIOB_BSRR 	(*((unsigned int *)GPIOB_BSRR))
#define rGPIOB_BRR 		(*((unsigned int *)GPIOB_BRR))
#define rRCC_APB2ENR 	(*((unsigned int *)RCC_APB2ENR))void main(void){rRCC_APB2ENR = 0x00000008;rGPIOB_CRH = 0x33333333;rGPIOB_ODR = 0x0000aa00;
}

相关文章:

【STM32】GPIO控制LED(寄存器版)

在开始之前记得先准备好环境: STM32F103核心板下载教程.pdf 林何/STM32F103C8 - 码云 - 开源中国 (gitee.com) 一、STM32的GPIO模块数据手册详解 每个GPIO端口对应16个引脚,例GPIOA(PA0~PA15)内核cpu就可以通过APB2总线对寄存器…...

Spring Boot OAuth 2.0整合—高级配置

一、概述 HttpSecurity.oauth2Login() 为定制OAuth 2.0登录提供了大量的配置选项。主要的配置选项被分组到它们的协议端点对应处。 例如,oauth2Login().authorizationEndpoint() 允许配置授权端点,而 oauth2Login().tokenEndpoint() 允许配置令牌端点。…...

软考-虚拟专用网原理与应用

本文为作者学习文章,按作者习惯写成,如有错误或需要追加内容请留言(不喜勿喷) 本文为追加文章,后期慢慢追加 by 2023年10月 虚拟专用网概念 虚拟专用网(Virtual Private Network)是一种通过…...

clock_property 时钟的常用属性

get_property [get_clocks] property_option 1. period get_property [get_clocks] period 查询所有clock 的周期,如果存在loops会生成CTE_loops.rpt 2.clock_network_pins 查询clock所有的pins 3.generated_clocks_extended 查询clock分频产生的generate…...

平板有必要买触控笔吗?推荐的ipad手写笔

iPad之所以能吸引这么多人,主要是因为它的功能出色。用来画画、做笔记,也是一种不错的体验。但如果只是用来看电视和打游戏的话,那就真的有点大材小用了。如果你不需要昂贵的苹果电容笔,也不需要用来专业的绘图,那你可…...

Qt扫描-QMoive 理论总结

QMoive 理论总结 一、概述二、使用1. 使用2. 信号发出时机 三、控制的相关槽函数四、信号 一、概述 QMovie类是一个使用QImageReader播放 动画 的方便类。这个类用于显示没有声音的简单动画,一般即是 gif 动画。如果要显示视频和媒体内容,请使用Qt Mult…...

类似东郊到家预约家政保洁小程序搭建

随着生活水平的提高,人们对健康养生的需求越来越重视,按摩作为一种传统的养生方式,备受关注。为了方便用户快速、方便地预约按摩服务,本文将介绍一款按摩预约小程序的开发。 首先,我们通过市场调研和分析发现&#xf…...

[补题记录] Atcoder Beginner Contest 325(E、F)

URL:https://atcoder.jp/contests/abc325 目录 E Problem/题意 Thought/思路 Code/代码 F Problem/题意 Thought/思路 Code/代码 E Problem/题意 有一个二维矩阵,D[i][j] 表示从 i 到 j 的距离。从 i 到 j 有两种方式: 坐汽车&…...

1024啊啊啊啊啊啊

1024 程序员节快乐,没什么想发的,只是想要个1024胸章。...

淘宝商品详情API接口(H5端和APP端),淘宝详情页,商品属性接口,商品信息查询

一、接口参数说明:提取淘宝商品详情页各项数据,包含skuid、价格、收藏数、加购数、月销售量、主图、标题、详情页图片等页面上可以看奥的数据都可以拿到。 点击获取key和secret 二、使用场景 1、商品销售情况分析,根据销量调整活动方案&am…...

JVM的几个面试重点

JVM的内存区域划分 JVM类加载机制 前言 Java程序最开始是一个 .java 的文件,JVM把它编译成 .closs 文件(字节码文件),运行 Java 程序, JVM 就会读取 .class 文件,把文件内容读取到内存中,构造出…...

[yolo系列:YOLOV7改进-添加CoordConv,SAConv.]

文章目录 概要CoordConvSAConv 概要 CoordConv(Coordinate Convolution)和SAConv(Spatial Attention Convolution)是两种用于神经网络中的特殊卷积操作,用于处理图像数据或其他多维数据。以下是它们的简要介绍&#x…...

【万字实操】可视化运维平台openGauss Datakit,带你轻松玩转openGauss 5.0

openGauss Datakit:openGauss社区推出的可视化的运维工具. 特性优势 初级用户学习openGauss门槛高让你望而却步?openGauss Datakit一键化安装企业版集群、监控、日志分析、SQL诊断,让你快速上手,快速部署,从容面对企业环境&#…...

《动手学深度学习 Pytorch版》 10.1 注意力提示

10.1.1 生物学中的注意力提示 “美国心理学之父” 威廉詹姆斯提出的双组件(two-component)框架: 非自主性提示:基于环境中物体的突出性和易见性 自主性提示:受到了认知和意识的控制 10.1.2 查询、键和值 注意力机制…...

C# 写入文件比较

数据长度:128188个long BinaryWriter每次写一个long 耗时14.7828ms StreamWriter每次写一个long 耗时44.0934 ms FileStream每次写一个long 耗时20.5142 ms FileStream固定chunk写入,循环操作数组,耗时13.4126 ms byte[] chunk new byte[d…...

医院设备利用(Use of Hospital Facilities, ACM/ICPC World Finals 1991, UVa212)rust解法

医院里有n(n≤10)个手术室和m(m≤30)个恢复室。每个病人首先会被分配到一个手术室,手术后会被分配到一个恢复室。从任意手术室到任意恢复室的时间均为t1,准备一个手术室和恢复室的时间分别为t2和t3&#xf…...

解决github ping不通的问题(1024程序员节快乐!

1024程序员节快乐!(随便粘贴一个文档,参加活动 解决github ping不通的问题 域名解析(域名->IP):https://www.ipaddress.com/ Ubuntu平台 github经常ping不通或者访问缓慢,方法是更改host…...

QT基础 柱状图

目录 1.QBarSeries 2.QHorizontalBarSeries 3.QPercentBarSeries 4.QHorizontalPercentBarSeries 5.QStackedBarSeries 6.QHorizontalStackedBarSeries 从上图得知柱状的基类是QAbstractBarSeries,派生出来分别是柱状图的水平和垂直类,只是类型…...

微机原理与接口技术-第七章输入输出接口

文章目录 I/O接口概述I/O接口的典型结构基本功能 I/O端口的编址独立编址统一编址 输入输出指令I/O寻址方式I/O数据传输量I/O保护 16位DOS应用程序DOS平台的源程序框架DOS功能调用 无条件传送和查询传送无条件传送三态缓冲器锁存器接口电路 查询传送查询输入端口查询输出端口 中…...

YoloV8改进策略:独家原创,LSKA(大可分离核注意力)改进YoloV8,比Transformer更有效,包括论文翻译和实验结果

文章目录 摘要论文:《LSKA(大可分离核注意力):重新思考CNN大核注意力设计》1、简介2、相关工作3、方法4、实验5、消融研究6、与最先进方法的比较7、ViTs和CNNs的鲁棒性评估基准比较8、结论YoloV8官方结果改进一:测试结果摘要 本文给大家带来一种超大核注意力机制的改进方…...

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...