STM32 - 笔记3

news2024/9/22 0:57:31

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

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

1. 基于寄存器的开发

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

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

#include "stm32f10x.h"

int main(void)
{
    // 启用 GPIOA 时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

    // 配置 PA5 为推挽输出,速度为 50MHz
    GPIOA->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小时左右。 这个是如何计算的

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

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

相关文章

头条/微头条文章采集洗稿发布软件(文字版)说明文档/使用教程

大家好&#xff0c;我是淘小白~ 今天给【头条/微头条文章采集洗稿发布软件】做一个文字版的使用说明文档&#xff01; 旧版说明文档&#xff08;含视频&#xff09;&#xff1a;https://blog.csdn.net/u012917925/article/details/141280090 注意&#xff1a;软件版本一直在…

JS实现不同网页间的数字员工与数据存储

一、目标任务&#xff1a; 要去 https://sjfw.scjs.net.cn:8801/xxgx/Enterprise/eList.aspx 根据企业名称查询到统一社会征信代码。 然后拿统一社会征信代码去 https://rzsc.sczwfw.gov.cn/portal/newOrg/orgRegister.jsp 查询法人信息。 最后两个页面不断跳转进行信息存储…

pythonnet-C#调用python脚本-含matplotlib+biopython

本地环境&#xff1a; win10&#xff0c;.NET Core 6&#xff0c;Python 3.9.13&#xff0c;pythonnet 3.0.3 测试的包&#xff1a;biopython 1.82&#xff0c;matplotlib 3.5.2 参考&#xff1a; GitHub - pythonnet/pythonnet: Python for .NET is a package that gives Py…

FPGA 如何进入 AI 领域的思考

FPGA在AI领域如何发力&#xff0c;如何抢碗饭吃&#xff1f;大多数提到是硬件加速&#xff0c;在AI工程里&#xff0c;完成数据前处理&#xff08;加速&#xff09;。大家很少提到AI模型的本身的推理过程&#xff0c;让FPGA成为AI模型的推理/算力芯片&#xff0c;这自然是 FPGA…

家校互动实现方案

目前&#xff0c;家校互动正成为最重要的校园场景之一。 大家都知道我主要做萤石的二次开发&#xff0c;这边也是给出了一个利用萤石开放平台的解决方案。 主要功能如下&#xff1a; 1.门禁管理&#xff0c;告警推送 2.可多人通过小程序看画面 3.电子班牌-父母微信一键通话…

第二代骁龙8平台手机nubia Z5拆解

这周末&#xff0c;除非外面下钞票&#xff0c;否则谁也拦不住我玩《黑神话悟空》&#xff08;附&#xff1a;两款可以玩转悟空的显卡推荐&#xff09; 天玑助力联发科力压高通~探秘MTK 5G旗舰智能手机SoC芯片——MT6989&#xff08;天玑9300&#xff09; 第二代骁龙8平台手机…

html+css+js网页设计 个人博客10个页面

htmlcssjs网页设计 个人博客10个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xf…

图像基础(2)视频信号和图像数字化的理论

#灵感# 继续读书&#xff0c;主要是视频信号相关。 视频实际上是按时间轴排列的一组图像序列。模拟图像在空间位置上有连续性&#xff0c;每一个位置上光的强度变化也有连续性。 1、视频信号分为3类&#xff1a; 分量视频、复合视频、S-Video. 分量视频是将原始视频信号&am…

无人机的工业应用场景

一、监测与检查 电力巡检&#xff1a;工业无人机在电力巡检中发挥着重要作用&#xff0c;能够替代人工进行高空、高风险作业&#xff0c;提高电网巡视效率&#xff0c;降低运维成本。通过搭载高清相机、红外热成像等设备&#xff0c;无人机可以实时传输电力线路状态&#xff0…

开放式耳机哪个品牌的好用?热榜口碑开放式耳机测评集锦!

现在市面上的开放式耳机真的越来越多&#xff0c;但是开放式耳机哪个品牌好用呢&#xff1f;可能不了解开放式耳机的就会开始犯难了&#xff0c;所以到底该怎么样选择才能选出一款比较适合自己的开放式耳机呢&#xff1f;根据这个问题&#xff0c;我作为一名耳机测评师&#xf…

【操作系统】实验:文件系统

目录 一、实验目的 二、实验要求 三、实验步骤 四、核心代码 五、记录与处理 六、思考 七、完整报告和成果文件提取链接 一、实验目的 1、掌握文件系统的基本结构和文件系统的管理方法 2、加深对两级文件目录认识和理解 3、对文件操作的系统命令实质内容和执行过程深入…

python例子:使用pygame实现五彩烟花

作品介绍 作品名称&#xff1a;使用pygame实现五彩烟花 开发环境&#xff1a;PyCharm 2023.3.4 python3.7 用到的库&#xff1a;pygame、random、sys、math 作品简介&#xff1a;该实例是一个使用 Pygame 库实现的烟花效果模拟程序。 实现过程 一、初始化Pygame pygame.…

如何在没有密码的情况下从 iPad 中删除 MDM?100% 工作

如果您遇到已使用远程管理锁恢复的 iPad 或 iPhone&#xff0c;您将需要远程管理器的登录信息。 从 iPad 中删除 MDM可能很困难&#xff0c;尤其是在您没有正确的权限的情况下。在寻求帮助时&#xff0c;许多客户访问 Apple 的官方论坛&#xff0c;却发现问题并不总是容易解决。…

java中的原子性

在Java中&#xff0c;原子性&#xff08;Atomicity&#xff09;是并发编程中的一个核心概念&#xff0c;指的是一个或多个操作在中间状态对其他线程不可见&#xff0c;且不可被线程调度机制中断的性质。一个原子操作要么全部执行成功&#xff0c;要么完全不执行&#xff0c;不会…

第136天:内网安全-横向移动资源约束委派

利用条件 首先是dc域控主机必须是win2012以上的主机 其次是域内有一个账户&#xff0c;可以同时登录两台主机 利用 jie 可以登录 win2008 也可以登录 win7 资源委派不需要设置委派&#xff0c;默认即可 实验复现 复现环境 通过网盘分享的文件&#xff1a;136-xiaodi.local…

天宝TBCTrimble Business Center中文版本下载安装使用介绍

天宝TBC&#xff1a;测绘之道&#xff0c;尽在其中 引言 昔日杜甫&#xff0c;忧国忧民&#xff0c;今朝我辈&#xff0c;测绘天下。天宝TBC&#xff0c;乃测绘之利器&#xff0c;助我等行走于山川河流之间&#xff0c;绘制天地之图。此文将以杜甫之笔&#xff0c;述说TBC之妙…

C_05_编译4阶段

c语言编译的4个阶段&#xff1a;预处理、 编译、 汇编、 链接 预处理阶段会在源代码中查找预编译指令&#xff0c;其中主要是头文件展开&#xff08;include)&#xff0c;宏定义&#xff08;defind&#xff09;&#xff0c;选择性编译&#xff08;ifdef&#xff09;三种指令 预…

【ArcGIS/GeoScene Pro】离线许可归还不了

问题&#xff1a; 解决方案&#xff1a; 将一下项置空即可&#xff0c;让后重新获取许可信息

网络安全售前入门01——产品了解

目录 1.概述 2.常见网络安全产品 2.1下一代防火墙&#xff08;NGFW&#xff09; 3.后续 1.概述 为方便初入网络安全售前工作的小伙伴了解网安行业情况&#xff0c;我制作一系统售前入门&#xff08;安全产品&#xff0c;安全服务&#xff0c;法律法规等&#xff09;介绍&am…

AI创新,DataOps聚能 | 白鲸开源DTCC共话DataOps新篇章

近日&#xff0c;由IT168联合旗下ITPUB、ChinaUnix两大技术社区主办的第15届中国数据库技术大会&#xff08;DTCC 2024&#xff09;隆重召开。大会以“自研创新 数智未来”为主题&#xff0c;吸引了数百位行业专家和广大数据领域从业者共聚这场年度数据库技术交流盛宴&#xff…