自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(78)
  • 收藏
  • 关注

原创 基于 STM32F407 的 SPI Flash下载算法

本文将介绍如何使用 MDK 创建STM32F407的SPI Flash下载算法。其中,SPI Flash芯片使用的是W25Q128,其相关操作源码可以参考STM32 通过 SPI 驱动 W25Q128,本文所使用的驱动 SPI Flash 的 API 和里面是一样的。单片机的 Flash 下载算法是一个 FLM 文件,FLM 通过编译链接得到,其内部包含一系列对 FLASH 的操作,包括初始化、擦除、写、读、校验等等操作。想要制作下载算法,先要了解下载算法的工作原理。下载工具(比如jlink。

2024-10-06 17:09:25 2046 13

原创 分散加载文件 scatter files

当链接器创建镜像文件时,它会创建一些 ARM 预定义的与域或者节相关的符号。这些符号就代表了链接器创建创建镜像的依据。链接器定义了一些 ARM 保留的符号,我们可以在需要时访问这些符号。这些符号是包含$$字符序列的符号以及所有其他包含$$字符序列的外部名称。我们可以导入这些符号地址,并将它们作为汇编语言程序的可重定位地址使用,或者将它们作为 C 或 C++ 源代码中的extern符号来引用。如果使用--strict编译器命令行选项,则编译器不接受包含的符号名称。要重新启用支持,请在编译器命令行中包含。

2024-10-02 14:39:55 4971 9

原创 ROM、RAM 和 Flash 的区别

在计算机的组成结构中,有一个很重要的部分,就是存储器。存储器是用来存储程序和数据的部件,对于计算机来说,有了存储器,才有记忆功能,才能保证正常工作。存储器的种类很多,按其用途可分为主存储器和辅助存储器,主存储器又称内存储器(简称内存),辅助存储器又称外存储器(简称外存)。外存通常是磁性介质或光盘,像硬盘,软盘,磁带,CD 等,能长期保存信息,并且不依赖于电来保存信息,但是由机械部件带动,速度与CPU相比就显得慢的多。

2024-10-02 10:12:17 1571 3

原创 基于 STM32F407 的串口 IAP

STM32 芯片启动过程。从地址取出 MSP(主堆栈寄存器)的值从地址取出 PC(程序计数器)的值然后取出第一条指令执行不过,STM32 比较特殊,它对地址做了一个重定向(由 MCU 启动配置决定的),一般它是将地址映射到从地址取出 MSP(主堆栈寄存器)的值从地址取出 PC(程序计数器)的值然后取出第一条指令执行为什么要设置到,而不直接使用?

2024-10-01 16:39:05 6162 9

原创 hex 文件和 bin 文件剖析

二进制文件()是一种以二进制形式存储的计算机文件,其中的数据以字节为单位进行编码。二进制文件可以包含任意类型的数据,如图像、音频、视频、可执行文件等。与之相对的是文本文件,文本文件使用字符编码(如 ASCII 或 Unicode)表示数据。十六进制文件(Hex File)是一种特殊的二进制文件,其中的数据以十六进制表示。每个十六进制数对应 4 个二进制位,因此可以更直观地查看和编辑二进制数据。十六进制文件常用于存储和传输机器码(即可执行文件),特别是在处理嵌入式系统中常见的固件或软件升级时。

2024-09-30 11:03:05 6883 19

原创 浅析 Keil 中的 sct 文件

当工程按默认配置构建时,MDK 会根据我们选择的芯片型号,获知芯片的内部 FLASH 及内部 SRAM 存储器概况,生成一个以工程名命名的后缀为*.sct的分散加载文件(),链接器根据该文件的配置分配各个节区地址,生成分散加载代码,因此我们通过修改该文件可以定制具体节区的存储位置。可以设置源文件中定义的所有变量自动按地址分配到外部 SDRAM,这样就不需要再使用关键字按具体地址来指定了;

2024-09-29 15:29:08 5221 12

原创 FreeRTOS 内存管理源码解析

heap_1.c所实现的内存管理方法十分简单,其可以使用函数来申请内存,一旦申请成功了,便无法被释放。其实现大致可以用一句话概括,在堆空间剩余时,按需分割出内存,并记录已用的内存大小。heap_1.c使用的内存管理算法虽然简单,但对于许多嵌入式应用场景是适用且有效的。与heap_1.c不同,heap_2.c允许使用函数来释放申请的内存,其算法原理是将空闲堆分为若干个大小不等的内存块,并将其按大小排序,使用单向链表连接起来。申请内存时,便从这些链表中寻找最小可满足申请需求的内存块进行分配。

2024-09-28 13:29:24 8313 27

原创 Git 基本操作

由上图所示,分支 cherry 的 commit bf221cb05,被复制到分支 master,并创建了 1 个新的提交 93cfeef。如果你的远程仓库已经是创建好的,并且要提交的分支上有内容的话(push 时会提示远程库与本地库不一致造成的错误,如下图),要先。当我们不想要之前提交的修改时,就会用到这个命令。软重置会将 HEAD 移至指定的提交(或与 HEAD 相比的提交的索引),而不会移除该提交之后加入的修改!Git 管理项目时,文件流转的三个工作区域:Git 的工作目录,暂存区域,以及本地仓库。

2024-09-26 15:53:21 9874 17

原创 STM32 时钟树(基于 STM32F407)

STM32 内部也是由多种多样的电路模块组合在一起实现的。当一个电路越复杂,在达到正确的输出结果前,它可能因为延时会有一些短暂的中间状态,而这些中间状态有时会导致输出结果会有一个短暂的错误,这叫做电路中的“毛刺现象”,如果电路需要运行得足够快,那么这些错误状态会被其它电路作为输入采样,最终形成一系列的系统错误。

2024-09-25 15:32:02 11481 25

原创 STM32 map 文件浅析

map文件是编译器链接时生成的一个文件,它主要包含了交叉链接信息。通过.map文件,我们可以知道整个工程的函数调用关系、FLASH和RAM占用情况及其详细汇总信息,能具体到单个源文件(.c/.s)的占用情况,根据这些信息,我们可以对代码进行优化。

2024-09-24 21:48:08 12431 19

原创 LVGL 控件之消息框(lv_msgbox)

lv_objlv_btnlv_label和部件,示意图如下所示:消息框充当弹出窗口。它们由一个内容区域构建而成,该区域有一个辅助工具用于添加文本,一个可选的头部(可以包含标题、关闭按钮和其他按钮),以及一个可选的底部配有按钮。文本将被自动折行为多行,并且高度将被自动设置。如果手动设置了高度,内容将变为可滚动的。消息框可以是模态的(阻止对屏幕其余部分的单击) 或者不是模态的。

2024-09-24 19:31:30 948 4

原创 STM32 通过软件模拟 I2C 驱动 24Cxx 系列存储器

下表是AT24CXXX 的容量AT24C01,AT24C02,AT24C04,AT24C08,AT24C16,AT24C32,AT24C64,AT24C128,AT24C256… 不同的 xxx 代表不同的容量。AT24CXXXbit容量Byte容量AT24C011Kbit128ByteAT24C022Kbit256ByteAT24C044Kbit512ByteAT24C088Kbit1024ByteAT24C1616Kbit2048ByteAT24C3232Kbit。

2024-09-23 12:34:28 13656 37

原创 STM32 通过 SPI 驱动 W25Q128

// ctl_spi.h#ifndef __CTL_SPI_H#define __CTL_SPI_Hvoid spi_init(void);uint8_t spi_read_write_byte(uint8_t tx_data);#endif /* __CTL_SPI_H */

2024-09-21 13:33:00 17294 25

原创 BLE 协议之链路层

在BLE 协议之物理层一文中,我简单介绍了 BLE 的物理层。接下来就是链路层(Link Layer)了,它主要的功能,就是在这些上收发数据,与此同时,不可避免的需要控制 RF 收发相关的参数。通道共享仅仅提供了有限的 40 个,而 BLE 中参与通信的实体的数量,肯定不是这个数量级。Link Layer需要解决的共享问题抽象出逻辑链路:通信是两个实体之间的事情,对这两个实体来说,它们希望看到一条为自己独享的传输通道(就是我们所熟悉的 逻辑链路,这也是Link Layer需要解决的可靠传输。

2024-09-20 12:42:30 18640 21

原创 LVGL 控件之仪表盘(lv_meter)

仪表盘部件可以非常灵活地展示数据,其功能包括显示弧形(arcs)、指针(needles)、刻度线(ticks lines)以及标签(labels)。这意味着它可以模拟各种仪表盘样式。:主体背景;:仪表的刻度;:仪表指针;:圆弧。

2024-09-19 19:11:07 19343 11

原创 STM32 芯片启动过程

下面主要讲解从上电复位到 main 函数的过程。初始化中断向量表配置系统时钟调用 C 库函数_main初始化用户堆栈,然后进入main函数至此,启动过程圆满结束!

2024-09-18 16:56:24 21824 23

原创 BLE 协议之物理层

物理层()是 BLE 协议栈最·底层,它规定了 BLE 通信的基础射频参数,包括信号频率、调制方案等。BLE 工作频率是 2.4GHz,它使用 GFSK 频率调制,并使用跳频机制来解决频道拥挤问题。1M Sym/s 的无编码物理层2M Sym/s 的无编码物理层1M Sym/s 的编码物理层其中 1M Sym/s 的无编码物理层与 BLE v4 系列协议的物理层兼容,另外两种物理层则分别扩展了通信速率和通信距离。

2024-09-17 10:34:45 22537 27

原创 结构体内存对齐

int a;char b;char c;char b;int a;char c;思考一下node1和node2的大小分别为多少?我是在 Windows 下 MinGW32 的 GCC 测试的一样的成员属性,但node1只有 8K,而node2的大小却有 12K。由此可见,结构体对齐,实质上就是内存对齐。

2024-09-16 11:54:29 21889 21

原创 LVGL 控件之列表(lv_list)

List(列表) 基本上是一个垂直布局的矩形,按钮指向该矩形并且可以添加文本。使用所有典型背景属性的列表的主要部分滚动条。

2024-09-15 13:27:02 9660 9

原创 LVGL控件之表格(lv_table)

Table(表格)是由包含文本的行、列和单元格构建的。表格对象非常轻量级,因为仅存储文本。没有为各个单元格创建真实的对象,因为它们只是即时绘制出来的。表格对象默认已经在默认组中(如果已设置)。可以在导航模式下选中整张表,之后进入编辑模式可以在各个单元格之间进行移动选择。表格的背景使用了所有典型的背景样式属性。表格的单元格也使用所有典型的背景样式属性和文本属性。

2024-09-14 17:56:04 9587 11

原创 LVGL 控件之滑动条(lv_slider)

滑动条对象看起来像是在 进度条 增加了一个可以调节的旋钮,使用时可以通过拖动旋钮来设置一个值。就像进度条(bar)一样,Slider 可以是垂直的或水平的(当设置进度条的宽度小于其高度,就可以创建出垂直摆放的滑动条)。滑动条的背景。使用所有典型的背景样式属性。设置 padding 样式会使指标在相应方向上变小。显示滑动条当前状态的指示器。也是使用所有典型的背景样式属性。旋钮(可以是原形或矩形)。也是使用所有典型的背景属性。默认情况下,旋钮是方形的(带有可选的圆角半径),边长等于滑动条的较小边。

2024-09-13 11:19:58 11938 22

原创 MQTT 协议概述

MQTT,消息队列遥测传输协议),是一种基于发布/订阅()模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由 IBM 在 1999 年发布,并于 2013 年发布为开放标准。MQTT协议专注于在低带宽、不稳定或高延迟的网络环境中,可靠地传输小型数据包。MQTT的协议开销小,适用于资源受限的设备,如传感器、物联网设备等。MQTT支持多种传输层协议,如TCP/IPWebSocket等。它还提供了 QoS()级别,以确保消息的可靠传输。MQTT。

2024-09-12 16:40:42 25696 7

原创 LVGL 部件之滚轮(lv_roller)

滚轮类似下拉列表,和下拉列表不同的是,滚轮有直接可见的几个选项,我们可以通过滚动滚轮中的列表来浏览并选择选项。滚轮部件由两个部分组成:主体背景和所选文本。主体背景;所选文本。

2024-09-11 16:21:09 13280 11

原创 LVGL 控件之线条(lv_line)

线条部件只有一个组成部分:主体。通过一组点绘制出相连的直线,通过创建相应的对象。

2024-09-10 20:08:33 13093 13

原创 LVGL 控件之标签(lv_label)

(主体背景)使用所有典型的背景属性和文本属性。填充值可用于在文本和背景之间添加空间。(滚动条)当文本大于组件的大小时显示的滚动条。(所选文本)告诉 selected text 的样式。只能使用 text_color 和 bg_color 样式属性。

2024-09-09 21:44:34 13732 7

原创 Linux 下 C/C++ 程序编译的过程

本文将介绍如何将 C/C++ 语言编写的程序转换成为处理器能够执行的二进制代码的过程,包括四个步骤:预处理()编译()汇编()链接(在此之前,首先来看一下 GCC 工具链。

2024-09-08 15:52:17 30743 37

原创 FreeRTOS 队列 Queue 源码解析

在一文中,我简单地叙述了FreeRTOS中队列的工作机制和基本使用。这一节我将依据的源码深入地去探究队列是如何实现的。学好队列对我们后续学习信号量等知识的时候有很大的帮助。

2024-09-06 10:03:33 32995 26

原创 ELF 文件格式

ELF 是一种常用的可执行文件和可链接库格式。它是一种通用的二进制文件格式,用于在 Unix 和类 Unix 系统上进行可执行文件和库的存储和传输。

2024-09-05 20:50:54 33422 11

原创 LVGL 控件之复选框(lv_checkbox)和下拉列表(lv_dropdown)

下拉列表的图标箭头默认是向下的,如果用户修改了列表的展开方向,此时的箭头方向和展开方向就对应不上了。在上图中, 当用户选中第一个选项,其文本内容(a)将更新到列表头部,如果用户需要设置列表头部的文本为固定内容,可以调用。上述源码中,第一个函数用于获取选中的选项索引,第二个函数用于获取选中的选项文本,并将其保存到指定的 buf 中。上述的函数只会添加一个选项,其形参 pos 表示添加的位置,注意:0 表示列表最上面的位置,以此向下类推。,前者设置的文本是保存在动态分配的内存中的,而后者设置的是静态的文本。

2024-09-05 08:54:59 22270 22

原创 LVGL 控件之图表部件(lv_chart)

前面提过,图表部件默认只支持 10 个数据点,如果我们具有11 个数据,那么图表先显示前 10 个数据,而第 11 个数据会将图表的 10 个数据逐一往左移位,最后把第一个数据点的数值去除了。前面我们讲解到图表部件只支持 10 个数据点,如果我们使用这个函数初始化数据点,则这些数据点的数值都是一样的。此函数主要修改某个数据点的数值,前面我们讲到图表部件默认只支持 10 数据点,这些数据点是从 0 开始自增。添加到当前图表中,该函数具有八个形参,这些形参主要设置刻度线和刻度线的标签。图表默认的垂直范围为。

2024-09-02 09:39:49 24898 41

原创 单片机内存区域划分

/ val1存放在.data段// 初始化的全局变量存放在.data段// 未初始化的全局变量存放在.bss段// val4存放在.rodata(只读数据段)unsigned char Demo(unsigned int num) // num 存放在栈区// var存放在栈区,"123456"存放在常量区// num1存放在栈区// num2存放在.data段// num3存放在栈区void *p;// p存放在堆区free(p);return 1;

2024-09-01 18:09:25 40715 25

原创 LVGL 控件之日历(lv_calendar)

在默认的情况下,日历都是以英文的形式展示(Su、Mo、Tu、We、Th、Fr 和 Sa),如果用户想设置成中文的日名,可调用。在默认的情况下,当用户创建出一个日历部件,该部件的当前日期为 2020 年1 月1 号,如果用户需要设置日期,则可以调用。如果我们仅仅是设置了当前日期,日期部件并不会自动显示该日期,所以我们必须手动跳转当前日期对应的月份,相关的函数为。可以看到,刚才创建的日历除了能看当前月的信息外什么都干不了,所以要加上日历头方便我们操作。:如果单击日期,则发送该事件,通过调用函数。

2024-09-01 10:40:39 27453 19

原创 LVGL 控件之矩阵按钮(lv_buttonmatrix)

按钮矩阵部件中的每个按钮都可以设置文本,如果用户想设置这些按钮文本,则需要定义一个字符串数组(指针),并在该数组中传入所需的文本内容,最后通过。在默认情况下,按钮矩阵中的按钮文本都是黑色的,如果用户需要设置文本为其他的颜色,则必须先调用。在默认情况下,按钮矩阵每一行按钮的宽度都是自动计算的,如果用户想改变按钮的宽度,可以调用。,在设置完文本颜色之后,我们还需要为按钮添加文本重着色的属性,其相关的枚举为。值得注意的是,在按钮矩阵部件中,按钮只能设置相对宽度。函数,为按钮添加文本重着色的属性。

2024-09-01 09:37:14 27573 5

原创 LVGL 控件之按钮(lv_button)

按钮部件(lv_btn)仅有一个组成部分:主体背景,示意图如下:与LVGL 控件之基础对象(lv_obj)) 相比,按钮没有新功能。它们可用于语义目的,并且默认设置略有不同。不可滚动添加到默认组默认高度和宽度设置为button 对象通过创建。因此,这里不再过多叙述 button 的一些东西,这里主要讲一下样式的设置。

2024-08-31 10:14:56 29889 16

原创 LVGL 控件之进度条(lv_bar)

进度条对象(lv_bar)有一个背景和一个指示器。指示器的宽度根据进度条的当前值自动设置。如果设置进度条的宽度小于其高度,就可以创建出垂直摆放的进度条。。不仅可以设置结束,还可以设置进度条的起始值,从而改变指标的起始位置。背景():用于显示范围值;指示器():用于显示当前值。

2024-08-31 09:06:47 28954 5

原创 LVGL 控件之圆弧(lv_arc)

前景弧的角度范围不能超过背景弧的角度范围,否则将会出现显示异常,该异常会在下次更新布局时被修正。圆弧部件旋转是指将整个部件沿顺时针方向旋转某个角度,注意:旋转的角度为相对值(增量),它的范围是。默认情况下,圆弧部件是沿顺时针方向绘制的,如果用户需要修改绘制的方向,可以调用。当圆弧的旋钮被滑动时,前景弧将根据设定的变化率来绘制。度,旋转中心为圆弧的中心。例:当我们拖动按钮或圆弧时,中间的数值也会实时变化。来设置圆弧的值,若用触摸设置,可能会出现显示异常。指的是当前前景弧所指示的值,而。

2024-08-30 15:25:09 30309 19

原创 LVGL 控件之基础对象(lv_obj)

管理其他部件的基本属性;作为背景装饰;辅助布局;界面切换。坐标父对象基于父对象的后代包含样式诸如ClickableScrollable等属性。在面向对象的思想中,基础对象就是LVGL 中所有其他对象都继承自的基类。基础对象的功能可以与其他控件一起使用。例如基础对象可以直接用作一个简单的控件:它只不过是一个矩形。在 HTML 术语中,将其视为 。

2024-08-30 11:04:08 30556 1

原创 FreeRTOS 列表 List 源码解析

FreeRTOS 使用的链表结构是环形的双向链表,而关于链表节点的数据结构都在list.h中定义。

2024-08-29 14:35:11 42398 25

原创 蓝牙BLE协议讲解

蓝牙技术起源于爱立信在 1994 年提出的方案,旨在解决移动电话和其他配件之间进行低功耗、低成本的无线通信连接的方法。蓝牙是一种近距离无线通信技术,运行在 2.4GHz 免费频段,目前已大量应用于各种移动终端,物联网,健康医疗,智能家居等行业。上一小节提到,蓝牙 4.0 以后的版本分为两种模式,单模蓝牙和双模蓝牙。单模蓝牙,即低功耗蓝牙模式,是蓝牙 4.0 中的重点技术,低功耗,快连接,长距离。双模蓝牙,支持低功耗蓝牙的同时还兼容经典蓝牙,经典蓝牙的特点是大数据高速率,例如音频、视频等数据传输。

2024-08-27 16:08:10 42217 27

原创 Linux 下 gdb 的使用

GDB(GNU调试器)是一个功能强大的开源调试工具,可用于调试多种编程语言,包括 C、C ++、Fortran 等。它可以在运行过程中检查程序状态,设置断点以停止程序执行并观察变量值、内存状态等,并提供一系列命令和功能来辅助调试过程。GDB设置断点GDB允许你在程序的某一行代码上设置断点,当程序执行到这一行时会暂停并等待调试命令。单步调试:通过单步调试,你可以逐行执行程序并观察每一行代码的执行情况,方便定位问题。查看变量和内存:在调试过程中,你可以查看各个变量的值,检查它们是否符合预期。

2024-08-26 15:09:40 36534 35

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除