【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…...

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

[补题记录] 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…...
解决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分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
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 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* 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…...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...