- 博客(22)
- 收藏
- 关注
原创 分析5V芯片与3.3V芯片通信过程
2. 当A输出低电平时,NMOS的寄生二极管导通,电流从B芯片输出端上拉的3.3V通过A芯片流至GND,此时虽然二极管的压降为0.7V,源极电压被钳至在0.7V,但是栅极为3.3V大于源极并且Vgs = 2.6V,超过NMOS导通阈值电压,NMOS导通,电流从漏极流向源极,芯片B会收到A传来的低电平。1. 当A输出高电平时,Q1栅极(G)和源极(S)均为3.3V,Vgs = 0V,NMOS截止,芯片B由上拉电阻拉高至高电平,从而实现A发送高电平,B接收高电平。方向2:芯片B 向 芯片A 发送数据。
2025-03-08 11:52:16
322
原创 LCD背光电路连接图分析
在这个电路中,NMOS管(Q1)的漏极(Drain)连接到FPC1的2号引脚,用于控制该引脚的电平状态。这里我们主要分析一下 该原理图中的背光电路,有两种电路,一种是上图的BL连接电路,采用NMOS管,另一种是使用三极管。当单片机向BL引脚输出低电平信号时,NMOS管的栅极电压接近地电平(GND),栅极与源极之间的电压差不足以使NMOS管导通,因此NMOS管处于。R36(10K):作为下拉电阻,确保在BL引脚未被驱动时,NMOS管的栅极电压接近地电平,保持NMOS管处于截止状态。
2025-02-22 11:23:31
1026
原创 循环队列实现(C语言)
队列(Queue)只能在表的一端进行插入操作,在另一端进行删除操作。其中,允许插入的一端叫着队尾(tail),允许删除的一端叫做队头(front)。循环队列是对队列的一种改进,它比队列适用的范围更广, 常用于数据缓冲区管理。队列(Queue)是一种操作受限的。
2025-02-20 10:04:00
145
原创 解决lvgl界面显示超长文本卡顿问题(基于lvgl8.3)
大小在100KB以内的文本(这里可以视情况而定,只要内存足够大),esp32的内存足以一次性全部读取到内存中,但是显示在lvgl标签中,一次加载超过1k文本数据还是太大,仍会造成lvgl刷新卡顿。所以我们将文本数据一次性读取到堆空间中,对lvgl显示的文本数据进行管理,每次仅显示指定数量的文字,再根据滚轮的位置判断是否需要向上或者向下换页,换页则从堆空间中取出指定大小的文本数据进行显示即可。大小在几MB甚至更大的文本,我们无法一次性读取全部数据,那么我们只能每次读取指定大小的数据。
2025-02-18 19:31:33
435
原创 LVGL-8.3图片转换后黑色背景无法去除问题(基于esp-idf环境)
配置完后,就能正常显示了!也是同样改那两个配置,但是。宏开启并修改下面颜色值。
2025-02-11 19:46:32
347
原创 esp32关于esp_timer回调函数使用的注意事项(esp-idf5.2.3)
具体来说这个回调函数不是直接在中断上下文中调用,而是在中断中将回调函数的执行调度到一个高优先级的任务(那么我们知道,在rtos中高优先级的任务会抢占低优先级的任务执行权,如果我们在这个回调函数中执行了过于繁琐的流程,那么其他低优先级任务就会得不到执行,所以导致我们的其它任务都阻塞,UI界面也卡住。还需要注意的是,esp32具有两个CPU核心,分别为Core0和Core1,Core0一般是运行系统协议的任务比如wifi和蓝牙等等,而esp_timer的回调函数默认也是运行在Core0上面的,
2025-02-07 15:30:44
398
原创 esp32获取天气数据(基于esp-idf-5.2.3)
在https_reqst.c文件中我们将一些不必要的代码删除,这里我们为了方便直接使用证书包(https_request using crt bundle)发送https请求,所以将root_cert、local_cert证书部分以及server_supported_ciphersuites密码套件代码注释掉。因为HTTPS 是基于 TLS/SSL 的安全通信协议,而 TLS/SSL 依赖于设备的系统时间来进行证书验证,所以这里还需要获取sntp网络时间,并保存在nvs分区中。这里我们在上一篇博客的。
2025-02-02 19:45:52
764
原创 esp32获取网络时间(基于esp-idf 5.2.3)
收到sntp服务器回应后立即更新时间、使用sdjtime函数平滑校准、自定义校准(需要重写sntp_sync_time()函数,在该函数中写自定义校准代码)对于esp32我们可以在连接wifi后获取网络时间,首先我们需要让开发板连接wifi,再通过sntp获取网路时间。这里要配置的话,我查看文档发现写的是在Example Connection Configuration菜单下配置,而在我这个。索性这里我们就不配置,使用默认的校准方式1(收到sntp服务器回应后立即更新时间)。函数返回给main函数。
2025-01-26 17:05:03
551
原创 关于SPI读写MicroSD卡mcu无法接收到SD卡发来的数据起始令牌0xFE(基于FATFS文件系统)
速度标准,但我这里spi使用的是18Mhz可能偏高, 于是我怀疑是否是spi波特率的问题,所以我将spi的分频系数改了后,波特率将为9Mhz,则顺利能够完成读取。这里是读取sd卡时,mcu需要接收到sd卡发来的0xFE指令,代表接下来SD卡要向mcu传输其读取的字节数据,而这里mcu一直没有等到0xFE所以一直卡在这里。在实验中遇到的问题,SD卡能正常初始化,就是在挂载fat文件系统过程中读SD卡时一直等待不到SD卡发回的数据起始令牌0xFE,导致程序卡在循环中出不来。这个问题很长一段时间没有解决。
2025-01-19 17:36:55
188
原创 学习记录-解决STM32HAL库RTC掉电丢失日期数据
一般情况下,我们在每一次RTC初始化后再设置日期时间,但这样每次上电后都会是原先所设置的日期时间,我们需要的是让时间沿着上次断电时的时间继续往下走,所以我们可以利用备份寄存器第一次设置时间时,写入一个特定值存到备份寄存器,后续每次上电都读取备份寄存器,如果读取的和这个值相等那么就可以不在设置时间,以下是代码。,否则调用库函数日期时间会不正确,这里我估计是HAL_RTC_SetAlarm和HAL_RTC_GetAlarm这两个库函数中的处理对日期有影响,但是没看出为啥,反正用这两个函数就乱了。
2024-12-17 21:27:29
800
原创 标准库OLED移植到HAL
由于后续I2C通信实现都是基于SCL和SDA的输出配置来封装相应的函数实现数据传输,所以这里只需要将GPIO的初始化函数以及SCL和SDA引脚配置的宏作相应的修改即可。其次我们可以对比标准库和hal库的函数,对于GPIO引脚的封装的宏只是将小写改成了大写,对比外设初始化的函数,大部分只是在前面加上了HAL的标识,至于BitAction 这是一个枚举类型,用来设置高低电平。红色框出来的则是基于标准库修改后的,修改完之后需要将3个oled文件加入工程,根据上面的教程。http://江科大OLED调试。
2024-09-08 12:47:08
463
原创 串口传输温湿度数据部分代码解析 (基于51单片机)
随后通过高电平持续时间判断模块传输的数据位flag为0或1,再将每个数据位写入tmp中,这里主要来分析下,数据是如何被写入tmp中的。tmp值为a, 对应ASCII码值97,将97/10==9, 9+48 == 57,ASCII码57对应字符9,再将97%10==7,7+48==55,对应字符7,那么这样就将一个字符转换a为两个数字字符了, 在显示数据时本应该显示a字符,就会显示97,其他任意字符都可以通过其ASCII码转换为此形式。,那么如果直接传输到串口,以字符方式显示则会不打印亦或者打印乱码。
2024-08-21 10:10:30
830
原创 位寻址与字节寻址
在单片机中,有位寻址概念,单片机有多组IO口组成, 每组IO口对应着一个寄存器,通过代码给寄存器赋值从而来控制IO口的输入输出电平,达到控制单片机各部件的运行。sfr标识符定义的如ACC、PSW等等都是特殊的寄存器, 等号后面是分配给寄存器的地址,两位十六进制,由8个二进制位组成。每组寄存器地址都是八位,每一位又代表了一个具体的IO口,一般情况下我们直接对一组寄存器赋值,就是。上面我们假设P3.0口连接了LED,那么我们这里通过位寻址的方式找的P3.0口,并将值改为1,1为高电平,LED灯灭。
2024-08-12 22:59:59
1442
原创 c语言常用输入函数使用细节
图中有连续输入,当输入一个 n 和 回车 后,程序直接结束了,fgets自然而然接收了缓冲区遗留下来的 \n , 所以当我们在使用scanf函数并且需要连续输入时,在每一次使用完scanf后,需要用getchar() 吃掉脏数据后, 才能继续从键盘读取。这里键盘输入 a空格b回车结束后,第一个字母a打印出来了,第二个字母变成了空的,这就是第一个scanf读取完a之后,将空格保留在了缓冲区中,第二个scanf直接就接收了缓冲区中的空格字符,所以word2接收的是空格,后续打印ASSCII码值得以验证。
2024-08-09 20:23:10
1126
1
原创 linux父子进程的代码执行理解
红蓝框分别代表父子进程要执行的代码,父子进程分别对num进行写操作,父进程加10,子进程加100,右边结果可以看出父进程先执行 (进程间执行顺序不定),在父进程专属代码区打印出的值为20,然后子进程在专属代码区打印值为110,还是在源num=10基础上加100,可以看出子进程是拷贝了一份父进程的地址,父子进程对num的操作相互独立并不影响。通过fork创建进程后我们需要对其返回值结果,划分子进程和父进程的专属代码区,当fork返回值大于0是为父进程的代码区,等于0时为子进程代码区,小于0则创建进程失败。
2024-08-09 16:35:18
197
原创 c语言strtok函数实用细节
如上面1,2所示的分割过程,第二次strtok时,strtok函数中第一个参数变为了NULL,即函数将 "ni" 分割出来后,将原本空格的位置 (空格也是一个字符,ASCII码值为32) 替换成了 \0 , 所以是从NULL开始分割,NULL和 \0 都代表无值或结束。如1,2的演示,在str_tok函数中,使用了两次strtok, 第一次返回的指针token为 "ni" 的指针。第一个是分割函数返回的字符串,第二个是源字符串,可以发现,已经被修改了,打印碰见\0结束,所以输出 "ni"
2024-08-09 10:36:22
541
1
原创 C语言生成特定范围随机数
单用rand()函数获取的是伪随机数,必须结合时间戳:srand(time(0));因为时间是不断变化的,所以每次产生的数均不同。
2024-07-04 11:47:41
232
原创 C语言疑难知识点:字符串数组
第一个指针 strArr[0] 指向第一个字符串中的第一个字符。即 *strArr[0] 等于 'i'。第二个指针 strArr[1] 指向第二个字符串中的第一个字符。即 *strArr[1] 等于 's'。每个 strArr[i] 都表示一个字符串,指针都指向对应字符串的第一个字符。因此实际上这个一维数组并不存放真正的字符串,而只是存放字符串的地址。字符串数组有两种表示方法,
2024-07-03 21:18:06
204
1
原创 c语言字符串两种定义方式
如:当定义了一个和arr2中数据相同的arr5,则编译器不会创建新的字符数组,而是直接复用原来的arr2中的地址,所以arr2和arr5的指针地址相同。至于修改数据,这个很好理解,第二种不可修改,因为数据被在只读常量区。
2024-07-03 15:03:01
246
原创 函数指针和函数指针数组
格式:int (*arr[4])(int,int)={add,subtract,multiply,divide};函数指针数组:将多个返回值类型和返回值个数相等的函数指针 存储在一个数组中。函数返回值类型 (*函数指针名)(参数) = {函数名1,函数名2};函数调用和普通函数调用一致,函数指针数组需要加上数组指针索引。格式: 函数返回值类型 (*指针名)(参数) = 函数名;函数指针可以更灵活的调用函数。代码块2:函数指针数组示例。
2024-07-03 12:26:00
173
原创 指针和二维数组
如图查看二维数组的地址,整个数组的指针地址和第一行a[0]初始地址一致,a[0]作为数组第一行数据的常量指针,又和a[0][0]地址相等。通过查看a[1]也就是第二行可知,步长为12字节,也就是3个int。二维数组可以看作一个包含了多个一维数组的数组。二维数组本质也是按一维数组进行存储的。
2024-07-03 10:53:59
198
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人