自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 嵌入式开发工程师成长计划

单片机工程师的2年成长计划

2022-07-07 13:50:00 3476 3

原创 嵌入式实用网站

✔✔LVGL百问网✔Freertos开发文档✔Linux命令大全✔C标准库✔牛客网✔野火。

2024-04-06 19:03:00 403

原创 C#基础知识总结

C# 读作 "C Sharp",这是一种面向对象的高级编程语言,由微软公司开发。C# 是 .NET 框架的主要编程语言之一,广泛用于开发 Windows 应用程序、网页应用程序以及各种其他软件项目。"Sharp" 这个词在音乐领域表示升半音,因此 C# 的名称暗示着它是对 C 语言功能的一种扩展或提高。C# 教程 | 菜鸟教程虽然 C# 的构想十分接近于传统高级语言 C 和 C++,是一门面向对象的编程语言,但是它与 Java 非常相似,有许多强大的编程功能,因此得到广大程序员的青睐。

2024-03-30 17:31:06 2260 1

原创 如何一步一步地优化LVGL的flash占用

LVGL使用的空间包括内存和Flash。其中,内存分为LVGL管理的内存空间+还有一部分是刷新的缓冲区。如果内存够用,两块空间可以都放到内部RAM,如果内部RAM不够用,就可以将刷新缓冲区放到外部RAM中,然后使用全屏刷新,用空间换时间。而flash也分为两部分,一部分是代码,另一部是是素材文件,一般lvgl使用的素材主要有图片和字体,这些数据稍微多一些就很容易导致内部flash不够用。这种情况下要怎么办呢?这种方式局限性太大。

2024-03-27 20:15:37 1354

原创 LVGL线条和画布功能

线条部件由多个点连接而成,它可用于修饰界面或者展示数据。要注意这里的描述,线条是由多个点连接而成的。线条部件只有一个组成部分:主体线条是由多个点连接而成的对象,用户可以使用lv_point_t类型的数组存储这些坐标点,并调用函数,把这些坐标点传递给线条部件,它将会把这些点连接起来,最终绘制成线条。接下来,我们以简单示例来理解线条连接点的设置,示例代码如下所示:在上述源码中,我们先创建连接点相关的数组,然后创建一个线条部件,最后将点数组传入到线条部件中,其将会把这些点连接起来。

2024-03-27 19:41:14 1409

原创 Gui guider使用自定义字体总结

打开GUI-Guider-1.4.0-GA,点击工具-导入字体导入的字体格式支持ttf/woff/woff2三种格式。不过,很多时候我们下载到的字体格式可能是.otf,比如此时,可以强制将.otf后缀改成.ttf后缀,如下直接将otf等字体的后缀名改为ttf导入,一样是可以使用的。导入后,就会在字体选项中出现对应的字体此时,我们就可以在使用标签部件时选择对应的自定义字体了。然后在生成代码时,就会自动转换字体注意,每个按钮都有个默认值,如果我们不使用这个默认值可以将其删除掉。

2024-03-27 19:30:54 1200

原创 FREERTOS内存管理

FreeRTOS 创建任务、队列、信号量等的时候有两种方法,一种是动态的申请所需的 RAM。一种是由用户自行定义所需的 RAM,这种方法也叫静态方法,使用静态方法的函数一般以“Static”结尾,比如任务创建函数 xTaskCreateStatic(),使用此函数创建任务的时候需要由用户定义任务堆栈,本章我们不讨论这种静态方法。使用动态内存管理的时候 FreeRTOS 内核在创建任务、队列、信号量的时候会动态的申请RAM。

2024-03-20 19:35:44 783

原创 FREERTOS任务通知

任务通知在FreeRTOS中是一个可选的功能,要使用任务通知的话就需要将宏定义为1。FreeRTOS的每个任务都有一个32位的通知值,任务控制块中的成员变量ulNotifiedValue就是这个通知值。任务通知是一个事件,假如某个任务通知的接收任务因为等待任务通知而阻塞的话,向这个接收任务发送任务通知以后就会解除这个任务的阻塞状态。也可以更新接收任务的任务通知值,任务通知更新时可以有如下几种选项:● 更新时不覆盖接收任务的通知值如果上次发送给接收任务的通知还没被处理。

2024-03-20 19:25:40 600

原创 FREERTOS空闲任务和低功耗

当FreeRTOS的调度器启动以后就会自动的创建一个空闲任务,这样就可以确保至少有一个任务可以运行。但是这个空闲任务使用最低优先级,如果应用中有其他高优先级任务处于就绪态的话这个空闲任务就不会跟高优先级的任务抢占 CPU资源。空闲任务还有另外一个重要的职责,如果某个任务要调用函数删除自身,那么这个任务的任务控制块TCB和任务堆栈等这些由FreeRTOS系统自动分配的内存需要在空闲任务中释放掉,如果删除的是别的任务那么相应的内存就会被直接释放掉,不需要在空闲任务中释放。

2024-03-20 19:13:42 809

原创 FREERTOS软件定时器

软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器调用的这个功能函数叫做定时器的回调函数。有时候我们可能会在定时器正在运行的时候需要复位软件定时器,复位软件定时器的话会重新计算定时周期到达的时间点,这个新的时间点是相对于复位定时器的那个时刻计算的,并 不是第一次启动软件定时器的那个时间点。也提供了定时器功能,不过是软件定时器,软件定时器的精度肯定没有硬件定时器那么高,但是对于普通的精度要求不高的周期性处理的任务来说够了。是这个函数的中断版本,可以用在中断服务函数中。

2024-03-20 19:03:06 943

原创 FREERTOS队列集和事件标志组

一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集!作用:用于对多个队列或信号量(信号量本质上也是个队列)进行“监听”,其中不管哪一个消息到来,都可让任务退出阻塞状态。假设:有个接收任务,使用到队列接收和信号量的获取,如下:如果不使用队列集,而是使用常规的多个队列的方式这样如果第一行被阻塞,那么第二行也就得不到执行。但是如果使用的是队列集只要其中有一个队列有效即可,我们可以根据队列的句柄来执行不同的动作。队列集相关API函数。

2024-03-20 08:01:59 691

原创 FREERTOS信号量详解

信号量常常用于控制对共享资源的访问和任务同步。举一个很常见的例子,某个停车场有100个停车位,这100个停车位大家都可以用,对于大家来说这100个停车位就是共享资源。假设现在这个停车场正常运行,你要把车停到这个这个停车场肯定要先看一下现在停了多少车了?还有没有停车位?当前停车数量就是一个信号量,具体的停车数量就是这个信号量值,当这个值到100的时候说明停车场满了。

2024-03-19 21:52:17 1113

原创 FREERTOS队列详解

队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之间要交流的数据保存在队列中,叫做。

2024-03-19 20:29:55 936

原创 FREERTOS时间管理

在使用FreeRTOS的过程中我们通常会在一个任务函数中使用延时函数对这个任务延时, 当执行延时函数的时候就会进行任务切换,并且此任务就会进入阻塞态,直到延时完成,任务重新进入就绪态。延时函数属于FreeRTOS的时间管理,本章我们就来学习一些FreeRTOS的这个时间管理过程,看看在调用延时函数以后究竟发生了什么?任务是如何进入阻塞态的,在延时完成以后任务又是如何从阻塞态恢复到就绪态的。

2024-03-18 20:37:20 849

原创 FREERTOS任务调度和切换

我们已经学会了FreeRTOS的任务创建和删除,挂起和恢复等基本操作,并且也学习了分析FreeRTOS源码所必须掌握的知识:列表和列表项。但是任务究竟如何被创建、删除、挂起和恢复的?系统是怎么启动的等等这些我们还不了解,一个操作系统最核心的内容就是多任务管理,所以我们非常有必要去学习一下FreeRTOS的任务创建、删除、挂起、恢复和系统启动等,这样才能对FreeRTOS有一个更深入的了解。本章和下一章要讲解的内容和Cortex-M处理器的内核架构联系非常紧密!

2024-03-18 20:30:44 955

原创 FREERTOS列表和列表项

可以看出迷你列表项只是比列表项少了几个成员变量,迷你列表项有的成员变量列表项都 有的,没感觉有什么本质区别啊?新创建或者定义的列表需要对其做初始化处理,列表的初始化其实就是初始化列表结构体List_t 中的各个成员变量,列表的初始化通过函数。注意,列表项的删除只是将指定的列表项从列表中删除掉,并不会将这个列表项的内存给释放掉!向列表中插入一个列表项的时候这个列表项的位置是通过列表项的值,也就是列表项成员变量。所指向的列表项就代表列表头!有列表项的插入,那么必然有列表项的删除,列表项的删除通过函数。

2024-03-18 19:26:10 611

原创 FREERTOS中断配置和临界段

本文基础内容参考的是正点原子的FREERTOS课程。这是基于HAL库的这是基于标准库的。

2024-03-18 07:49:11 634

原创 FREERTOS任务详解

本文基础内容参考的是正点原子的FREERTOS课程。这是基于HAL库的这是基于标准库的基础知识,直接参考正点原子《FreeRTOS开发指南V1.1》基于标准库的,此处不再赘述。本文主要对不理解的地方进行查缺补漏,并且先用起来,涉及到原理的部分,可以观看上述教学视频或者开发指南。回想一下我们以前在使用51AVRSTM32单片机裸机未使用系统的时候一般都是在main函数里面用while(1)做一个大循环来完成所有的处理,即应用程序是一个无限的循环,循环中调用相应的函数完成所需的处理。

2024-03-16 23:11:47 935 1

原创 FREERTOS简介、移植和系统配置(基于STM32F103)

2024 年官网现在已经更新中文了。官网参考手册:FreeRTOS 内核快速入门指南注意事项:官网进入比较慢,API估计都进不去。这时如果需要查看API,可以查看正点原子给的几个文档在这几个文档里搜索一下应该就能找到,可以优先看中文文档,没有的话再看英文文档。freertos特点由此可见,freertos的代码量并不高,主要是实现的任务调度。首先获取源码,我们可以从官网下载最新版本的源码我们也可以直接拿正点原子的源码来使用实际中我们可以直接拿对应MCU移植例程中的源码来用。

2024-03-14 22:47:48 782

原创 基于Gui Guider进行LVGL的页面绘制和移植

GUI Guider是恩智浦为LVGL开发了一个上位机GUI设计工具,可以通过拖放控件的图形化设计方式开发LVGL GUI页面,加速GUI的设计。相比LVGL官方推出的付费工具 SquareLine Studio ,GUI Guider完全免费,它们甚至开发页面的布局都类似,但两者功能上,GUI Guider也相应的没有SquareLine Studio 细致和丰富,希望NXP能持续的优化更新。

2024-03-13 11:23:23 1931

原创 LVGL如何创建页面并实现页面的切换

第一部分:先定义所有的页面对象,并在初始化时创建好所有的屏幕页面,因为后续会释放屏幕的内存空间,但是并不会删除对象,所以初始时就创建好,而且后续操作页面就会基于这些变量进行,从而利用面向对象的思路使得操作更加简便,同时也避免了每次进入页面时都要重新创建一个新的屏幕(这样新建的屏幕的指针可能每次都不一样);还有一种就是切换页面时,先删除前一个页面,再创建新的页面。此时,我们可以在切换之前,释放之前屏幕上的内存,注意,用的是函数lv_obj_clean,而不是lv_obj_del,因此并不是删除原来的屏幕。

2024-03-07 20:40:13 1809

原创 LVGL常用部件使用总结之图片部件

图片部件可用于显示图片,图片源可以是C语言数组格式的文件、二进制的.bin文件以及图标字体。值得注意的是,图片部件要显示 BMPJPEG等格式的图片,则必须经过解码。图片部件的组成部分仅有一个:主体(图片部件的图片来源分为三种:C语言数组;存储在外部的图片文件;图标字体(详见8.2 章节)。

2024-03-02 09:53:21 991

原创 LVGL常用部件使用总结之标签部件

,其后续的文本将会换行。注意和文本区域部件作区分,文本区域部件是文本框,可以让我们在里面输入文本。如果用户想把文本分为两段进行显示,则可在内容的末尾添加“中,标签部件常用于文本显示,例如标题、提示文本等。这里的标签部件就是单纯的文本部件。用户需要让标签文本着色,可以调用。官方提供了一些与标签部件相关。这个部件其实就是文本部件。

2024-03-02 08:47:58 272

原创 LVGL的基础知识总结

另外,还有自定义字库的使用,具体可参考开发手册。

2024-02-29 22:45:34 2217 1

原创 如何一步一步地优化LVGL的丝滑度

经过一番周折将LVGL移植到了STM32F407单片机上,底层驱动的LCD是st7789,移植时的条件和环境如下:●LVGL用的是单缓冲,一次刷新10行;●刷新函数用的是最原始的一个一个打点的方式;●ST7789底层发送数据用的是软件spi;在这些环境下,刷屏就是在拉窗帘,特别慢。接下来,一步一步地进行优化。

2024-02-28 23:06:19 1918 4

原创 LVGL配置文件lv_conf.h详解

lv_conf.h是一个用户级别的文件,它不属于内核的部分,因此,在不同的工程中,该文件有可能存在差异。lv_conf.h文件具有两大功能:(1)配置功能:内存、屏幕刷新周期、输入设备的读取周期,等等;(2)裁剪功能:使能失能某些功能,有效地优化Flash的分配。

2024-02-27 23:21:29 1015

原创 基于ILI9341的TFT-LCD屏幕显示要点总结

目前,市面上常见的TFT-LCD驱动芯片的原理都是大同小异的,这篇文章是基于驱动芯片ILI9341来说的。其实,只要弄懂了一种IC的原理,其他的都是差不多的,具体差异看一下具体芯片的数据手册就能明白了。另外,对于TFT-LCD来说,使用并口刷新肯定是更优的选择,但是也有很多小屏幕用的是SPI接口。这篇文章参考的视频里用的是并口。

2024-02-25 11:34:06 1542

原创 数字信号处理:信号采样与恢复、滤波器

到这里就引出了奈奎斯特采样定理,只有满足采样定理采样时,才能让信号恢复,也就是说,只有满足采样定理,采样到的离散信号才能正确反映原信号的信息,你想想,如果采样后的信号都没法恢复到原信号,而是跟原信号不一样,那么它反映的也不是原信号的信息了。因为采样在时域里要通过和一系列移位的冲激串相乘,但是冲激串在频域里也是一系列的冲激串,并且对应的运算是卷积,所以就会将被采样信号的频谱不断卷积搬移形成周期延拓。注意,FIR的输出只和输入有关,IIR的输出不仅和输入有关,还和以前的输入有关。频域里相乘对应的是时域的卷积。

2024-02-22 23:34:20 700

原创 数字信号处理:傅里叶分析

傅里叶分析的主要研究内容如下所示:注意,计算机中使用的离散傅里叶变换并不是离散时间傅里叶变换;前四种都是理论上的变换方式,最后一种是计算机应用中的变换方式。

2024-02-21 22:59:18 1852

原创 数字信号处理:信号和系统

从而可以将模拟角频率和采样角频率归一化得到数字角频率,即每一拍走过的间隔,其实就是差分的概念,因此才会有数字角频率的单位是弧度rad,而不是一个速度的概念,其实也是速度的概念,但是因为间隔是一个单位,所以除以1就等于每一拍走过的间隔。x(t)的连续信号经过采样后,就会离散化,t=nTs表示连续时间通过采样转换成了节拍点,采样周期Ts,则每隔Ts的时间就会有一个离散点,也就是说离散序列的间隔就是Ts,各个节拍点就是1Ts、2Ts、3Ts、4Ts……先将其中一个信号反折,然后依次移位后相乘并求和,如下。

2024-02-20 22:44:38 772

原创 数字信号处理:信号的合成与分解

注意:我们并不需要得到原波形的函数到底是什么样的,甚至可能原波形都没法用某个函数来表示,但是,如果原波形是个周期信号,我们可以直接用傅里叶级数来表示,所体现的是频率分量的频率和对应的幅度值。我们先简单地想一想,傅里叶级数展开后有直流分量,有正弦,有余弦,如果我们知道它的正弦谱、余弦谱以及直流分量的值,那么就能根据频率和幅值写出原波形的傅里叶级数了。实际上,负频率是没有物理意义的,仅仅是因为数学上的形式分解所带来的,所以实际应用时,我们会使用单边谱,就算是双边谱,也会转换成单边谱来分析。

2024-02-18 23:17:53 891

原创 线代:认识行列式、矩阵和向量

一般会由方程组来引出行列式比如一个二阶行列式二阶行列式的计算就是主对角线的乘积减去副对角线的乘积;再看看三阶行列式举个例子帮助理解行列式越往高阶越复杂。二阶和三阶的尚且可以通过上面的方式来暴力求解,但是阶数高了就比较麻烦了。所以就需要研究行列式的各种性质。那到底什么是行列式呢?上面的计算方式又是怎么定义的呢?首先,我们回顾下全排列的概念其实就是一组数有多少种排列组合,其结果就是n的阶乘。再来看下逆序以及逆序数的概念逆序是一种状态,而逆序数是指这种状态的数量,要注意区分。

2024-02-18 17:49:15 1636

原创 高等数学:微分方程和差分方程

类比微分方程来看下所以到底什么是差分方程呢?另外,我们在上面说过,高阶差分可以转换成低阶差分,最后逐级转换成某几个序列点的加减计算,所以,差分还有另一种等价的定义形式。注意:多个时刻的函数值不能少于两个。

2024-02-18 10:48:18 996

原创 姿态传感器MPU6050模块的姿态解算

对比DMP和自己进行姿态解算:使用DMP我们可以直接得到四元数,但是如果不用DMP的话,就得自己来进行解算,根据得到的各轴角速度以及加速度,再经过滤波,接着计算出四元数或者欧拉角,然后还得进行姿态融合。前者更便捷,但是灵活度差,精度不是特别高;后者麻烦,但是算法处理得当的话,就能有很高的精度。一般应用使用DMP即可。

2024-02-15 22:38:04 3407

原创 姿态传感器MPU6050模块的基本使用总结

随着科技的发展,我们经常看到有人用平衡车代步、使用无人机进行航拍。但这些是怎么实现的呢?平衡车和无人机在使用的时候是怎样保持平衡与稳定的呢?其实,平衡车和无人机在内部都用到陀螺仪传感器和加速度计传感器,用来检测车体的姿态以及运动时发生的变化,再通过各方面的共同协调配合,从而保持平衡车和无人机的平衡与稳定。本文主要介绍MPU6050的原理及应用。

2024-02-15 22:00:37 1976

原创 姿态传感器MPU6050模块之陀螺仪、加速度计、磁力计

MEMS侧重于超精密机械加工,常见的产品包括MEMS加速度计、MEMS麦克风、微马达、微泵、微振子、MEMS光学传感器、MEMS压力传感器、MEMS陀螺仪、MEMS湿度传感器、MEMS气体传感器等等以及它们的集成产品。以陀螺仪为例,早期的陀螺仪是机械式的,体积很大,想要将其应用于嵌入式系统显然是不可能的,所以就需要利用一些新技术,将这些运动的测量与电子电路相融合,使得体积更小,精度更高,从而能够嵌入芯片之中,实现高度集成化。MEMS技术的目标是通过系统的微型化、集成化来探索具有新原理、新功能的元件和系统。

2024-02-15 21:32:29 1189

原创 基础-《信号与系统》内容复习

在信号与系统中,我们可以利用连续时间信号与系统的理论进行信号的分析,比如信号的频谱特性、系统的稳定性等。在数字信号处理中,我们则主要关注信号的处理过程和能实现的功能,比如图像的增强、语音的识别等。而在应用方面,信号与系统和数字信号处理也有一些不同的重点。信号与系统广泛应用于电子电路、通信系统、控制系统等领域,可以用于信号处理、系统建模、系统设计等。而数字信号处理则主要应用于数字通信、多媒体处理、医学图像处理、声音处理等领域,可以用于图像处理、语音识别、语音合成、数据压缩等。

2024-02-02 16:49:32 922

原创 高等数学:积分

一个函数求导得到导函数,那么原来的函数就是这个导函数对应的原函数,很好理解。连续函数一定有原函数。

2024-02-01 22:39:28 920

原创 高等数学:微分

相对于导数来说,微分其实不是很好理解。一开始我就理解错了,把dy就理解成了△y,但二者并非完全等价的关系。那到底什么是微分呢?先看一个小的引例:试问,这里如果用2x0*△x来近似替代△A,是否可行呢?为了解决这个疑惑,我们就要先学习微分这个概念。由微分的定义可知,因为A*△x,即dy相对于△y来说少了个高阶无穷小,所以二者并非完全等价。事实上,微分dy就是函数的增量△y的近似表示,当△x无限趋近于0时,二者才越来越接近,这就是“以直代曲”的极限逼近思想,也是微分的核心思想。微分的几何意义。

2024-01-31 23:22:18 696

原创 高等数学:导数

这里的h表示就是一个△x二者是等价的,因为x->x0和(x - x0)->0是同一个意思。

2024-01-30 22:32:00 904

空空如也

空空如也

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

TA关注的人

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