STM32-寄存器点灯案例详解

本文以PA1引脚点亮LED灯为案例,解析了STM32寄存器操作的配置过程,以及从手册查询方法和寄存器配置步骤。

一、概念

1.十六进制和二进制之间相互转换关系

首先,需要了解十六进制和二进制之间的基本转换方法。十六进制是一种基数为16的数制,用数字0到9和字母A到F(或a至f)表示。
二进制则是基数为2的数制,仅使用数字0和1表示。
每一个十六进制的数字可以转换成一个四位的二进制数。
如:十六进制的1转换为二进制是0001,十六进制的A (或a)转换为二进制是1010

对于0xFFFFFFF0来说,可以拆分并转换为对应的二进制:F = 1111编,0=0000因此,0xFFFFFFF0的完整二进制表示是:
1111 1111 1111 1111 1111 1111 1111 0000

二、步骤

1.定位APB总线寄存器位置

第一步 开启外设时钟使能寄存器,当外设时钟没有启用时,软件不能读写外设寄存器数值。返回值始终为0x00

首先找寄存器映射表

STM32第6章提供了储存器映像,由此观察RCC的起始和终止地址分别为

RCC_Start: 0x4003 1000

RCC_End: 0x4003 1400

接着看具体RCC中有关IO PortA寄存器偏置位:

 由图可知APB2外设时钟使能寄存器的偏移地址为:0x18;

即,如果你想设置RCC_APB2ENR这个寄存器,你就必须先定位RCC地址(0x4003 100)+偏移(0x18)

#define   RCC_APB2ENR   *((volatile unsigned int *) (0x40021000 + 0x18))

2.定位IO口端口配置寄存器位置

这里我们使用IO口的A2作为例子,查询寄存器映射可得,PortA起始地址为0x4001 0800 终止地址为 0x4001 0C00

同理,配置IO端口配置寄存器首先要找到GPIO的偏移地址

查表可得该寄存器的地址为GPIO_PortA 偏移0x00

#define GPIOA_CRL (*((volatile unsigned int *) (0x40010800 + 0x00)))

3.定位IO口引脚使能寄存器位置

GPIO_PortA 偏移0x10

#define GPIOA_BSRR (*((volatile unsigned int *) (0x40010800 + 0x10)))

4.APB总线使能

RCC_APB2ENR  |= 1<<2; //RCC PortA 时钟启用

5.IO口端口配置

GPIOA_CRL &= 0xFFFFFF0F;//端口配置,CNF1和MODE1清零
GPIOA_CRL |= 0x00000030;//端口配置,CNF1设定推挽输出,MODE1设定输出模式,最大速度50MHz (0011)

6.引脚使能

GPIOA_BSRR = 1<<1;//端口位设置,SET/RESET  ,即BS1设定为SET

三、案例

#include "stm32f10x.h"                  // Device header//定义三个寄存器
#define RCC_APB2ENR (*((volatile unsigned int *) (0x40021000 + 0x18)))//控制RCC_APB2总线,
#define GPIOA_CRL (*((volatile unsigned int *) (0x40010800 + 0x00)))//GPIO_CRL(GPIO_A端口配置低配置寄存器)
#define GPIOA_BSRR (*((volatile unsigned int *) (0x40010800 + 0x10)))//GPIOA_BSRR(GPIO端口位设置/清除寄存器)int main(){
//对寄存器进行相应设定
RCC_APB2ENR  |= 1<<2; //RCC PortA 时钟启用GPIOA_CRL &= 0xFFFFFF0F;//端口配置,CNF1和MODE1清零
GPIOA_CRL |= 0x00000030;//端口配置,CNF1设定推挽输出,MODE1设定输出模式,最大速度50MHz (0011)GPIOA_BSRR = 1<<1;//端口位设置,SET/RESET  ,即BS1设定为SETwhile(1){};return 0;
}

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

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

相关文章

制作显卡版docker并配置TensorTR环境

感谢阅读 相关概念docker准备下载一个自己电脑cuda匹配的docker镜像拉取以及启动镜像安装cudaTensorRT部署教程 相关概念 TensorRT是可以在NVIDIA各种GPU硬件平台下运行的一个模型推理框架&#xff0c;支持C和Python推理。即我们利用Pytorch&#xff0c;Tensorflow或者其它框架…

frameworks 之FallbackHome

frameworks 之FallbackHome FallbackHome 启动启动 Activity 流程创建进程ActivityThrad 与 AMS启动真正的 Launcher mActivityManagerService 创建后会启动 FallbackHome 再启动桌面程序。因为此时还没解锁&#xff0c;桌面又涉及很多其他应用程序相关&#xff0c;所以要等待用…

【Python】数据处理(mongodb、布隆过滤器、索引)

数据 数据预处理 df pd.read_csv(file_path, encodingANSI) csv的编码方式一定要用 ANSI。要不然会出现各种报错 import pandas as pd from datetime import datetime# 读取CSV文件 file_path book_douban.csv df pd.read_csv(file_path, encodingANSI)# 定义一个函数来…

基于SpringBoot协同过滤算法商品推荐系统(源码+lw+部署文档+讲解等)

前言&#xff1a; 博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBo…

【C++】入门基础(引用、inline、nullptr)

目录 一.引用 1.引用的定义 2.引用的特性 3.引用的使用场景 4.const引用 5.引用和指针的区别 二.inline 三.nullptr 一.引用 1.引用的定义 引用不是新定义一个变量&#xff0c;而是给已经存在的变量取一个别名&#xff0c;编译器不会给引用变量开辟内存空间&#xff0c…

SpringSecurity6 | 获取登录用户的认证信息

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringSecurity6 ✨特色专栏: MySQL学习 🥭本文内容: SpringSecurity6 | 获取登录用户的认证信息 📚个人知识库: Leo知识库…

【C++初阶】类和对象(下)

【C初阶】类和对象下 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;C&#x1f96d; &#x1f33c;文章目录&#x1f33c; 1. 再谈构造函数 2. 类型转换 3. static成员 4. 友元 5. 内部类 1. 再谈构造函数 ① 之前我们实现构造函…

关于Qt Creator 使用Qt Quick的Design模式设置

关于使用Qt Quick的Design模式设置&#xff1a; 如描述所言&#xff1a; 如果使用Design模式打开qml文件失败显示如下&#xff1a; 首先确认自己是否安装了Qt Design Studio 如果安装了仍然不显示&#xff0c;则需要勾选下面三个地方才能用Design模式打开.ui.qml文件&#…

gradle设置优先使用maven本地仓库

1. gradle优先使用maven本地库的逻辑 Created with Raphal 2.3.0 开始 maven本地库 是否存在依赖&#xff1f; 使用maven 本地库的依赖 结束 下载依赖到 gradle本地库 yes no 2. 配置 在app/build.gradle.kts中添加mavenLocal() mavenLocal()9. 参考文章 https://www.cnblog…

24_YOLOV3-SPP网络详解

1.1 简介 YOLOv3-SPP是对YOLOv3&#xff08;You Only Look Once version 3&#xff09;目标检测模型的一种改进版本&#xff0c;其中"SPP"代表空间金字塔池化&#xff08;Spatial Pyramid Pooling&#xff09;。这个改进主要是为了增强网络对不同尺度物体的检测能力…

Qt5离线安装包无法下载问题解决办法

Qt5离线安装包无法下载问题解决办法 文章目录 Qt5离线安装包无法下载问题解决办法1、前言2、Qt5安装包下载办法 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;Qt开发经验 &#x1f448; 1、前言 Qt安装包官方下载地址 Qt5离线安装包目前在国内已经被墙…

Golang | Leetcode Golang题解之第233题数字1的个数

题目&#xff1a; 题解&#xff1a; func countDigitOne(n int) (ans int) {// mulk 表示 10^k// 在下面的代码中&#xff0c;可以发现 k 并没有被直接使用到&#xff08;都是使用 10^k&#xff09;// 但为了让代码看起来更加直观&#xff0c;这里保留了 kfor k, mulk : 0, 1;…

大模型系列3--pytorch dataloader的原理

pytorch dataloader运行原理 1. 背景2. 环境搭建2.1. 安装WSL & vscode2.2. 安装conda & pytorch_gpu环境 & pytorch 2.112.3 命令行验证python环境2.4. vscode启用pytorch_cpu虚拟环境 3. 调试工具3.1. vscode 断点调试3.2. py-spy代码栈探测3.3. gdb attach3.4. …

IDEA社区版使用Maven archetype 创建Spring boot 项目

1.新建new project 2.选择Maven Archetype 3.命名name 4.选择存储地址 5.选择jdk版本 6.Archetype使用webapp 7.create创建项目 创建好长这样。 检查一下自己的Maven是否是自己的。 没问题的话就开始增添java包。 [有的人连resources包也没有&#xff0c;那就需要自己添…

每日一题~ cf div3 957 D+E(若只dp,暴力枚举)

D题 简单的dp&#xff0c;我当时没反应过来 这是 dp&#xff0c;好吧&#xff0c;其实是很久没做题了。&#xff08;脑袋木了&#xff09; 题意&#xff1a;n m k n 长的字符 &#xff0c;m k 可以跳跃的最大距离&#xff08;每次跳跃的距离1< <m) k 在水里游泳的最大值 …

IP 地址与 CDN 性能优化

内容分发网络&#xff08;CDN&#xff09;就是通过内容分配到离用户最优的服务器来提高访问速度。而IP地址如何分配与管理就是CND技术的基础。本文将来探讨介绍CDN中的IP地址分配与管理&#xff0c;以及如何通过CDN优化网络性能。 首先我们来了解CDN的基本原理 CDN是一种分布式…

Java核心篇之JVM探秘:内存模型与管理初探

系列文章目录 第一章 Java核心篇之JVM探秘&#xff1a;内存模型与管理初探 第二章 Java核心篇之JVM探秘&#xff1a;对象创建与内存分配机制 第三章 Java核心篇之JVM探秘&#xff1a;垃圾回收算法与垃圾收集器 第四章 Java核心篇之JVM调优实战&#xff1a;Arthas工具使用及…

基于Java中的SSM框架实现暖心家装平台系统项目【项目源码+论文说明】

基于Java中的SSM框架实现暖心家装平台系统演示 摘要 自从互联网技术得到大规模的应用以后&#xff0c;传统家装企业面临全新的竞争激烈的市场环境。要想占得当前家装营销与管理的先机&#xff0c;除了要加强内部管理&#xff0c;提高企业内部运营效率&#xff0c;更要积极推进…

google 浏览器插件开发简单学习案例:计算器

1、首先&#xff0c;我们需要创建扩展的文件结构 2、创建 manifest.json 文件 是Chrome插件的配置文件&#xff0c;定义了插件的基本信息和资源。 {"manifest_version": 3,"name": "Simple Calculator","version": "1.0"…

[K8S]一、Flink on K8S

Kubernetes | Apache Flink 先编辑好这5个配置文件&#xff0c;然后再直接执行 kubectl create -f ./ kubectl get all kubectl get nodes kubectl get pods kubectl get pod -o wide kubectl get cm -- 获取所有的configmap 配置文件 kubectl logs pod_name -- 查看…