STM32 ---寄存器点灯

2023-05-16

1.创建工程

处理器执行程序的时候怎么执行

处理器执行程序都是先执行汇编程序,然后在汇编程序里面跳到主函数里面,所以要先写好汇编程序

 不过这个一般官方提供了,只需把这个文件拷到我们的工程文件夹里面

接着将汇编文件放到我们的工程里面(添加已经存在的文件到这个组里面)

 

 


将_main 这个地址送到 R0 里面去,BX (汇编语言的跳转指令)跳转到R0里面去,刚才我们已经将函数的地址(函数的名字)放在R0里面去了(在C语言函数的名字代表一个地址),所以现在是将地址传到R0里面去,接下来跳转到地址执行它的东西

所以接下来要写一个main函数,等一下会调到main函数里面来

添加一个main.c文件

1.点击中文参考手册

 2.点击时钟部分

 芯片的时钟系统的作用 : 时钟系统提供的是脉冲,就像人的心脏一样,不停的跳动,往全身各个地方输送血液,让我们全身能够动起来

任意一个模块,比如 I2S3  ,如果想要时钟能够过来让它工作,怎么做,就是要先将 I2S3 前面的与门打开,这个与门怎么打开,就是要外设时钟使能端使能,把它设置为1,输入是什么输出就是什么,如果为使能端为0,信号过不来,这个 I2S3 就不能工作了

以上说明 : 我们STM32 每一个模块,在使用的时候,都要先去使能它前面这个与门的时钟


 所以,要先使能 PEx 端口的时钟 

PEx 在哪个地方使能呐?

看数据手册,找寄存器

 找到PE组 端口的使能,现在我们要将 第六位 设置为1

在 C语言里面这个  RCC_APB2ENR  是一个标识符,要先定义才能使用,所以我们要先定义它,要它代表一个寄存器(寄存数据的电路,是一个存储器)

用什么定义 #define  RCC_APB2ENR   要先找到APB2ENR的地址

数据手册

 

 复位和时钟控制(RCC) 这个模块有很多寄存器,这个寄存器占据的存储空间,从0x4002 1000到0x4002 13FF 这么一块存储单元

所以我们知道RCC_APB2ENR 的基地址是0x4002 1000 就像一个班里面的学号第一位的同学,现在我们要找它的偏差,就是它的偏移量

这个 RCC模块 内部有很多寄存器,这些寄存器一个个排列,那现在排到 APB2ENR 的时候它的偏移地址是  0x18

RCC_APB2ENR = 初始地址 + 偏移量


#define RCC_APB2ENR       (0x40021000 + 0x18)   所以我们现在得到APB2ENR 的地址是这个

这个地址在我们编译器看来不是一个地址,它只是一个整型数据,要想变为地址怎么变? 前面加一个 * 号 去修饰就变为一个地址了 #define RCC_APB2ENR      (*) (0x40021000 + 0x18)  

变为一个地址现在有一个问题,我们c 语言里面你要说明的这个地址对应的存储单元他里面存的是什么类型的数据,现在看手册已经知道这是一个寄存器,我们STM32的寄存器,每一个都是32位,而且它里面保存的都是无符号整型数据,所以现在要说明这个地址指向的存储单元里面存放的是无符号整型  #define RCC_APB2ENR  (unsigned int*)(0x40021000 + 0x18) ,所以现在我们知道这是一个地址了,但是现在我们希望能够有这样的赋值操作 RCC_APB2ENR |= 1<<6; 

就相当于 RCC_APB2ENR  = 3   , 这是一个赋值的操作,赋值操作你把3,你不能赋给一个地址,只能赋值给一个存储单元

要想把一个地址变为存储单元,怎么变,在前面再加一个 * 号 

#define RCC_APB2ENR  (*(unsigned int*)(0x40021000 + 0x18)) 现在变为一个存储单元了

对寄存器是一种特殊的存储单元,怎么特殊,我们每次访问存储单元的时候,我们希望不是从缓存里面访问,而是直接访问这个寄存器    怎么直接访问 用volatile修饰

加上 volatile 修饰了以后,CPU去访问这个寄存器的时候,他就不会访问到缓存了,每次都是从0x40021000 + 0x18 这个地方拿数据,它会慢一些,但能够保证数据每次都是正确的,否则缓存那边没有来的及更新的话,它有可能出现错误

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


现在对这个端口的时钟已经使能好了,接下里对这个模块进行操作,目标是将PE12 设置为低电平,如何设置为低电平?

 看这2个寄存器

 L 代表低位   H代表高位

意思是配置第 0 个引脚用这 4位去配置 

 意思是配置第 1 个引脚用这 4位去配置 

 所以最后发现低位寄存器配置的是第0到第7 (8个引脚)

 发现高位寄存器配置的是第8到第15(7个引脚)


所以我们找到  12 引脚在这个位置 ,一共有4位,

我们对寄存器配置的话,先把它清零,然后再把数据写进去

现在要把这4 位清零

左移16位 ,这4位变成了 1111 

 然后取反,这 4 位就变成了 0000

 

 GPIOE_CRH &= ~(0xf << 16);    //然后 GPIOE_CRH = GPIOE_CRH & ~(0xf << 16);

0 & 0 = 0; 寄存器这4 位就被清零0了

现在进行设置,应该设置为?,这4个位有16 种状态,下面3种都是输出,对LED无论哪种速度都可以,这些速度是为了匹配外部的高速电路,

配置输入模式是上面这4个,配置为输出模式是下面的这4个 

 

00 通用推挽输出模式的特点 :这种引脚模式可以输出 0 ,也可以输出1

01 通用开漏输出模式的特点 :  这种引脚只能输出 0,输出1 的话需要特殊处理

复用  :  就是重复利用 ,比如把这个引脚复用为串口的发送或者接收引脚,而不是输入输出

我们希望 0 和 1 都可以用,就用 00 这种方式 


将 CNF 设置为 00  MODE 设置为 01

最后这4位就变成了 00 01  最后就是 0x01

GPIOE_CRH |= 1 << 16; 

GPIOE_CRH  的偏移地址:

 基地址:     可以看到E 口有很多寄存器,占据存储单元 0x4001 1800 - 0x4001 1BFF

最后地址为 :  #define GPIOE_CRH      (*(volatile unsigned int*)(0x40011800 + 0x04))


接下来输出0 或者1 

 

 O 代表输出  D 代表数据   合起来就是端口输出数据寄存器

一共16位,刚好控制的就是 16 个引脚的输出

如果下面这里是GPIOE_ODR,那么就是控制的是GPIOE 16个引脚的输出

 如果这个第12 位为1,那么这个第12引脚就输出高电平,如果这个第12 位为0,那么这个第12引脚就输出低电平

 GPIOE_ODR &= ~(1<<12);


#define RCC_APB2ENR  (*(volatile unsigned int*)(0x40021000 + 0x18))
#define GPIOE_CRH 	 (*(volatile unsigned int*)(0x40011800 + 0x04))
#define GPIOE_ODR 	 (*(volatile unsigned int*)(0x40011800 + 0xC))

int  main(void)
{
	/*使能PE组端口的时钟*/
	RCC_APB2ENR |= 1<<6;  //RCC_APB2ENR = 3(类似)
	
	GPIOE_CRH &= ~(0xf << 16);    // 0b1111 == 0xf
	GPIOE_CRH |= 1 << 16;  /*输出,推挽*/
	
	GPIOE_ODR &= ~(1<<12);
	
	return 0;
}

学习STM32 的时候,拿到板子第一件事情

第一步: 电路图

第二步: 芯片的使用手册

第三步: 回到电路,看什么芯片,想驱动哪一个模块,看数据手册怎么驱动它


C语言对于 0x 40011800 + 0xC 认为是整型数据  用 * 修饰了以后就变为一个地址 ,编译器就知道是一个地址,但是往地址送东西,比如5 或者 6 是不行的,只能往存储单元送才可以,前面再加一个 * 号才能表示一个存储单元

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 ---寄存器点灯 的相关文章

  • 蓝桥杯:统计子矩阵(十三届省赛C++组)

    前言 xff1a 这道题目是矩阵类型题目经典题型 xff0c 解题大体思路是前缀和 43 双指针扫描 xff0c 在我这篇博客中 第十三届蓝桥杯省赛C 43 43 B组题解 第十三届蓝桥杯b组c 43 43 答案 正在黑化的KS的博客 CS
  • pyqt 之 QTableView listvview 添加复选框 Checkbox

    目录 简述 常见的实现方式 具体实现 1 自定义模型QAbstractTableModel xff0c 通过flags 函数来实现 2 自定义委托QAbstractItemDelegate xff0c 通过paint 函数来实现 3 QSt
  • 第十四届蓝桥杯模拟赛第三期(Python)

    写在前面 包含本次模拟赛的10道题题解能过样例 xff0c 应该可以AC若有错误 xff0c 欢迎评论区指出本次题目除了最后两题有些难度 xff0c 其余题目较为简单 xff0c 我只将代码和结果给出 xff0c 如果不能理解欢迎私信我 x
  • Acwing: 一道关于线段树的好题(有助于全面理解线段树)

    题目链接 x1f517 xff1a 2643 序列操作 AcWing题库 前驱知识 xff1a 需要理解线段树的结构和程序基本框架 以及懒标记的操作 题目描述 题目分析 对区间在线进行修改和查询 xff0c 一般就是用线段树来解决 xff0
  • 扩展欧几里得算法及其应用

    前言 由于数论的板子真的很抽象 xff0c 也很难背 xff0c 所以特此记录扩展欧几里得算法的板子和它的用途 本篇文章只涉及应用 xff0c 不涉及证明 xff0c 如需理解证明还请各位移步其他优秀的讲解 xff01 扩展欧几里得算法 先
  • 蓝桥杯:Python组再也不怕组合数计数

    有一类题目是是这样的 xff1a 要求我们从n个数中选m个 xff0c 问共有多少种取法 如果是用C 43 43 写的话 xff0c 要应用到Lucas定理 xff0c 暴力阶乘会超时 这里给大家介绍一个Python3 8 math库自带的
  • 模拟角频率和数字角频率的关系

    概念 xff1a 模拟频率f xff1a 每秒经历多少个周期 xff0c 单位Hz xff0c 即1 s xff1b 模拟角频率 xff1a 每秒经历多少弧度 xff0c 单位rad s xff1b 数字角频率w xff08 归一化角频率
  • 对于时不变系统的理解

    来源 xff1a 信号与系统 对 时不变性 判定的一点注记 知乎
  • 「STM32入门」TIM输出比较

    输出比较的简介 输出比较英文写作OC Output Compare 输出比较可以通过比较CNT和CCR寄存器值的关系 xff0c 来对输出电平进行置高或者置低或者翻转的操作 xff0c 用于输出一定频率和占空比的PWM波形常见应用例子如 x
  • 「数字信号处理」MATLAB设计 双音多频拨号系统

    前言 实验目的 xff1a 用Matlab模拟实现双音多频拨号系统 输入 xff1a 一串数字模拟电话号码 输出 xff1a 检测出的电话号码 Matlab版本 xff1a 2021b 系统 xff1a MacOS 实验方法 xff1a 查
  • 「STM32入门」TIM定时中断

    定时器的简介 定时器可以对输入的时钟进行计数 xff0c 并在计数值达到设定值时触发中断 xff0c 在中断内可以执行中断事件不仅具备基本的定时中断功能 xff0c 而且还包含内外时钟源选择 xff0c 主从触发模式 xff0c 输入捕获
  • 二极管反向恢复过程详细解析

    二极管反向恢复过程 xff0c 现代脉冲电路中大量使用晶体管或二极管作为开关 或者使用主要是由它们构成的逻辑集成电路 而作为开关应用的二极管主要是利用了它的通 电阻很小 断 电阻很大 特性 即二极管对正向及反向电流表现出的开关作用 二极管和
  • 性能优化总结

    性能优化关注点 从图中可以看出 xff0c 性能优化的主要关注 xff1a CPU 内存 磁盘IO 网络IO等四个方面 性能指标 每个关注点都有对应的指标 xff0c 吞吐率 响应时间 QPS IOPS TP99 资源使用率是我们经常关注的
  • Python:优先队列的使用及类的自定义比较函数

    Priority queue模块 该模块定义的优先级队列 xff0c 其内部使用了 heapq 模块 xff0c 所以它的时间复杂度和heapq是相同的 当一个对象的所有元素都是可比较的时 xff0c 默认情况下是根据队列中的对象的第一个元
  • 「STM32入门」USART串口通信

    通信 通信的目的 xff1a 将一个设备的数据传送到另一个设备 xff0c 扩展硬件系统 通信协议 xff1a 制定通信的规则 xff0c 通信双方按照协议规则进行数据收发 STM32常见的通信协议 本文将介绍USART 概念解释 TX R
  • 「数字信号处理」采样过程与内插恢复完整图解

    内插与采样的关系 来源 xff1a 数字信号处理 采样与内插 DSP期末知识点题型4 哔哩哔哩 bilibili
  • 配置vscode作为STM32代码的编辑器(替代keil5)。实现:代码自动补全, 编译,下载。nRF52也可以编译。

    STM32CubeMX新建好工程在工程根目录新建文件夹 vscode在 vscode 文件夹内新建文件c cpp properties json 34 configurations 34 34 name 34 34 STM32 34 任意的
  • Python中的字典

    1 字典概念 Python内置的数据结构之一 xff0c 与列表一样是一个可变序列 以键值对的方式存储数据 xff0c 字典是一个无序的序列 xff08 列表是有序的 xff09 字典通过计算key的hash值确定存储位置 xff0c 所以
  • docker中使用cuda

    需要注意的事项 1 注意应用NVIDIA在docker hub上提供的镜像 本次使用的是 nvidia cuda 10 1 cudnn7 devel ubuntu18 04 2 在宿主机安装 nvidia docker2 3 运行时 要加
  • Mysql8.0 忘记密码怎么办

    Mysql8 0 忘记密码怎么办 今天晨雨帮身边小伙伴解决了mysql8 0无法连接上的问题 中间碰到的一些问题和大家分享一下 跳过密码登录时不成功修改密码时不成功navicat连接时报 2000的问题 1 首先先停止mysql服务 可通过

随机推荐

  • Kurento实战之二:快速部署和体验,Java笔试题编程题

    GitCommit 269548fa27e0089a8b8278fc4fc781d7f65a939b runc Version 1 0 0 rc92 GitCommit ff819c7e9184c13b7c2607fe6c30ae19403
  • QT使用render时pixmap背景不为透明的解决办法

    当我们需要将一个界面绘制成图片时 xff0c 就需要使用到render方法 QPixmap pixmap pwidget gt size pwidget gt render amp pixmap 如果pwidget背景为透明时 xff0c
  • 【iOS】—— 高德地图SDK基础使用

    最近稍微学了学iOS调用高德的SDK xff0c 就随便做做笔记 注意 xff1a 本篇博客基于高德地图SDK的3D地图来写的 xff0c 若使用的是2D地图可能有的方法可能有所不同 xff0c 比如自定义定位蓝点之类的 一 准备工作 xf
  • 如何做代码Code Review

    预防胜于治疗 xff0c 研究表明高效的 Code Review 可以发现70 90 的 bug xff0c Review 作用如下 xff1a 提高团队代码标准 xff0c 所有人共享同一套标准 xff0c 阻止破窗效应 推动团队合作 r
  • 【iOS】—— 浅谈UISearchController

    UISearchController是iOS的一个系统的搜索控件 xff0c 在平时我们输入信息的时候会出现相应的联想搜索的内容 xff0c 然后通过UITableView展示到搜索框的下面 xff0c 供我们选择 原本还想用UITextF
  • Linux Shell中的正则表达式

    Linux Shell中的正则表达式 正则表达式是什么正则表达式通配符 cut命令awk命令sedsort排序命令wc统计命令 正则表达式是什么 正则表达式是用于描述字符排列和匹配模式的一种语法规则 它主要用于字符串的模式分割 匹配 查找及
  • 【Linux】刚烧录完(相当于是第1次连接),VNC树莓派无法连接

    文章目录 解决方法如下 xff1a 1 在Terminal中输入 96 vncserver 96 2 在Terminal中再输入 96 sudo raspi config 96 3 输入连接即可 刚烧录完 xff0c 然后用 ifconfi
  • QT 配置Opencv+gdal心得

    本人研究僧一枚 xff0c 老师给了使用QT开发遥感图像相关程序的课题 xff0c 完全从零开始学习 xff0c 查阅了许多的资料 xff0c 过程里东拼西凑 xff0c 碰壁无数 所以我就想写一些学习的心得体会 xff0c 给自己复习使用
  • Flink 从 kafka 中读取数据并输出到 kafka

    Kafka 是一个分布式的基于发布 订阅的消息系统 xff0c 本身处理的也是流式数据 kafka和flink二者被称为当前处理流式数据的双子星 下面我们将从以下几个步骤展开讲解 xff1a 目录 一 添加maven依赖 二 编写flink
  • 视图创建与管理实验

    xff08 一 xff09 在job数据库中 xff0c 有聘任人员信息表 xff1a Worklnfo表 xff0c 其表结构如下表所示 xff1a create table workinfo id int 4 not null uniq
  • LaTeX的篇章结构

    LaTeX的篇章结构 一般在撰写一个文档时 xff0c 总是先写出文章的提纲 然后根据该提纲进行展开 xff0c 来撰写其他的内容 文章目录 构建小节构建段落标题格式带章节大纲文档目录 构建小节 xff08 1 xff09 用section
  • LaTeX中的参考文献BibLaTeX

    LaTeX中的参考文献BibLaTeX 文章目录 一 介绍二 配置三 参考文献数据库文件四 引用文献1 导入宏包2 添加参考文献数据库3 不同方式引用参考文献4 输出参考文献列表5 编译执行6 修改标题7 列出没有引用的参考文献8 更多样式
  • 独立按键控制LED亮灭

    目录 一 独立按键 二 独立按键控制LED亮灭 三 按键的抖动 四 独立按键控制LED显示二进制 五 独立按键控制LED移位 一 独立按键 轻触按键 xff1a 相当于一种电子开关 xff0c 按下时开关接通 xff0c 松开时开关断开 x
  • 内网权限维持

    权限维持 以下测试均在win7 拓展方面 windows开启rdp 1 设置远程桌面端口 xff08 可以不用输 xff0c 直接第二步 xff0c 默认开启3389 xff09 reg add 34 HKLM System Current
  • 常见优秀代码汇总

    汇总常见的编程习惯 1 语义简单明确 含义 xff1a 写代码时考虑读者 xff0c 优先采取易于读者理解的写法 define THROTL UNSET 2 define THROTL NO LIMIT 1 bool throttle is
  • 2021/7/20

    8 xff1a 30 9 xff1a 00 学习打卡 9 xff1a 30 13 xff1a 00 二招刷题 15 xff1a 00 19 xff1a 00 二招刷题 1 xff0c a题 给你一个长度为N的序列 xff0c 现在需要把他们
  • python可安装软件的制作

    一 生成可执行文件 xff08 exe 安装打包工具pyinstaller 第一种 xff1a 通过win 43 R打开cmd直接使用下面的命令安装即可 pip install pyinstaller 第二种 xff1a 下载pyinsta
  • 汇编常见指令

    文章目录 常见的运算类汇编指令add指令sub指令mul乘法指令div除法指令inc xff08 自增 xff09 xff08 即C语言 43 43 xff09 dec xff08 自减 xff09 xff08 即 xff09 push x
  • 使用阿里云服务器三分钟搭建网站

    目录 一 购买服务器 二 配置云服务器 三 下载XShell编辑器 四 使用XShell与服务器建立连接 五 安装宝塔 六 配置宝塔 七 配置多个站点 一 购买服务器 注意一定要购买CentOS内核的服务器 二 配置云服务器 购买云服务器之
  • STM32 ---寄存器点灯

    1 创建工程 处理器执行程序的时候怎么执行 处理器执行程序都是先执行汇编程序 xff0c 然后在汇编程序里面跳到主函数里面 xff0c 所以要先写好汇编程序 不过这个一般官方提供了 xff0c 只需把这个文件拷到我们的工程文件夹里面 接着将