- 博客(154)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 ESP32一些错误
这个函数只能调用一次, 如果多次调用, 会报错,这个是一个全局的GPIO中断服务函数。在写以太网时, 以太网内部调用了这个函数, 然后自己的按键也是用的中断, 初始化时就会报错。只能设置输入的GPIO如果初始化未输出也会报错。
2025-01-16 13:42:16
220
原创 ESP32的GPIO不是所有引脚都可以作为输出
设备用的36-38这几个脚作为输出, 然后发现死活控制不了, 以为是外部电路影响了,断开与外部的连接还是不行,最后查到这几个脚不能作为输出。使用 ADC 或睡眠模式下使用 Wi-Fi 和蓝牙时,请不要使用 GPIO36 和 GPIO39 的中断。有关问题的详细描述,请参考。GPIO34-39官方文档说都不可以作为输出,实际上模块还有一个GPIO40, 测试发现也不可以。如上图,ADC2也有坑, 小心。> 中的第 3.11 节。
2025-01-14 17:51:21
249
原创 keil将文本文件编译为数组
在开发esp32时, 需要将网页html, css, js, 还有一些图片资源编译成数组, 集成到代码里面, 然后设备作为服务器, 通过网页访问.
2025-01-12 14:49:32
298
原创 ESP32编译和双OTA分区问题
最开始我的CSV文件并没有添加双OTA的数据,后面开发增加OTA, CONFIG_PARTIION_TABLE_TWO_OTA没设置,程序编译成功, 下载进去无法运行,将这个设置后,程序可以运行。这个问题也是奇葩,是因为我的电脑C盘满了,次数底层调用python编译的时候,一些数据写不到C盘,导致编译失败。1.同一份代码,上次编译过了,重新删除build, 再次编译就会出错。在使用分区表时,最简单的方法就是打开项目配置菜单 (2.1.修改使用自己定义的paritions-16MiB.csv。
2025-01-08 15:53:14
296
原创 esp32修改分区表
搜索CONFIG_ESPTOOLPY_FLASHSIZE。在menuconfig中修改flash大小16M。2.选择自己的partitions。默认使用的flash大小为1M。我这个文件拿的是正点原子的。1.修改flash的大小。
2024-12-06 10:27:37
228
原创 keil编译报错提示browse information of one or more files is not availiable 或FCARM- Output Name not specied
今天在移植rt-thread的时候, 突然莫名其妙的给我弹框, 说从如下图加入的文件, 文件的属性都时对的, c文件属性是c sorce file, 但就是一直提示文件无效.
2024-10-24 23:32:02
673
原创 DMP驱动库
Motion_Driver_6.12 是一款专为 MPU6050 设计的嵌入式运动驱动库,该库充分利用了 MPU6050 内置的数字运动处理器(DMP)。借助此驱动库,开发者能够高效地集成和利用 MPU6050 的强大功能,轻松实现各种运动相关的应用开发。对于那些希望在自己的项目中集成六轴传感器(陀螺仪+加速度计)功能的用户来说,这是一份不可或缺的资源。
2024-10-18 22:45:57
232
原创 easylogger移植
easylogger就是用来打印日志的,我们可以将日志输出到sscom, led屏幕, 或者打印到spiflash中, 保存运行日志.个人认为用到的两个地方, 一个日志打印装逼, 另一个将运行日志保存到flash, 前者居多吧。
2024-09-22 14:55:39
472
原创 利用http获取文件升级
1.电脑端开启Telnet客户端2.下载HFS文件服务器将要升级的文件放到HFS文件系统中,这里我用了一个test.txt来作为实验。
2024-08-19 14:03:02
343
原创 ESP8266wifi
如下, 设置, 连接网络调试助手, 这样就可以通过电脑发送数据到模块,然后模块直接将数据通过串口发出来.使用USB转TTL工具,通过电脑直接发送AT指令连接电脑.
2024-07-23 22:24:52
195
原创 EG800K GPS开发
EG800G 系列 | 移远通信 (quectel.com.cn)NMEA0183-C: 解析GPS数据的nmea0183的C语言库 (gitee.com)
2024-07-12 18:22:20
822
原创 低功耗产品程序烧写不进去
2. 测量电阻发现,下拉的10K电阻变成了6MΩ(忘记量和boot那边的电平了),应该是电平异常,换了个电阻就好了。1. stm32L4芯片,调试的时候发现,程序有时候会从系统自带的boot启动。
2024-06-05 14:11:57
268
原创 RT_thread nano移植Finsh
3.注释掉finsh_config.h文件中以下两个宏定义,因为这个在rtconfig.h文件中已经定义,提示重复定义.6.在rtconfig.h中加#define RTE_USING_FINSH。使用Mobaxterm时,发现出现如下, 需要右键命令框,如下设置。我使用的是将中断接收到的数据加到队列中, 然后从队列读出来.5.实现rt_hw_console_getchar(参考。移植的前提是,你已经有一个可以使用的nano功能.2.添加Finsh中的.c以及相关.h头文件路径。
2024-06-02 00:25:26
566
原创 LoRaWAN软件协议栈(二)
这个连接下提供了多个lorawan的协议连接, 我看到了ST的协议栈, 打算那这个来看看.Semtech这个公司是指定标准lora的协议公司,
2024-05-15 00:22:27
383
原创 数组占用flash的探讨
1. 如果使用全局/静态数组(变量), 可以不初始化或者初始为0, 这样就可以减少内存.2. 如果使用局部数组(变量), 可以不初始化的最好也别初始化, 尽量减少flash.
2024-04-12 23:12:00
343
原创 3.创建型模式--创建者模式
以上的解释和代码都是来自文心一言, 但是我认为所谓的创建者模式更像是对一个东西的抽象. 也就是把一个东西抽象成类.很多时候, 我们总以为设计模式很模糊, 实际上这些东西都是有用到的, 只是平时没有总结出方法名而已.建造者模式(Builder Pattern)是一种对象构建的设计模式,它允许你分步骤构造一个复杂对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
2024-04-05 00:04:37
354
原创 2.创建型模式--工厂模式
工厂方法模式是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建对象的方法。工厂方法模式将对象的创建与使用分离,客户端无需关心对象的创建细节,只需通过工厂接口请求所需的对象。在工厂方法模式中,我们定义一个用于创建对象的接口(抽象工厂),然后让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。由于C语言不支持面向对象编程中的接口和继承等特性,我们将通过函数指针的方式模拟工厂方法模式。
2024-04-01 18:57:28
284
原创 1.创建型模式--单例模式
单例模式是一种常见的设计模式,它确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。单例模式通常用于管理那些只需要一个实例的资源,比如配置信息、线程池、数据库连接等。我写的数组环形队列,其实就是一个单例模式,通过一个对象来控制。比如环形队列的入队,出队,队列剩余长度等。如果不明白的可以去学习下数组环形队列,这个在单片机中用的特别多。
2024-04-01 18:43:05
637
原创 写外部flash异常
4.如果读flash出现数据异常,比如CRC校验不通过,一定要打印出日志,否则没有这些日志,很难排查问题。7.每条配置最好能够分开CRC校验,这样读取一片,有一个异常,也认为出错,给出提示,使用默认值。1.低电压的情况下,写flash可能会异常(对于电池供电的设备会出现此问题)3.写入flash的数据校验机制太少,写入偶现的错误也一起写进去了。1.操作flash前对电压进行判断,低于某个电压,无法写flash.5.程序中需要带读取flash内容的指令,后期出现问题好进行分析。
2024-03-21 09:58:10
677
原创 裸机程序--时间片调度
a. 网上其实有很多成熟的时间片调度例程, 包括我最开始参加工作也是抄的网上的例程(还记得当时领导问我看明白了它的调度原理吗, 作为一个自学刚参加工作的我来说, 看懂别人的意思真的很难, 当时只能含糊其词的说看得差不多)b. 在我看来网上的例程是有一些问题的, 计算时间的那个函数放到定时器中递减, 随着任务的增加, 定时器定时越不准确, 违背了中断的快进快出, 不过话说回来时间片本来就是一个不准确的定时.c. 违背了软件的开闭原则, 每次添加任务都需要进去修改那个定义任务调度的数组.
2024-03-02 22:01:06
832
4
原创 LWIP数据接收过程分析
环形buffer由void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount)初始化。最近在搞lwip的性能优化,电脑ping设备时,偶尔会出现超时未响应。老板叫我优化,问题没解决,但是把数据从MAC内核传输看了个七七八八。1. 数据到达RX_FIFO, DMA读取数据到ETH_DMADESCTypeDef组成的环形buffer.
2024-03-01 15:29:37
1352
4
原创 stm32触发硬件错误位置定位
1. 项目中,调试过程或者测试中都会出现程序跑飞问题,这个时候问题特别难查找。2. 触发硬件错误往往是因为内存错误。这种问题特别难查找,尤其是产品到了测试阶段,而这个异常复现又比较难的情况下,简直头疼。3. 我目前的工作完全是没有调试器的,代码都是写好了,通过bootloader烧写进去的。也就意味着不能在void HardFault_Handler(void)中打断点,然后通过当前lr寄存器中的值查看异常地址。
2024-02-29 19:16:48
1748
原创 多态与代码屎山
通过这里让我想到了公司的产品: 我们公司的产品是监测水利数据的, 然后按一定格式上报给服务器. 虽然整体格式大体相同, 但是各个地方也有略微的差别. 我们公司的业务设计多个省份, 每个省份实现的都是通过if else格式实现的, 导致每新增一个省份业务, 就需要在需要判断地方添加if else.整个上报逻辑已经越来越多, 程序也越来越臃肿.程序熵增无法避免, 但是如果一个程序能够设计的合理, 熵增的速度也就会降低, 如果程序的熵增快速递增, 那么程序重构的命运会提前到来.
2024-02-25 08:08:32
428
原创 Unity单元测试
我这个demo是用mingw在window环境下编译的, 大家也可以使用visual studio移植, 这样就不用管makefile文件了, 但是使用visual studio真心的太笨重了, 运行也慢, 强烈建议大家使用vscode+gcc编译(1.我们只需要移植三个文件即可: unity.c, unity.h, unity_internals.h。Unity单元测试是一个专门用于嵌入式单元测试的库, 现在简单讲下移植以及代码结构.更多详细的测试可以参考Unity的例程.2.然后添加需要测试的函数.
2024-02-21 00:24:38
2027
2
原创 RS232线太长,会导致RX触发中断
1. 解决项目bug的时候,我们的设备,如果外接的RS232的线太长(带DP9的母头)并且不接USB转RS232就会触发中断。3. 不知道是否和我们的硬件设计的板子导致的这个问题,还是线长问题。由于手上没有232的开发板,现在只记录下。2. 如果减短RS232的线,触发的频率会减少。
2024-02-19 17:26:35
587
原创 在windows环境下用vscode配置gcc编译代码
可以看看B站李慧芹老师的视频第70个视频,关于makefile的编写, 有那点基础够目前用的了.但是要注意优点不同: 要将rm换位del, 目前我还不会分目录, 但是基本够用了, 我们如果需要添加xxx.c, 则在这个makfile文件里面添加xxx.o即可。本来我之前很喜欢用visual stdudio写代码的, 这样在电脑上能够运行的代码,放到单片机上也是可以运行的.但是之前在使用linux中的list.h的时候, 在visual studio编译不过. 因此经过找网上的各种资源,最终整合了这篇文章。
2024-02-03 08:19:20
1051
原创 list.h
本代码是从linux的list.h中搬过来的.与普通的链表的区别在与他可以挂各种链表.他是以将struct list_head和其他成员组成一个全新的结点,注意这个写法在vs中是无法编译过的, keil和iar可以编译得过。
2024-01-27 20:24:08
437
原创 抽象和封装
5. 还有种降低内存的方法, 就是使用动态内存分配(内存池, 内存堆), 可以将一些占用大内存的, 而使用时间短的内存, 用内存分配来解决, 这样可以降低内存的消耗.但是在裸机项目中, 消耗大内存的机会很小, 至少我以前遇到的都是小内存, 都只需要几个字节就行, 一切皆可控.而在物联网产品中, 需要的都是大内存来接收数据, 因此内存动态分配就是最优解(如果反复需要申请和分配的, 我觉得还是用内存池来做比较合理, 而内存堆用来那种分配一次就不释放的场景, 可以最大程度的降低内存碎片)
2024-01-23 22:37:23
394
原创 消息订阅(想法)
在mqtt中, 可以通过订阅主题, 来接收服务器的消息通知. 那是不是我们在单片机中也可以模拟一个呢?我们可以用这个来获取我们感兴趣的事件.这里是以按键消息来做为订阅主题, 为了偷懒, 我没有使用链表, 使用链表会更加灵活, 并且如果是按键有一个消息主题就可以了, 没必要整这么多.sub()这个不定参函数, 可以让订阅消息更灵活, 可以一次订阅多个消息(最近开发的mqtt就可以一个主题将服务器所有主题订阅)这里应该再次优化, 将sub()函数抽出来, 变成一个公共函数, 其他消息类型也可以订阅.
2024-01-23 21:59:13
440
原创 const关键字
常量指针说的是不可以通过指针改变指向内容的值,但是可以重新指向新的地址, 因此一般用作函数参数,防止内部通过指针地址中保存的值void test(int const * val)。区别指针常量和常量指针,在*左边表示不能修改指向地址中的值,在*右边表示不能修改指向的地址。该方式是合法的,并且可以修改内容的值,如果外部改变值,可能会导致混乱,引入错误,慎用!如果指针常量作为函数参数,那么函数内部不能修改参数的指向,但是可以修改通过指针指向的值。不能改变指针指向,但是可以通过指针改变指向地址中的值。
2024-01-22 14:51:45
414
原创 MQTTX使用与EMQX本地MQTT服务器搭建
在调试设备与mqtt服务器连接时,需要用工具来做前期的报文正确性验证。如果在工具上能够正常发布订阅消息,那么如果链路不通那就是程序问题了。
2024-01-11 09:39:05
1571
原创 自动初始化外设
看到了linux中的模块加载和卸载, 知道是通过attribute((sectiion))来实现的, 但是经过一顿研究, 发现如果想要在单片机中使用, 要自己写链接脚本. 我这种菜鸡也写不出来啊.黄天不负有心人, 最终找到一个简单的方法, 那就是通过__attribute__((constructor))注意这个是在启动的时候就会执行被修饰的函数, 因此用于硬件初始化是没问题的, 或者指挥在最开始调用的函数.
2024-01-01 01:17:16
399
原创 单片机中的printf思考
而实际上, printf是通过snprintf封装来的, 我们定义了一个静态数组来存储printf要打印的内容,,用snprintf打印里面的内容, 这样多线程中的每个线程的堆栈就只提供给任务使用.避免堆栈溢出照成的程序崩溃.(当然也可以用系统提供的snprintf替代自己实现的snprintf, 可能编译代码多点, 但不会出现不可靠的问题)细细推敲下来, 发现一个小小的printf都有各种问题, 何况自己写的bug呢, 虽然公司的代码让我看的不爽, 但确实稳定,.
2023-12-09 00:37:45
662
openssl RSA算法移植到stm32F10
2022-12-16
在51单片机中如何将变量名通过串口打印出来
2022-04-21
TA创建的收藏夹 TA关注的收藏夹
TA关注的人