【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官方结果改进一:测试结果摘要 本文给大家带来一种超大核注意力机制的改进方…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

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

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...