STM32 - 笔记3

1 开发有基于寄存器和HAL库

在开发 STM32 系列微控制器时,你可以选择基于寄存器的开发方法或使用 STM32 HAL(硬件抽象层)库进行开发。两者各有优缺点,适用于不同的场景和开发需求。下面详细介绍两种方法的特点、使用场景以及示例代码。

1. 基于寄存器的开发

特点
  • 精细控制: 基于寄存器的开发允许你直接操作硬件寄存器,因此你可以对微控制器的每个细节进行精细控制。
  • 高效性: 由于不依赖抽象层,代码执行效率更高,适用于对性能要求极高的应用。
  • 轻量化: 代码体积小,没有多余的库文件,适用于资源受限的应用场景。
  • 复杂性: 需要深入理解芯片手册,直接操作寄存器,学习曲线较陡。
使用场景
  • 资源有限的应用: 如对 Flash、RAM 等资源要求苛刻的项目。
  • 高性能实时控制: 需要精确控制硬件的场景,如工业控制、信号处理等。
  • 特殊硬件操作: HAL 库可能无法直接支持某些特殊的硬件操作,寄存器编程可以实现自定义控制。
示例代码

下面是一个基于寄存器的简单示例,设置 PA5 为输出并控制 LED 的亮灭:

#include "stm32f10x.h"int main(void)
{// 启用 GPIOA 时钟RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;// 配置 PA5 为推挽输出,速度为 50MHzGPIOA->CRL &= ~GPIO_CRL_CNF5; // 清除 CNF5 位GPIOA->CRL |= GPIO_CRL_MODE5_1 | GPIO_CRL_MODE5_0; // 设置 MODE5 位为 50MHz 输出while (1){// 设置 PA5 输出高电平GPIOA->BSRR = GPIO_BSRR_BS5;for (int i = 0; i < 1000000; i++); // 简单延时// 设置 PA5 输出低电平GPIOA->BSRR = GPIO_BSRR_BR5;for (int i = 0; i < 1000000; i++); // 简单延时}
}

2. 基于 HAL 库的开发

特点
  • 易于使用: HAL 库封装了对寄存器的操作,提供了更高级的 API,易于理解和使用,减少了开发者的工作量。
  • 可移植性: 使用 HAL 库可以更轻松地在不同 STM32 芯片之间移植代码。
  • 代码维护性: 由于 HAL 库有 ST 官方的长期支持,代码维护和更新相对容易。
  • 抽象层的开销: HAL 库的抽象层会引入一定的开销,可能在某些对性能要求较高的应用中不太适用。
使用场景
  • 快速开发: 对于产品开发周期较短的项目,HAL 库能显著加快开发速度。
  • 复杂外设操作: HAL 库提供了对复杂外设的支持,如 USB、CAN、以太网等,使用这些外设时 HAL 库更为方便。
  • 代码可读性和维护性: 适用于需要多人协作和长期维护的项目。
示例代码

下面是同样控制 PA5 引脚的代码示例,但使用了 HAL 库:

#include "stm32f1xx_hal.h"int main(void)
{// 初始化 HAL 库HAL_Init();// 启用 GPIOA 时钟__HAL_RCC_GPIOA_CLK_ENABLE();// 配置 PA5 为推挽输出GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);while (1){// 设置 PA5 输出高电平HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);HAL_Delay(500); // 延时 500ms// 设置 PA5 输出低电平HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);HAL_Delay(500); // 延时 500ms}
}

2 蓝牙电路 

蓝牙耳机及其放大电路实用设计汇总-电子发烧友网

3. 寄存器-1 通过绝对地址访问内存单元

// GPIOH 端口全部输出 高电平
*(unsigned int*)(0x4002 1C14)=0xFFFE;

 0x4002 1C14在我们看来是 GPIOH 端口 ODR 的地址,但是在编译器看来,这只是一个普通的变量,是一个立即数,要想让编译器也认为是指针,我们得进行强制类型转换,把它转换成指针即(unsigned int *)0x4002 1C14,然后再对这个指针进行*操作

4 4GB 的地址空间是以字节为单位进行寻址的

4GB 的地址空间是以字节为单位进行寻址的,这意味着每个地址对应一个字节(8位)。在现代计算机系统中,内存地址通常是按字节(Byte)来表示的,这也是为什么通常说 4GB 的地址空间能够寻址 4 * 1024^3 = 4,294,967,296 个字节。

详细解释:
字节寻址: 在大多数现代计算机中,内存是以字节为基本单位进行寻址的,也就是说,每一个地址值代表内存中的一个字节(8位)。因此,地址 0x00000000 指向内存中的第一个字节,地址 0x00000001 指向第二个字节,依此类推。

32位系统的4GB地址空间: 在32位系统中,地址由32位二进制数表示,因此可以表示的最大地址范围是从 0x00000000 到 0xFFFFFFFF,即4GB的地址空间。每个地址对应一个字节,因此可以寻址4GB的内存。

64位系统的更大地址空间: 在64位系统中,地址是由64位二进制数表示的,理论上可以表示的内存地址空间远大于4GB,实际上可以达到 2^64 字节(16EB,Exabytes)。不过,实际支持的内存大小还取决于操作系统和硬件的具体实现。

总结:
不论是 32 位还是 64 位系统,地址空间的步长通常都是 1 字节,也就是说,一个内存地址对应内存中的 1 个字节。

#include <stdio.h>
#include <stdlib.h>char global_char;  // 8位
char global_char_1;  short global_short;  // 16位
short global_short_1; int global_int;  // 32位
int global_int_1; float global_float;  // 32
float global_float_1; int main() {// 栈变量 -  8位char stack_char = 'a';char stack_char_1 = 'a';// 16位int stack_short = 42;int stack_short_1 = 42;// 32位int stack_int = 42;int stack_int_1 = 42;// 32位float stack_float = 42.2;float stack_float_1 = 42.2;// 打印地址// global printf("Address of global_char: %p\n", (void *)&global_char);printf("Address of global_char_1: %p\n", (void *)&global_char_1);printf("Address of global_short: %p\n", (void *)&global_short);printf("Address of global_short_1: %p\n", (void *)&global_short_1);printf("Address of global_int: %p\n", (void *)&global_int);printf("Address of global_int_1: %p\n", (void *)&global_int_1);printf("Address of global_float: %p\n", (void *)&global_float);printf("Address of global_float_1: %p\n", (void *)&global_float_1);// 栈变量printf("Address of stack_char: %p\n", (void *)&stack_char);printf("Address of stack_char_1: %p\n", (void *)&stack_char_1);printf("Address of stack_short: %p\n", (void *)&stack_short);printf("Address of stack_short_1: %p\n", (void *)&stack_short_1);      printf("Address of stack_int: %p\n", (void *)&stack_int);printf("Address of stack_int_1: %p\n", (void *)&stack_int_1);printf("Address of stack_float: %p\n", (void *)&stack_float);printf("Address of stack_float_1: %p\n", (void *)&stack_float_1);return 0;
}

5 比如,一块1000毫安时(mAh)的电池,如果设备的功耗是1瓦(W),在3.7伏的电压下,大约可以运行3.7小时;如果功耗增加到2瓦,运行时间则会缩短到1.85小时左右。 这个是如何计算的

6示波器比较

https://item.jd.com/62196675887.html

价格 - 374

5012H是一款单通道手持示波器,配备2.4寸高清液晶屏,带宽100mhz,采样率为500ms/s,具有完整的触发功能(单次,自动,常规),带有智能防烧可最高容忍400V持续电压和600V峰值电压,
支持一键自动调节波形,支持波形图片保存方便二次进行分析,可适用于家电维修,汽车维修,科研教育等各个领域。

https://item.jd.com/10111504192641.html

价格 - 219

DSO-510是一款集示波器和信号发生器二合一的仪器 示波器是10MHz带宽,48MS/s的实时采样率,有完整的触发功能(单次,正常,自动)。对于周期模拟信号及非周期的数字信号都能运用自如,
最高可测量±400V的电压,配备一键AUTO,无需繁琐调节即可显示被测波形~支持余晖,触发电平显示,波形移动,波形保存等功能,方便进行二次分析! 还带有多种函数信号发生器(50KHz),
支持14种信号波形输出,频率、占空比、幅值可调。 搭载2.8英寸320*240分辨率的高清液晶屏,内置1000mAh高品质锂电池,充满电后可连续使用4小时左右

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

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

相关文章

五、实现随机地图

一、创建场景 拖拽层级面板&#xff0c;删除摄像机 二、使用Addressable 给场景设置碰撞器 三、场景切换 场景中增加一个数据集合选择场景 四、字典 1、作用 根据列表中的RoomType查找数据 创建一个RoomDataSO的列表&#xff1b;创建一个字典&#xff0c;匹配房间类型和数据…

安装MySQL,navicat以及Django配置遇到的一些问题

MySQL安装问题 安装MySQL按照了此文章&#xff1a; MySQL数据库下载及安装教程&#xff08;最最新版&#xff09;_mysql下载安装-CSDN博客https://blog.csdn.net/weixin_39289696/article/details/128850498首先是遇到了starting the server红色叉号显示 按照上面文章的介绍…

故障诊断 | 基于小波时频图与Swin Transformer的轴承故障诊断方法(PyTorch)

文章目录 文章概述程序设计参考资料文章概述 基于小波时频图与Swin Transformer的轴承故障诊断方法 针对用传统的故障诊断方法难以对非线性非平稳的柴油机故障信号进行准确高效诊断的问题, 提出基于小波时频图与Swin Transformer的故障诊断方法。该方法可以有效结合小波时频分…

Luma AI,让你的视频像电影一样精彩!附带使用教程

Luma AI&#xff0c;让你的视频像电影一样精彩&#xff01;附带使用教程 随着 AI 的应用变广&#xff0c;各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多&#xff0c;从最初的写作&#xff0c;到医疗教育&#xff0c;再到现在的…

二叉树详解(进阶)

目录 1. 二叉搜索树 1.1 基本概念 1.2 基本操作 1.3 性能分析 1.4 键值对 2. AVL树和红黑树 2.1 AVL树 2.2 红黑树 3. 红黑树模拟实现STL中的map与set 1. 二叉搜索树 1.1 基本概念 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;&#xff1a…

Tomcat多实例部署

文章目录 Tomcat多实例部署一、安装好 jdk1.1设置JDK环境变量 image-20240820142906811二、安装 tomcat2.1配置 tomcat 环境变量2.2修改 tomcat2 中的 server.xml 文件2.3修改各 tomcat 实例中的 startup.sh 和 shutdown.sh 文件&#xff0c;添加 tomcat 环境变量2.4启动各 tom…

【学习笔记】卫星通信发展趋势

卫星通信系统是融合现代通信技术、航天技术与计算机技术的综合应用&#xff0c;已成为国际与国内通信、国防、移动通信及广播电视领域的关键基础设施。基于其频带宽度大、通信容量高、业务兼容性强、覆盖范围广、性能稳定、地理条件适应性高及成本与距离无关等特性&#xff0c;…

uniapp scroll-view滚动触底加载 height高度自适应

背景&#xff1a; scroll-view组件是使用&#xff0c;官网说必须给一个高度height&#xff0c;否则无法滚动&#xff0c;所以刚开始设置了<scroll-view :style"height: 94vh" :scroll-y"true">设置了一个高度&#xff0c;想着vh应该挺合适的&#xf…

PhpStorm2024版设置自动换行(软换行)

Settings > Editor > General > Soft Wraps 选中并加上对应的文件

面试SQL题的水到底有多深?一文带你揭晓

不谋万世者&#xff0c;不足谋一时&#xff1b;不谋全局者&#xff0c;不足谋一域 目录 0 面试现状 1 面试SQL题目的难度及特点 1.1 题目场景化 1.2 题目算法化 1.3 方法多元化 2 破局之道 3 总结 数字化建设通关指南 主要内容&#xff1a; &#xff08;1&#xff09;SQL进阶实…

四、监控搭建-Prometheus-采集端批量部署

四、监控搭建-Prometheus-采集端批量部署 1、背景2、目标3、传承4、操作4.1、准备部署工具4.2、编制部署脚本4.3、服务端添加客户端 1、背景 在前三篇中我们搭建了Prometheus平台&#xff0c;采集端部署和配合图形化grafana部署&#xff0c;将Linux主机进行监控。基本完成了一…

『功能项目』怪物反击主角复活【14】

本章项目视频展示 当前文章成果展示 我们打开上一篇13技能爆炸与伤害数值显示的项目&#xff0c; 新建一个脚本InfoSystem.cs 新建一个游戏管理器GameManager.cs 在场景中创建一个空物体命名为GameManager 将GameManager.cs脚本挂载至空物体GameManager对象身上 增添PlayerRayC…

【SpringBoot】电脑商城-10-商品功能

商品热销排行 1 商品-创建数据表 1.使用use命令先选中store数据库。 USE store;2.在store数据库中创建t_product数据表。 CREATE TABLE t_product (id int(20) NOT NULL COMMENT 商品id,category_id int(20) DEFAULT NULL COMMENT 分类id,item_type varchar(100) DEFAULT N…

Loki Unable to fetch labels from Loki (no org id)

应该是多租户相关导致的 参考文档: 参考文档cMulti-tenancy | Grafana Loki documentationDescribes how Loki implements multi-tenancy to isolate tenant data and queries.https://grafana.com/docs/loki/latest/operations/multi-tenancy/ https://github.com/grafana…

【Git 学习笔记_23】Git 实用冷门操作技巧(二)——妙用 git bisect 与 git blame 进行代码调试

文章目录 11.3 用 git bisect 进行调试11.4 使用 git blame 命令 本节所在位置&#xff1a; 活用 git stash&#xff08;上&#xff09;保存并应用 stash&#xff08;上&#xff09;用 git bisect 进行调试&#xff08;二&#xff09;✔️使用 git blame 命令&#xff08;二&am…

零基础Opencv学习(三)

概述&#xff1a;主要目的是为了在图像中获取所需要的特征信息&#xff0c;比如直线或者圆等 一、标准霍夫变换 cv::Mat midImage, dstImage;/// 边缘检测 转化灰度图cv::Canny(image, midImage, 50, 200, 3);cv::cvtColor(midImage, dstImage, CV_GRAY2BGR);/// 进行霍夫线变…

浅谈SpringMvc的核心流程与组件

一、SpringMvc的核心流程 当发起请求时被前置的控制器(DispatcherServlet)拦截到请求&#xff0c;根据请求参数生成代理请求&#xff0c;找到请求对应的实际控制器&#xff0c;控制器处理请求&#xff0c;创建数据模型&#xff0c;访问数据库&#xff0c;将模型响应给中心控制…

ubuntu24下python3.9安装pytorch

安装gpu版pytorch 1.去官网查找命令 https://pytorch.org/get-started/previous-versions/由于我们安装的是CUDA12.1&#xff0c;所以我们选择12.1的进行安装 安装完成之后通过下面代码进行测试 >>> import torch >>> print(torch.cuda.is_available()) T…

Linux入门攻坚——30、sudo、vsftpd

su&#xff1a;Switch User&#xff0c;即切换用户 su [-l user] -c ‘COMMAND’ 如&#xff1a;su -l root -c ‘COMMAND’ 如果没有指定-l user&#xff0c;则默认是root sudo&#xff1a;可以让某个用户不需要拥有管理员的密码&#xff0c;而可以执行管理员的权限。 需…

raw.githubusercontent.com未能解析” 解决方案

1.操作场景 通过windows11 powershell 下载依赖包 2.报错信息如下 irm : 未能解析此远程名称: raw.githubusercontent.com 所在位置 行:1 字符: 27 & ([scriptblock]::Create((irm "https://win11debloat.raphi.re/"))) ~~~~~~~~~…