STM32学习【5】用按键控制LED亮灭(寄存器)以及对位运算的思考

目录

  • 1. 看原理图
  • 2 使能GPIOA+GPIOA时钟模块
      • 2.2 设置引脚GPIO输入
      • 2.3 读取引脚值
    • 3. 关于寄存器操作的思考


写在前面
注意,这篇文章虽然说是用按键控制led亮灭,重点不在代码,而是关键核心的描述。
用寄存器的方式,通过key来控制led的亮灭,在各种封装库存在且算力充沛的情况下,是否还有必要用这么底层的方式来写代码呢?
事实上,实际工作中是不需要的,但是学习中,是一定要的,只有这样我们才能理解真实的代码世界是什么样的。
那么真实的代码是什么样的?其实就是一个个拨码开关,不断的开,关,通,断,如果我们肉眼能看到代码运行的世界,我相信那里一定色彩斑斓!


1. 看原理图

  • 我们使用KEY1来控制红色LED:按下KEY1则灯亮,松开后灯灭

  • KEY1用的是PA0引脚

2 使能GPIOA+GPIOA时钟模块

RCC_APB2ENR地址:0x40021000 + 0x18


很明显,要想使能GPIOA,就要把第3和4设置成1,

对应下面的代码:

unsigned int *pReg;
unsigned int *pRegA;
unsigned int *pRegB;/*使能GPIOB, GPIOA */
pReg = (unsigned int *)(0x40021000 + 0x18);//找到对应的寄存器位置
*pReg |= (1<<3) | (1<<2);
//这里的计算分为两步,(1<<3) | (1<<2)计算,使其第三位和第四位都是1的32位数据,然后通过*pReg |,把1并入到第三位第四位寄存器中。

2.2 设置引脚GPIO输入

GPIOA_CRL地址:0x40010800 + 0x00

/* 设置GPIOB为输出引脚 */
pRegB = (unsigned int *)(0x40010C00 + 0x00);
*pRegB |= (1<<0);/*设置GPIOA0Î输入引脚*/
pRegA = (unsigned int *)(0x40010800 + 0x00);
*pRegA &= ~(3);     /* mode0 = 0b00 */
*pRegA &= ~(3<<2);  /* cnf0 = 0b00 */
*pRegA |= (1<<2);   /* cnf0 = 0b01 */

2.3 读取引脚值

GPIOA_IDR 地址:0x40010800 + 0x08

/* GPIOB output data register */
pRegB = (unsigned int *)(0x40010C00 + 0x0C);/* GPIOA input data register */
pRegA = (unsigned int *)(0x40010800 + 0x08);/* 读取GPIOA input data register */*pRegA & (1<<0)) == 0 /* KEY1被按下*/	
*pRegB &= ~(1<<0);//设置GPIOB输出0
*pRegB |= (1<<0);//设置GPIOB输出1

3. 关于寄存器操作的思考

*pRegA & (1<<0)) == 0 /* KEY1被按下*/	
*pRegB &= ~(1<<0);//设置GPIOB输出0
*pRegB |= (1<<0);//设置GPIOB输出1

逻辑与和逻辑或,其实有点哲学意义上的对立和统一。

逻辑或:非常简单的逻辑。只要双方有一个是1,那么或运算必然是1。
1.逻辑或,1和1之间的相互成就。在逻辑或的世界里,1拥有绝对的power,不论遇见什么都会同化为1。 可以说,人难得糊涂,事业才能越做越大。
逻辑与:只要双方有一个是0,那么结果必然是0,逻辑与就像对0有洁癖的家伙,
2.逻辑与,0和0之间的相互擦除,在逻辑与的世界里,0拥有绝对的power,不论遇见什么都会同化0。 可以说,底层人的相互拉踩,才是真正的阶层固化。

总结起来,我们要是想把1作为抓手,就用或,像用0作为抓手,就用与。
比如:
我们需要让寄存器某些位置1的时候用,我们就用或,不论什么位,碰见1就变1。
我们要把某些位清零的时候用,我们就用与。不论什么位,碰见0就变0.
那么我们把上面的案例拿过来看看。
*检测pRegA & (1<<0)) == 0 // KEY1被按下
我们要检测某些位是不是1,那么就要把其他的位用0干掉,一定是用,那么必然我们要把其他位干掉,要用与。

*pRegB &= ~(1<<0);设置GPIOB输出0:我们要设置对应的位为0,首先确定最终必然要用与。
*pRegB |= (1<<0);//设置GPIOB输出1:我们要设置对应的位为0,首先确定最终必然要用或。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35893.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js,html,css,vuejs手搓级联单选

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>级联选择器</title><script src"h…

【Spring】第四弹:基于XML文件注入Bean对象

一、setter 注入Bean对象 1.创建Student对象 public class Student {private Integer id;private String name;private Integer age;private String sex;public Student() {}public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String …

DeepSeek私有化部署与安装浏览器插件内网穿透远程访问实战

文章目录 前言1. 本地部署OllamaDeepSeek2. Page Assist浏览器插件安装与配置3. 简单使用演示4. 远程调用大模型5. 安装内网穿透6. 配置固定公网地址 前言 最近&#xff0c;国产AI大模型Deepseek成了网红爆款&#xff0c;大家纷纷想体验它的魅力。但随着热度的攀升&#xff0c…

单目3d detection算法记录

1、centernet object as points 这篇文章的核心单目3d检测主要是利用中心点直接回归出3d模型的所有属性&#xff0c;head共享整个backbone&#xff0c;其中3d属性包括&#xff1a;2d目标中心点、2dw和h、2d offsets、3doffsets、3d dimmession、rot还有depth。 其中对应的dep…

MySQL程序

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 1. mysqld (MySQL服务器) mysqld也被称为MySQL服务器&#xff0c;是⼀个多线程程序&#xff0c;对数据⽬录进⾏访问管理(包含数据库…

rust学习笔记17-异常处理

今天聊聊rust中异常错误处理 1. 基础类型&#xff1a;Result 和 Option&#xff0c;之前判断空指针就用到过 Option<T> 用途&#xff1a;表示值可能存在&#xff08;Some(T)&#xff09;或不存在&#xff08;None&#xff09;&#xff0c;适用于无需错误信息的场景。 f…

IIS 服务器日志和性能监控

Internet Information Services &#xff08;IIS&#xff09; 是 Microsoft 提供的一款功能强大、灵活且可扩展的 Web 服务器&#xff0c;用于托管网站、服务和应用程序。IIS 支持 HTTP、HTTPS、FTP、SMTP 和更多用于提供网页的协议&#xff0c;因此广泛用于企业环境。 IIS 的…

基于Netty实现高性能HTTP反向代理

以下将分步骤实现一个基于Netty的高性能HTTP反向代理&#xff0c;支持动态路由、负载均衡和基础鉴权功能。 1. 项目依赖配置&#xff08;Maven&#xff09; 2. 定义路由规则 3. 实现HTTP反向代理服务端 4. 实现反向代理处理器 5. 实现基础鉴权 6. 性能优化策略 连接池管理…

Feedback-Guided Autonomous Driving

Feedback-Guided Autonomous Driving idea 问题设定&#xff1a;基于 CARLA 的目标驱动导航任务&#xff0c;通过知识蒸馏&#xff0c;利用特权智能体的丰富监督信息训练学生传感器运动策略函数 基于 LLM 的端到端驱动模型&#xff1a;采用 LLaVA 架构并添加航点预测头&#…

OpenCV基础【图像和视频的加载与显示】

目录 一.创建一个窗口&#xff0c;显示图片 二.显示摄像头/多媒体文件 三.把摄像头录取到的视频存储在本地 四.鼠标回调事件 五.TrackBar滑动条 一.创建一个窗口&#xff0c;显示图片 import cv2img_path "src/fengjing.jpg" # 自己的图片路径 img cv2.imre…

springboot实现调用百度ocr实现身份识别

一、技术选型 OCR服务&#xff1a;推荐使用百度AI 二、实现 1.注册一个服务 百度智能云控制台https://console.bce.baidu.com/ai-engine/ocr/overview/index?_1742309417611 填写完之后可以获取到app-id、apiKey、SecretKey这三个后面文件配置会用到 2、导入依赖 <!-- …

Linux--内核进程O(1)调度队列

⼀个CPU拥有⼀个runqueue 如果有多个CPU就要考虑进程个数的负载均衡问题 优先级 普通优先级&#xff1a;100〜139&#xff08;我们都是普通的优先级&#xff0c;想想nice值的取值范围&#xff0c;可与之对应&#xff01;&#xff09;实时优先级&#xff1a;0〜99&#xff08…

1.排序算法(学习自用)

1.冒泡排序 算法步骤 相邻的元素之间对比&#xff0c;每次早出最大值或最小值放到最后或前面&#xff0c;所以形象的称为冒泡。 特点 n个数排序则进行n轮&#xff0c;每轮比较n-i次。所以时间复杂度为O(n^2)&#xff0c;空间复杂度为O(1)&#xff0c;该排序算法稳定。 代码…

DiskGenius 硬盘管理工具下载+D盘空间扩容给C盘教程

目录 D盘空间扩容给C盘教程 1、打开DiskGenius软件​编辑 2、右键D盘&#xff08;或需要压缩的磁盘&#xff09;-->调整分区大小 3、调整分区容量 4、点击是/确定后&#xff0c;等待几分钟电脑自行操作&#xff0c;重启后硬盘就重新分好了 5、展示效果 DiskGenius – …

[项目]基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信

基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信 一.Si24Ri原理图二.Si24R1芯片手册解读三.驱动函数讲解五.移植2.4g通讯&#xff08;飞控部分&#xff09;六.移植2.4g通讯&#xff08;遥控部分&#xff09;七.通讯模块的完成&#xff08;遥控部分&#xff09; 一.Si24Ri原理图 S…

springboot集成xxl-job

前言&#xff1a;关于xxl-job的一些简单的介绍就不做过多介绍&#xff0c;本文主要讲一下如何将xxl-job整合到springboot项目中。先贴上项目的两个地址&#xff1a; 1.github&#xff1a; https://github.com/xuxueli/xxl-job 2.码云&#xff1a;http://gitee.com/xuxueli0323/…

预处理指令中#if 和 #endif的用法

在 C 语言中&#xff0c;#if 和 #endif 是预处理指令&#xff0c;用于条件编译。它们的核心作用是&#xff1a;根据预处理器能够识别的条件&#xff08;通常是宏定义或常量表达式&#xff09;&#xff0c;决定某段代码是否参与编译。 — 基本功能 #if 用于开启一个条件编译块…

【统计学相关知识】极小充分统计量

定义、判别&#xff0c;计算上的定义 极小充分统计量不具有唯一性&#xff0c;具有不变性&#xff0c;线性映射仍然是极小充分统计量 一般来说&#xff0c;使用因子分解定义找到的充分统计量&#xff0c;直观地找到的&#xff0c;一般是极小充分统计量&#xff0c;但还是要遵…

winx64 安装对应版本火狐浏览器驱动

#本人需要学习使用selenium 选择对应的浏览器是firefox 为什么 因为喜欢 首先需要确定你的浏览器版本 在火狐的设置常规中你就能发现 Supported platforms — Firefox Source Docs documentation (mozilla.org) 以上链接参照Supported platforms 找到对应版本 &#xff08;注…

【最后203篇系列】016 Q201架构思考

前言 Q200已经达到了我既定的目标&#xff0c;在最近的3个月&#xff0c;我需要进一步完善&#xff0c;达到可以试产的程度。 在这个过程当中&#xff0c;许多知识和体会一直在变。 qtv200到目前&#xff0c;虽然通过习惯(每晚运行离线策略和比对)方式维持了注意力的集中&…