当前位置: 首页 > 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官方结果改进一:测试结果摘要 本文给大家带来一种超大核注意力机制的改进方…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

【阅读笔记】MemOS: 大语言模型内存增强生成操作系统

核心速览 研究背景 ​​研究问题​​:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…...

用 FFmpeg 实现 RTMP 推流直播

RTMP(Real-Time Messaging Protocol) 是直播行业中常用的传输协议。 一般来说,直播服务商会给你: ✅ 一个 RTMP 推流地址(你推视频上去) ✅ 一个 HLS 或 FLV 拉流地址(观众观看用)…...

Unity-ECS详解

今天我们来了解Unity最先进的技术——ECS架构(EntityComponentSystem)。 Unity官方下有源码,我们下载源码后来学习。 ECS 与OOP(Object-Oriented Programming)对应,ECS是一种完全不同的编程范式与数据架构…...