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或者其它框架…

QEMU源码全解析 —— CPU虚拟化(1)

接前一篇文章: 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 零、序言 一晃已经很久(4个多月)没有更新QEMU这个专栏了。并不是本系列已经完结了,也不是笔者不想写、或者已经失去了继续…

Docker--在linux安装软件

Docker 引用Docker原因是在linux中安装软件 以前在linux中安装软件&#xff0c;是直接安装在linux操作系统上&#xff0c;软件和操作系统耦合度很高&#xff0c;不方便管理&#xff0c;因为linux版本不同&#xff0c;环境也就改变了 docker是一种容器技术&#xff0c;提供标…

7-4 数组逆序(重庆专本贯通C语言大一期末考试题目详解)

分数 10 入门 全屏浏览 切换布局 作者 Jackson 单位 上海大学 给你 n 个整数&#xff0c;将其逆序输出。 输入格式: 第一行一个整数 n &#xff08;3<n<10) 代表数的个数。 第二行 n 个整数&#xff08;空格隔开&#xff09;&#xff08;这些数在 0~10^6 之间)。…

概率论原理精解【3】

文章目录 向量值向量值函数导数向量值函数定义性质应用示例 向量值函数的导数定义性质应用 向量值 向量值函数导数 D R ⊂ R n , 向量值函数 f : D n → R m D^R \subset R^n,向量值函数f:D^n\rightarrow R^m DR⊂Rn,向量值函数f:Dn→Rm 复合函数 f i : π i ∘ f , i 1 , 2…

frameworks 之FallbackHome

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

Flutter EasyRefresh:介绍与使用指南

什么是 Flutter EasyRefresh&#xff1f; Flutter EasyRefresh 是一个强大的下拉刷新和上拉加载组件&#xff0c;用于构建流畅且高效的 Flutter 应用程序。它提供了多种自定义配置和动画效果&#xff0c;使开发者可以轻松实现列表的刷新和加载功能。 主要功能 支持下拉刷新和…

Python学生信息管理系统的设计与实现

在本篇博客中&#xff0c;我们将深入探讨一个基于Python的简单学生信息管理系统的设计与实现过程。这个系统允许用户执行诸如添加、删除、修改和查询学生信息等操作。我们将逐步解析代码&#xff0c;理解其中的关键概念和编程实践。 1. 系统概述 该系统由几个核心功能组成&am…

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

Leetcode【最长回文子串】

5. 最长回文子串 给你一个字符串 s&#xff0c;找到 s 中最长的 回文子串 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&#xff1a;"bab" 解释&#xff1a;"aba" 同样是符合题意的答案。示例 2&#xff1a; 输入&#xff1a;s &qu…

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