自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 printf 输出格式总结(C语言)和C 中的类型提升规则、默认整型提升

【代码】printf 输出格式总结(C语言)和C 中的类型提升规则、默认整型提升。

2025-05-29 09:57:43 123

原创 对于ARM开发各种手册的分类

2025-05-27 11:01:44 356

原创 移植easylogger通过J-Linker的RTT输出日志/Ozone的RTT设置

移植easylogger

2025-05-08 22:24:18 776

原创 移植的本质是什么

,然后链接器会将这些目标文件和库文件链接成最终的可执行文件。当你添加了一个库(比如 LVGL 或 FreeRTOS)到项目中,即便你没有显式调用库中的函数,编译器和链接器仍然会处理该库中的代码,尤其是当库中有全局变量、宏或初始化代码时,编译器和链接器可能会自动识别出某些依赖。所谓的移植成功,就把库文件包含进来,单纯的编译就是来排除他们直接各种全局变量、宏或初始化的依赖关系,移植成功就是把这些依赖关系处理成功,也就是所谓的跑通!在 C/C++ 中,编译器会将每个源文件编译为目标文件(这里涉及到一个知识,

2025-05-06 21:40:08 280

原创 关于用SysTick配置延迟函数的设置

SysTick:系统定时器,和普通定时器类似,它也可以定时,但是却是有特殊用途。它有24bits,定时器最大数值是2^24,并且计数时是向下递减计数,每次递减1,递减一次的时间是1/SYSCLK,一般来说SYSCLK为72MHz。当寄存器中的值减少到0时,会产生一个中断信号,进而执行相应的中断服务函数。

2025-05-03 14:43:54 584

原创 OTA(Over-The-Air)升级

OTA(Over-the-Air)是一种通过无线方式进行数据传输和更新的技术,通常用于电子设备(如智能手机、汽车、物联网设备等)的软件、固件或配置更新。OTA可以在设备与服务器之间进行远程传输,用户无需将设备接入电脑或进行有线操作。通过OTA,用户只需要通过Wi-Fi或移动网络连接,便能自动接收并安装最新的更新,而无需手动干预。OTA的优点是便捷和高效,能够确保设备随时保持最新状态,同时减少用户的操作负担。:如智能家居设备、路由器、汽车等硬件设备的固件更新。:确保设备上的应用保持最新版本。

2025-04-29 17:58:05 701

原创 在Linux虚拟机下使用vscode,#include无法跳转问题

同样还可能是你在vscode的json中指定的编译器路径无权限的话,也会出现目录无法跳转,Permission denied,存在波浪线问题(这种情况可以在Linux下重现赋予权限)如果你直接从window中拖入文件到Linux文件下,你需要自己来再度开启可编译权限,不然会出现这种情况。总结:需要通过Linux指令来添加编译器和压缩文件,解压,这样获得的编译器会具有可执行权限类似于。

2025-04-26 17:18:38 591

原创 关于CH-05的使用和简单教程

记录下日常接线,这里串口3对应的是COM18接口,串口1对应的是COM19接口,串口0对应的是COM20接口,串口2对应的是COM21接口。我使用的是逻辑分析仪,他可以同时作为USB转TTL模块使用。

2025-04-24 15:21:01 152

原创 关于使用ARMcc和gcc编译C文件的整个流程

c文件预处理生成.i文件.i文件编译生成.s文件.s文件汇编生成.o文件.o文件链接生成 .axf文件最后使用fromelf或类似工具生成 .bin文件(纯二进制文件)这个流程适用于嵌入式开发环境,特别是使用 Keil 的 ARM 开发板。

2025-04-20 15:36:46 420

原创 LVLG移植 和 头文件内添加相对路线的思考(附加bug解决)

我们只需要在lv_lint.h文件中写#include"stdlib/lv_mem.h"来直接调用/lv_mem.c函数不用再在keil里面添加/lv_mem.h的路径。lvgl.h中添加#include“../src/stdlib/lv_mem.h”即可,../是返回上一级文件的意思,同时./是当前同一级文件下的意思,经常省略。我翻找widgets文件下一个随意的C文件,一层层往上翻找,发现所有的子文件C的头文件都被添加到lvgl.h中↓。

2025-04-18 11:11:59 284

原创 Freertos中互斥量和信号量(通过串口实现)的思考

错误分析:因为这个是通过二值信号量等待数据发送完成触发中断,在中断中将信号量返回,我自己倒好,在初始化里面就给了初始值,导致不需要等数据发送完成,代码就会继续往下运行,从而导致下一个任务不到一个TICK就启动,然后导致DMA崩溃......错误分析:因为在等待数据发送完成的过程中,任务1进入到堵塞状态,其他任务开始启动,将DMA的数据和启动的CMD重新配置了,导致DMA发送的崩溃。:通过USART1_TX发送请求来触发DMA数据的转运,通过二值信号量和互相信号量来保护数据的完整发送。

2025-04-15 09:54:28 207

原创 关于怎么覆写标准库里面的原函数

新开一个文件,包含要覆写函数的头文件,然后在新开文件里面行数原型下覆写,就能实现覆写目的。ps:如果是自己覆写的函数要覆写掉可以使用weak命令。

2025-04-12 13:51:06 222

原创 #define和typedef的用法,及其区别

/ 相当于 union { int i;// p1 和 p2 都是 Point 类型的指针。这个c是char*类型的,d只是单纯的unsigned char的变量。// 相当于 int arr[10];大部分时候#define就是单纯的替换,将自己于后面内容替换。// 相当于 int* ptr;你可以为函数指针类型定义别名,使得函数指针的声明更加简洁。结构体的指针)的别名。的别名,相当于定义了一个固定大小的整数数组。是结构体类型的别名,表示一个包含。这两个a,b都是char*类型的。

2025-04-01 10:56:02 847

原创 关于volatile参数的使用

volatile参数的使用,如果在执行一个函数的时候,他会自己分配栈,同时对没有加volatile的变量进行优化,优化过程是将他们放入寄存器内,后面直接快速读取,但是一旦变量修改后,他也不会去内存读取,导致数据读取的错误。

2025-03-21 14:07:04 190

原创 头文件没定义也不会报错?下面探讨下

下面解答,因为都是放入头文件引用,你会在目标文件调用FreeRTOS.h,FreeRTOS.h中有包括了freertos_config.h,那么在目标文件编译阶段(#include)就会将两个文件相互拼接在一起,但是这个时候是不编译的,所以不会报错,同时程序会得知预编译阶段的所有信息,那么进入编译的时候就会从下面补齐TickType_t的定义。下面文件中TickType_t的定义是在其他文件,但是这里没有特别引用相关头文件。

2025-03-12 21:59:22 220

原创 如何移植freertos

在portable文件中我们还需要memmang目录下的heap_4文件,common目录下的mpu_wrappers文件,RVDS下整个ARM_3内核的文件(其他内核选别的文件)首先我们谷歌搜索freetos,进入官网,然后进入GitHub下载10.4.3版本。最后还需要FreeRTOSConfig.h文件,这个我放在文章最上面,已经配置好了。下载好后可以看看,只有选中这些文件需要其他都不是源文件,可以删除。之后就正常加入keil5工程即可(添加文件路径之类)需要一点魔法进入外网。

2025-03-12 17:05:11 164

原创 栈的概念介绍和在RTOS中如何使用栈

因为在每个任务里面都有自己的调用关系,有自己的局部变量,即使调用相同一个函数,每个任务的值也不一样,同时任务切换的时候,这时要把寄存器里面的数值都保存在栈里面,等待恢复。恢复是时候就找到A任务的结构体,然后再找到A的栈,先将寄存器恢复,最后恢复PC指针这样程序就可以继续运行。任何一个函数任务的调用都会使用到栈,下面我们看看栈的最基础用法,在下面连接文章的最底部。程序知道要执行下一个函数的时候,就会执行push指令,将lr压入栈中,进行保存。下面的栈多次待用LR,但是LR只有一个,这不就覆盖了?

2025-03-11 17:35:15 438

原创 MCU进阶笔记(运用rtos和OTA升级,使用标准库开发)

ps:这个文章会把我学习到的内容和一些失误点罗列下来,提供自己以后参考,这个总笔记介绍脉络,里面会附上其他笔记的连接硬件:芯片使用的是stm32f407ve芯片(标准库追高只支持到F4芯片 )下面是基础知识——————————ARM框架简明-CSDN博客堆的概念简介-CSDN博客

2025-03-11 15:19:58 194

原创 堆的概念简介

如果我们将其中一块的空间释放,会让最后一块头指针指向要释放地址的头部,这样下次申请空间先查询全局链表指向的头部,查看空间是否充足,如果不充足,在查询该头部指针指向的下一个头部空间,依次查找。如下图所示,我们有一段空间可以使用,如果我们只是单纯的分配了空间,比如分配出100空间,那我们想要去释放掉着一部分空间,我们的free函数要从哪里获取释放空间的长度呢?堆就是一段内存中的空间,我们可以进行调用可以,那么我们来看看在RTOS中是如何使用堆的。上面的介绍类似于heap_3,下面更高级的可以将相邻空间合并。

2025-03-11 14:36:21 140

原创 ARM框架简明

然后使用BL,跳转到add函数里面,将LR设置为返回地址(注:add后面的地址是要执行函数的地址,LR里面保存的地址的0x08002a32 )CPU里面也有寄存器用来临时存储要处理的数据,Flash存储汇编指令,CPU读取指令,然后去内存里面读取数据进行计算,再返回。剩下两步,将sp指针出的值存入r0位置,后面将r1-r3数值依次弹出,将lr数值弹到pc指针处跳转到下一次命令。第三步执行第三条指令将sp指针往上八位的数据依次存入,r0,r1地址。下面介绍汇编指令的执行流程,来更充分的理解CPU的执行过程。

2025-03-11 14:04:51 372

原创 如何使用程序调用ST7735芯片驱动显示器

我们看下面生成的字模(对应像素的八bit数据),我们看到前三个是两个十六进制数值,十六进制对应就是四个二进制,两个十六位就是八个二进制,八个二进制就可以操纵八个像素的点亮和熄灭。RGB就是三原色不同的调配,先看RGB888,就是每个色块都有八位可以表达2的八次方(256),所以RGB565总共可以表达两个字节的数据,来显示一个像素位置的颜色。字模的前三个都是0x00,所以前三行都是熄灭,我们看到第四位(用箭头标注),0x3E,二进制是0011 1110,对应中间五位点亮,我们看图也能看出来。

2025-03-07 17:02:03 1178

原创 用esp 32C3芯片获取天气和时间的代码思路

这里看看可以看到我们有了基础的轮子esp_usart_write_data,再进行一层保证变为esp_usart_write_string,后面还会在发送命令中进一步包装,目的就是你不要理解内部原理,直接当成工具调用即可,抽象为一个能够批量 使用的模块,不用每次都因为输入数值不同而调整,这就是面向对象的思想。同时我们可以看到,这里写了一个回调函数,用来将其他文件的函数进行接受,回调函数的用处就是可以直接使用其他文件配置好各种参数的函数,不用再次设置,下面是书写发送命令,和接收参数并且识别参数的函数。

2025-03-03 22:08:14 479

原创 ESP 32C3芯片的使用流程

选择这个下载,下载好后解压固件包,里面有中文的使用手册,下面是硬件连接图,我们通过usb数据线下载固件,然后通过下面的串口模块给芯片发送命令,进行启动。接下来我们打开串口工具,这里你开始发是没反应的,我们需要再摁一下reset摁键,将芯片启动,就会返回第一个ready,记得打开加回车换行。注意:接入USB接口前需要一直摁着BOOT摁键,在接入电脑,不然会一直弹出无法连接到电脑。固件我们直接搜索谷歌,找到esp32的官网,在下面这里下载固件。有两个摁键,图上右边的是BOOT摁键,左边是RESET摁键。

2025-02-27 15:29:33 483

原创 vscode协同keil使用教程

具体就是可以通过你写的注释/代码/参数预测你一下一行代码或者代码补足。需要下载gcc编译器,讲下载好的编译器位置进行输入,需要改\为/符号。然后是定语和一些选择当然上面这些步骤也能直接在json文件中配置。这个需要注册github账号,然后用vscode登录才能使用,配置好后就可以进行文件引用的跳转,同时也不会报错。用来去除空行和末尾空格,在代码最后加一段空行。智能注释,会根据你写的代码对应生成注释。摁住ctrl+p跳转到搜索,输入。添加头文件路径和keil一样。3.对c/c++进行配置。

2025-02-25 09:32:22 348

原创 基于STM32的天气时钟项目复现(B站up:七月梅花香)

C语言进阶:面向对象的变成思维方式,回调函数的灵活使用,各种高级参数 const,static,typedfy,各种字符串地址和直接赋值的高级用法,包括显示器的底层逻辑。1.iconfont网站:阿里巴巴的矢量图标库,本次项目用来下下载天气对应图标(像素为48x48)2.LVGL网站:用于将图片变成我们需要的数列组合,选择Rgb565模式进行转换(与显示器对应)2.EditorcConfig for vs code:在项目文件夹下新建,将。这样可以使得每次保存都会删除代码后面的空格,同时在最下面保留换行。

2025-02-24 11:23:39 520 7

原创 直接赋值给字符串指针和字符串数组的不同点

结论:直接赋值给指针,指针指向的存储区域是只读区域,所以只能读取不能修改。

2025-02-21 15:22:11 125

原创 字符串原理题

字符串打印的原理

2025-02-16 23:15:01 126

原创 PC 和 SP 的协同工作

PC 和 SP 的协同工作

2025-02-16 16:59:57 111

原创 STM32开发的初级准备工作

上面是工程基本框架,app放main文件,driver放各种驱动,mdk放keil工程文件,firmware放库文件,third-lib放后期移植。然后再keil里面定义,这个是在寄存器文件中的,定义这个他就会接入我们上面的库头文件。启动文件,我们这里是64k的,所以用md,根据自己需要选择启动文件。下载标准库,搜stmf103stdlibrary下载。最后配置路径,工程框架就完成了,别忘了建立main文件。最后把库文件(没贴图)和模板的库头文件和中断文件。下载keil5,破解。

2025-01-19 22:13:32 248

原创 关于指针地址增加逻辑举例子:int*p,int*(p+1)

因为+x的底层逻辑是跳过多少个变量类型的地址,int类型地址长度是4 字节的内存空间,所以+1,就是跳过四个字节。假设p的地址为ox000010,那么(p+1)地址为ox00014,为什么不是ox00011呢。如果换成double类型的呢,那个p+1,就是跳过一个double类型8字节的内存空间。

2025-01-17 22:34:18 109

原创 一个关于不使用volatile的小bug

因为编译器进行了优化,将全局变量的值储存到了某个寄存器,后面函数会一直读取寄存器中的内容,但是这个值是老的,未更新,导致程序卡死。我加入volatile不让 编译器去优化,让他一直读取内存中g_calc_end的值即可。这两个任务是靠全局变量g_calc_end来进行传递互斥锁的,但是如果不加volatile那么程序将卡死在任务而的while(g_calc_end==0)阶段。

2024-12-15 20:00:12 247

原创 关于freertos为什么创建任务需要循环

如图所示,创建每个函数(任务也是)都要事先将返回地址LR写入栈开头。但是如图任务初始化时创建的返回地址会执行一个循环,永远出不来。所以创建任务需要加入循环,不然会导致卡死。

2024-12-10 16:33:34 193

原创 关于DMA传输的细节

MDA需要把我们输出的数据,传输到串口的输出寄存器,但是MDA又是由于输出寄存器完成,触发中断启动的。这样就到陷入了循环,没有第一个推动,程序无法启动的问题。烧录,MDA转送至输出寄存器,输出寄存输出完成,触发中断,中断再次触发MDA的传输,程序就跑起来。细节:MDA完成配置时候,他会自动触发一次转送,这样流程就是。上面的代码部分,简述功能就是用串口中断触发MDA的传输。问题来了,这个程序如何跑起来的?

2024-11-19 14:40:57 953

原创 随堂笔记(物联网5.4)

这样无需添加头文件,只需要程序内部运行检测到。我们已经进行了修改(注意函数格式必须一致)。这样就可以直接使用修改后的函数命令。对于部分命令,如:void* malloc (size_t size)我们只需要新建一个C文件同时添加了该标准库。那我们就完成了标准库函数的修改。

2024-11-06 16:43:53 209

移植easylogger通过J-Linker的RTT输出日志/Ozone的RTT设置

源码项目

2025-05-09

bug文件,有缺陷,自己试试

有缺陷的文件,自己再试试解决bug

2025-04-19

Freertos中互斥量和信号量(通过串口实现)的思考

Freertos中互斥量和信号量(通过串口实现)的思考

2025-04-15

如何移植freertos

文件配置

2025-03-12

如何使用程序调用ST7735芯片驱动显示器

如何使用程序调用ST7735芯片驱动显示器

2025-03-07

用esp 32C3芯片获取天气和时间的代码思路

整个文件的代码

2025-03-03

空空如也

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

TA关注的人

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