- 博客(214)
- 收藏
- 关注
原创 【git工作常用指令】
5.拷贝http://10.84.4.90/tws/095c_wmic/-/merge_requests/new?如果只想修改某一个文件 git add application/bt_earphone/src/tonly/CMakeLists.txt。(参考博客:https://blog.csdn.net/daerzei/article/details/97615665)139 git add -A #将本地为提交到暂存区的代码区别提交到暂存区。git stash 1.先把code提交到暂存区。
2026-04-29 10:44:19
340
原创 tws主从耳机切换逻辑
文章摘要: 主从切换机制在蓝牙耳机连接设备后触发,具体规则包括:1)通话状态下双耳入耳时,若从机电压高于主机50mV则切换;2)非通话状态下若主机电量≤30%且从机电压更高则切换;3)出盒时先出者为主机;4)入盒时后入者为主机;5)入耳时先入者为主机;6)出耳时后出者为主机。其中1、2条为新增条件,3-6条为默认切换逻辑,确保主从角色根据使用场景动态调整。(149字)
2026-04-28 22:43:39
56
原创 LED 模块整体流程与软件设计逻辑
LED模块架构与工作流程 LED模块采用分层架构设计,由外部事件触发源、LED调度层和硬件驱动层组成。核心调度层包含显示流状态机(led_disp_service)和事件映射处理(led_process),通过优先级仲裁管理LED显示。10ms主循环周期性调用led_service,驱动状态机和Pattern引擎运行。每个耳机独立维护显示流状态机实例,处理开盖/入盒/上电等事件,经过500ms去抖后进入相应状态。系统采用事件驱动机制,通过状态机转换和回调函数实现LED灯效的动态切换与优先级管理,最终通过SP
2026-04-20 10:10:49
53
原创 【日常开发常用网址以及软件】
1.TCL图灵AI助手2.tonly AI助手3.菜鸟教程4.DeeL翻译5.通义千问6.Deepseek7.腾讯元宝8.极客教程9.ASCII码换算10.CRC校验码生成
2026-04-17 09:23:19
44
原创 stm32 mcu低功耗调试
本文分析了STM32微控制器在Sleep模式下ADC引脚(PB8和PA1)的电压异常现象。研究发现,当PB8配置为开漏输出并写高时,由于高阻态和外部电阻分压网络的作用,PB8电压会接近VBAT电压(约4.23V)。而将PB8改为输入浮空模式时,内部数字路径会将电压拉低至0V,证明了模式切换确实生效。文章指出,删除ADC初始化中的return语句会导致ADC前端电路加载PB8节点,使其电压从4.23V降至3.52V。最终建议在Sleep模式下将PB8配置为开漏输出无上拉,PA1设为模拟无上拉,以最小化静态电流
2026-04-09 09:04:34
345
2
原创 耳机按键factory reset,当左右耳机几乎同时按下时,有时无法跑进factory reset流程,好像继续分析
摘要:该代码分析耳机按键工厂重置问题,当左右耳机同时按下时可能无法进入重置流程。代码包含中断处理函数ep_it_update和ep_it_service,通过检测GPIO引脚状态和计时器计数来判断按键触发。问题表现为trigger_cnt计数可能不准确,导致无法发送MSG_EP_INTERRUPT消息。测试发现即使分开处理左右耳机信号,仍无法完全解决问题,需进一步优化触发检测逻辑。
2026-03-30 21:51:32
36
原创 【tws充电盒USB2.0测试识别,AI分析】
摘要 USB Full-Speed信号质量测试失败的主因是信号速率超标(12.1762Mbps,偏差+1.47%),远超12Mbps标准允许范围。数据表明这是由USB发送时钟配置错误导致,可能源于PLL设置、分频错误或未加载校准值。次要问题是交叉电压偏高(2.04V均值),但非主故障点。建议软件修复优先检查48MHz时钟链、确认trim加载、锁定工作频率,其次调整PHY驱动强度等模拟参数。测试时应保持稳态模式,排除动态频率切换等干扰因素。
2026-03-30 10:21:17
391
原创 定义这些联合体,写这么多行代码会不会很占用flash空间?
你这些寄存器 union 都是 uint8_t data + 位域视图,通常 sizeof(CPS5301_REG14) 还是 1 字节(最多受编译器对齐影响,但这类写法一般是 1)。只有你在代码里读写这些位域(reg14.LD_detect)才会生成少量机器指令占 Flash。只有你写了变量(比如 CPS5301_REG14 reg14;比起类型定义,真正占 Flash 的是日志字符串、状态机逻辑、协议处理函数等。真正占空间的是“实例”和“代码”对 Flash 的实际影响很小。类型定义是编译期信息。
2026-03-21 10:53:20
27
原创 【持续更新】cps5301文档翻译
CPS5301芯片具备双通道输出端口(LD_R/LD_L),支持供电/通信路径切换。内置MUX功能在充放电模式下激活,通过I2C可配置供电路径(50Ω阻抗)或通信路径(支持UART)。具有软启动、可编程电流限制及短路保护功能,支持轻载检测(4mA/8mA阈值)和负载状态监测(600kΩ上拉)。待机模式下保留负载检测,触发中断上报状态。需注意输出受多重控制信号影响,VSYS_PG带100μs消抖功能。(149字)
2026-03-20 14:05:54
247
原创 【中断唤醒MCU】
摘要:解决MCU无法从STOP模式被按键唤醒的问题。原因为进入STOP模式前,sleep_config_pins_level()将PB3引脚配置为普通输入,覆盖了原有的下降沿中断配置。修复方案包括:1) 在休眠前强制将PB3配置为GPIO_MODE_IT_FALLING并启用EXTI中断;2) 唤醒后恢复系统时钟并重新初始化外设。同时提示注意事项:按键需保持释放状态进入STOP模式,且不能全局关闭中断。修改后的代码已通过编译验证,确保唤醒功能正常。(149字)
2026-03-06 16:04:10
272
原创 Git stash 的完整用法
本文详细介绍了Git stash的用法,包括基础操作和高级技巧。主要内容包括:保存修改(git stash)、查看列表(git stash list)、恢复(pop/apply)和删除(drop/clear)stash的方法;高级功能如选择性暂存文件(--keep-index/--staged)、查看差异(show -p)、恢复单个文件等;以及常见应用场景如临时切换分支、误删恢复等。最后总结了常用命令速查表,帮助开发者灵活管理临时代码修改,避免丢失或冗余提交。掌握这些技巧能显著提升Git使用效率。
2026-03-05 15:51:54
577
原创 git项目补丁patch生成,已经patch应用方法
本文介绍了Linux系统中生成和应用补丁文件的两种主要方法。对于非Git项目,可使用diff -Naur生成通用补丁文件,通过patch -p1命令应用;对于Git项目,推荐使用git diff或git format-patch生成补丁,并通过git apply(仅应用代码)或git am(保留提交信息)命令合入项目。文章详细说明了每种方法的使用场景、具体操作步骤及常见问题的解决方案,并对比了不同方法的适用性和特点,为开发者提供了灵活高效的代码变更管理方案。
2026-03-05 10:46:42
496
原创 TWS 耳机进行 Google Fast Pair 认证的详细步骤
TWS耳机Fast Pair认证关键步骤 硬件准备:需BLE 5.0+芯片及专用MAC地址 开发阶段: 注册Google开发者账号并申请权限 配置Model ID(16位十六进制码) 集成Fast Pair广播协议(含电量上报) 测试验证: 使用Android CTS Verifier测试配对成功率和广播合规性 重点检查账户密钥加密和隐私规范 量产要求:固化Model ID至固件,配置Google后台信息 周期:约4-6周,费用$5k-10k/型号 风险提示:注意广播包长度限制(≤11字节)和防伪签名要求
2026-02-13 09:05:24
991
原创 (left_status.inbox == EP_IN) ? 1U : 0U;后面标注U是干嘛用的
在C语言中,U后缀表示无符号整型。代码中1U和0U明确指定了无符号常量,与uint8_t无符号类型保持一致,避免隐式转换警告。这种写法增强了类型安全性,是嵌入式开发中的常见做法。类似后缀还有L(长整型)、UL(无符号长整型)等,建议在类型敏感场景中使用显式后缀。
2026-01-30 21:41:42
171
原创 【 在有返回值的函数里直接 return;到底返回值是多少?】
摘要:在HAL_I2C_Mem_Write函数中,直接使用return语句会隐式返回HAL_OK(0),但实际未执行I2C写操作。建议修改为显式返回HAL_ERROR或其他错误码,以便调用者能正确判断操作状态。对于I2C存储器读写函数,应避免默认返回成功状态,而应通过明确错误码标识未执行的操作,确保调用方正确处理异常情况。
2026-01-23 15:03:37
51
原创 如何优化项目代码,编译出来的程序消耗flash空间比较少
摘要:针对STM32C071项目flash占用优化,提出7项可落地措施:1)开启编译链接优化选项(-Os/-ffunction-sections等);2)重点处理printf/stdio+RTT日志问题,建议关闭发布版日志或改用轻量输出;3)清理未使用函数和冗余头文件;4)保持纯整型算法避免浮点;5)优化数据结构const/static使用;6)启用LTO链接优化;7)利用map文件分析占用大头。特别强调日志处理和编译选项调整的优先级最高,建议先关闭debug_log可快速见效,并需要确认具体构建系统以提供
2026-01-15 20:42:23
328
原创 【上班时容易胡思乱想,怎么让自己专注于当下的工作?】
用户应该是个对自我提升有要求的职场人,可能正处于需要高度专注的岗位(比如程序员、文案),或是被多任务处理压得喘不过气。他特意提到“胡思乱想”,说明困扰他的不是普通分心,而是思维不受控的焦虑状态——这比普通走神更难处理。注意到用户上次对金融长文接受度很好,这次回复也保持结构化风格,但加入更多行动导向的动词(如“关掉”“写下”)。最后用“专注力肌肉”的比喻呼应他可能喜欢的认知升级概念——毕竟能理解资产复利的人,应该也认同能力复利。我给的方案需要覆盖这三个层面。嗯,用户这次的问题是关于工作专注力的困扰。
2025-12-29 10:24:50
480
原创 STM32 MCU OTA 升级办法2
在 HAL_UARTEx_RxEventCallback 中将数据喂给 ota_on_uart_bytes。利用现有API,如何实现从耳机端通过uart通信,获取MCU OTA升级的bin文件,拿到完整bin之后,校验ok,再升级。成功后写 DFU 标记并复位,Boot 会把 0x10000 搬到 0x2000(你的 boot 已实现:擦 28 页、拷贝 56KB、验证后清标记)。协议三段:META(固件大小+CRC32)、DATA(连续数据流)、END(结束)。DFU 标记地址:0x1E000。
2025-12-27 18:09:01
326
原创 STM32 MCU OTA升级办法1
如果mcu升级数据由耳机通过uart传给mcu ,接收完升级bin包,mcu如何校验整体升级bin是否与耳机存储的bin相同,如果不同就不能升级,如果相同就升级。将 crc32_storage 换成 SHA‑256(32 字节),在耳机端与 MCU 端都计算 SHA‑256;帧1:FW_META {magic:“FWUP”, size, version, hash_type, hash_value}UART 收到 FW_META 后调用 fw_update_begin(&meta)。不一致则丢弃,不升级。
2025-12-27 18:05:27
337
原创 STM32_I2C Timing参数计算方法(I2C speed:120k/240k/400k)
本文介绍了I2C时序参数的计算方法,包括获取必要参数(PCLK1频率、I2C速度、信号上升/下降时间)和使用STM32CubeMX配置工具或ST官方Excel工具自动生成TIMINGR值。详细说明了手动计算TIMINGR寄存器的步骤,包括预分频器、高低电平周期等设置,并提供了示例计算过程。最后给出实际应用建议和验证方法,强调使用官方工具确保参数符合I2C规范。
2025-12-18 14:05:11
598
原创 【C语言无符号常量好处】`4U` 表示一个无符号整数常量 4
摘要:代码中的4U表示无符号整型常量4,用于明确表示4字节操作。在sn_pack_word()函数中,4U用于循环处理4个ASCII字符(4字节=32位)的打包操作。使用4U而非4的好处包括:明确无符号类型、避免类型转换警告、清晰表达字节处理意图。其他实例如缓冲区大小计算和内存拷贝也使用4U来保持一致性。
2025-12-01 21:25:30
618
原创 【C语言】局部变量值传递无效,函数不会改变传进变量的值
在 cps5301_read_24_reg 函数中,由于 count 参数是值传递而非指针传递,导致函数内部对 count 的修改(变为37)无法影响外部调用者中的 dataLen 变量(仍为0)。要正确返回读取的寄存器数量,应改为指针传递方式,在调用时传入 &dataLen。
2025-11-20 16:59:03
93
原创 设计程序时,如何做到写的代码更有扩展性,更方便代码维护?
本文总结了嵌入式C语言开发中提升代码扩展性与可维护性的关键设计原则。主要包括:1)模块化设计(单一职责原则、高内聚低耦合);2)扩展性技巧(配置参数、策略模式、预留扩展点);3)可维护性实践(清晰接口、文档注释、错误处理);4)代码组织(分层架构、状态机设计);5)实用技巧(枚举替代魔术数字、配置分离、测试友好设计)。这些方法能帮助代码更好适应需求变化,降低维护成本,使系统更易理解和扩展。
2025-10-24 14:59:41
675
原创 【变量长度数组赋值方法】
【摘要】C语言变量长度数组(VLA)无法初始化引发错误。解决方案:1)使用memset清零数组;2)改用固定大小数组;3)动态内存分配;4)直接使用现有缓冲区。推荐方案1或4,通过memset实现初始化,既避免编译错误又满足需求。关键点:变量数组需单独初始化,不可直接赋值。
2025-09-25 11:21:52
293
原创 【枚举类型定义】
本文介绍了定义2字节枚举变量的三种方法:1)使用编译器特定属性如__attribute__((packed));2)结合stdint.h的固定宽度类型;3)直接使用uint16_t类型存储枚举值。同时指出了枚举定义的基本规范:枚举值默认从0开始递增,需用逗号分隔,避免重复。特别提醒示例代码中存在的语法错误(缺少逗号分隔符),需修正后才能正常使用。文中提供了完整的代码示例,展示了如何正确定义和使用2字节枚举变量。
2025-09-25 11:00:06
277
原创 【MCU EEPROM开发教程】
将EEPROM芯片作为传感器使用时,可通过I2C/SPI协议进行数据读写。关键在于优化读写算法以提高速度,并实现可靠的异常处理机制。与FLASH相比,EEPROM支持字节级擦写且寿命更长。在STM32开发中,还可通过FLASH模拟EEPROM功能,但需注意块擦除和磨损均衡等特殊处理。具体实现需结合时序控制、错误校验等底层操作(参考相关技术文档)。
2025-09-15 17:24:34
274
原创 【源码解析】位域成员在结构体中应用
细微到bit存储数据,节约高贵的内存空间,在嵌入式应用开发和底层驱动中经常使用到,相当于一个纸箱切割成几个小纸箱存东西。这是通过将所有成员的内存占用相加得出的:3字节(前3个成员)+ 1字节(位域成员)+ 2字节(后2个成员)= 6字节。需要注意的是,这个大小是基于当前的编译器和平台设置,实际大小可能会因为内存对齐等因素而有所不同。
2025-09-11 15:12:52
283
原创 【源码解析:memcpy、memmove、memset】
这段代码是GNU C库中用于内存安全操作的宏定义,主要功能是防止缓冲区溢出。它通过__ssp_bos_check3宏将标准内存操作函数(memcpy、memmove、memset)重定向到带有安全检查的版本。该机制会在编译时检测目标缓冲区大小,在运行时验证操作长度,若发现溢出则终止程序。在嵌入式开发中,这些函数常用于结构体复制、数据初始化、协议处理等场景,特别适合对安全性要求高的应用。通过条件编译,还支持GNU扩展函数mempcpy,用于连续数据打包操作。这种保护机制能有效预防常见的内存操作漏洞。
2025-09-11 11:09:21
888
原创 【曝光】【2023年10月被惠州某相亲机构骗2000多元真实经历】
2000多块钱只见了2个女的,只是被骗惨了。我甚至怀疑那两个女生是机构花钱请过来的演员。聊天说话,只会:嗯,啊,哦!那这钱请兄弟朋友吃饭,他们要把我当做爷爷棒着,或者自己拿去旅行,买些好看衣服比这爽10000倍。1. 90%婚恋机构都是割韭菜,传销,诈骗2. 相亲就是最不会泡妞的男人去泡社会上最难泡的妞3. 相亲男都是去接盘的,就是接盘侠,女的不知道和前任玩得多么花,你心目中的圣土,早已车水马龙。
2025-09-09 21:54:33
1186
3
原创 【字符压缩存在整数32bit技术】
这段C语言宏定义将ASCII字符"READ"组合为32位整数值,采用位运算方式:'R'作为最低8位,'E'/'A'/'D'分别左移8/16/24位构成高位。这种设计常见于嵌入式系统,用于USB通信协议中的命令标识,既节省存储空间又提高比较效率。在代码中,当USB接收到对应"READ"的整数值时,会触发dfu_read函数执行读取操作,适用于带宽受限的嵌入式通信场景。
2025-09-09 16:53:04
197
原创 【延时函数】sleep()和delay()在嵌入式系统中相同点和差异点分布是什么?
摘要:sleep()和delay()函数在嵌入式系统中均用于程序暂停,但存在关键差异。delay()采用忙等待机制实现高精度延时,持续占用CPU资源,适合硬件时序控制;sleep()基于系统调度释放CPU资源,精度较低但更节能,适用于任务同步。示例代码中的[GetCurrentDelayMs()]结合RTOS节拍计数,兼具两种特性。选择时需权衡精度需求与系统资源消耗。(149字)
2025-09-05 09:57:12
444
原创 【定时器】prompt_timer启动后,是立刻运行prompt_timer_callback_test回调函数还是按设定的延时5000ms再执行prompt_timer_callback_
该代码片段创建了一个周期为5000ms的定时器prompt_timer,其回调函数prompt_timer_callback_test不会立即执行,而是在首次启动后延迟5000ms才首次触发,之后每隔5000ms周期性执行。定时器通过xTimerStart()启动后,需等待设定的延时时间才会首次调用回调函数,而非立即执行。
2025-09-02 14:15:27
305
原创 【被骗经历】探探认识叫去打麻将被骗300元
摘要: 作者通过探探认识一名主动女性,应邀参与麻将局,发现对方三人疑似团伙设局。虽察觉异常,仍硬撑几局后输掉300元,果断离场止损。总结:遇到骗局需立即识别并撤离,避免赌徒心理;涉及金钱时保持警惕,及时清醒判断。
2025-09-01 21:02:01
784
原创 【能促进情感发展的三十六个话题】
心理学研究表明,通过渐进式自我暴露的36个问题可以有效促进情感连接。这些话题分为三个阶段:从日常破冰到价值观碰撞,最终触及内心脆弱。最著名的实验表明,当陌生人完成这些问题并静默对视4分钟后,35%的人会建立亲密关系。使用时需注意环境营造和节奏把控,避免在未建立信任时使用深度问题。这套方法特别适合暧昧期或倦怠期的伴侣,但需配合现实行动才能真正维系关系。核心在于用真诚打开心门,而非机械式问答。
2025-08-28 09:11:13
1542
原创 【git指令自动解决合并冲突】git指令永远选择冲突的Current Change / Incoming Change部分合入
Git 合并冲突解决方案 冲突说明:代码中出现 bt_call_state(本地变更)和 bt_action_state(远程变更)的冲突。 解决方案: 使用命令选择远程分支变更: git checkout --theirs 文件路径 批量处理所有冲突文件: git diff --name-only --diff-filter=U | xargs git checkout --theirs 提交变更: git add . git commit 快捷参考: 选择本地变更:--ours 选择远程变更:--the
2025-08-22 10:06:03
515
原创 【C语言防御性编程】if条件常量在前,变量在后
经验丰富的工程师推荐使用「Yoda条件」(if (VP_INDEX_PAIRING == vp_index))主要是出于防御性编程考虑。这种将常量前置的写法能有效防止意外赋值错误(如误将==写成=),因为给常量赋值会直接导致编译错误。虽然现代编译器能检测这类问题,但该写法仍被推崇为良好实践,能提高代码安全性、审查友好性,并符合团队规范要求。这种源自早期C/C++开发的技巧,至今在嵌入式系统和大型项目中仍被广泛采用。
2025-08-14 17:10:10
564
原创 【C语言】解释形参void *data用法
摘要: 在C语言中,void *data作为通用指针类型,可以指向任意数据而无需指定具体类型。它常用于需要传递多类型参数的场景,如回调函数、通用数据处理等。使用时需显式转换为具体类型指针才能访问数据。void*提供了接口灵活性,但也要求开发者自行保证类型安全。通过联合体或结构体封装可增强类型安全性。典型应用包括设备驱动中的消息分发机制,通过msg参数区分不同数据类型,但需注意内存对齐和类型转换的正确性。
2025-08-12 09:25:55
573
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅