- 博客(62)
- 收藏
- 关注
原创 AD + DMA 多通道 (STM32Cubemx手把手教你从零配置)
本文手把手教程详解STM32F103RCT6使用ADC+DMA实现摇杆电压采集。通过STM32CubeMX配置时钟、串口及ADC通道,重点对比DMA普通模式(单次采集)与循环模式(持续采样)的差异。普通模式需循环调用HAL_ADC_Start_DMA,适用于一次性采样;循环模式仅需一次启动,配合连续转换可实现实时数据流采集。代码中通过重定向printf实现串口打印,验证了两种模式下ADC值的正确读取与更新。
2026-10-10 11:40:50
210
原创 二进制信号量和计数信号量区别(FreeRTOS)
本文对比了FreeRTOS中二进制信号量与计数信号量的核心区别:二值信号量仅支持0/1状态,适用于任务同步或中断通知;计数信号量可记录事件次数或资源数量,用于资源管理与事件计数。二者均不支持优先级继承,互斥应使用互斥量。通过实例演示了信号量的创建、释放(Release)与获取(Acquire)操作,以及非阻塞模式下的行为,强调合理选择信号量类型对系统可靠性的重要性。
2026-09-15 11:11:34
140
原创 解决STM32Cubemx重新生成后出现中文乱码
使用STM32CubeMX 6.8.1与Keil uVision 5.24.2时,中文注释出现乱码。解决方法:在STM32CubeMX.l4j.ini中添加-Dfile.encoding=UTF-8,Keil设置编码为UTF-8 without signature,VSCode打开时也设为UTF-8。注意:工程路径勿含中文或空格;已乱码的main.c需重新生成;中文注释仅限写在USERCODEBEGIN/END内,避免被覆盖。
2026-09-11 17:13:56
119
原创 Edge 地址栏搜索被其他浏览器劫持
摘要:针对Edge浏览器被劫持跳转百度的问题,提供两种解决方案。方法一包括四个步骤:1)恢复默认搜索引擎并删除百度推广链接;2)排查移除恶意扩展;3)检查并修复被篡改的快捷方式;4)重置浏览器设置。若仍无效,方法二通过修改注册表强制解除组织管理策略,使用管理员CMD执行三条注册表删除命令(HKCU和HKLM路径),即使最后一条报错也可能生效。最终可使Edge恢复初始状态,解决劫持问题。(148字)
2026-07-27 15:54:36
444
原创 SL6567P的STM32F4_SDK移植到F103流程
本文详细记录了将SL6567P的STM32F4 SDK工程移植到STM32F103系列的过程。主要包括:1)准备F4工程和F103固件库;2)创建并配置F103工程目录结构,移植核心文件;3)修改Keil工程设置,添加必要文件路径;4)调整外设配置,重点修改board文件中的引脚初始化和中断配置。最终实现了在F103平台上运行SL6567P协议栈,成功完成固件烧录和初始化,可通过UART进行寻卡操作。移植过程中需特别注意F1与F4系列的外设差异,通过编译报错逐步修正配置问题。
2026-07-17 11:18:38
197
原创 HardFault_Handler的致命错误的定位与处理技巧
在 STM32 等 Cortex-M 工程中,Error_Handler 和 HardFault_Handler 是系统启动文件中定义的异常处理函数。默认实现通常是无限循环,一旦进入,程序将永久停在那里,不再执行任何应用代码,表现为死机、无响应。但 HardFault 时可能串口还能用(取决于错误是否破坏了关键外设),不过 Cortex-M 在进入 HardFault 时通常不会禁用串口,可以通过寄存器直接读 PC、LR。更好的是借助 Keil/IAR IDE 的 Fault 分析窗
2026-06-03 16:19:26
321
原创 OpenAI开源语音识别模型Whisper在Windows系统安装和anaconda环境使用CPU版PyTorch过程中部分报错解决
本文详细记录了OpenAI Whisper语音识别工具的安装配置过程。主要内容包括:1)创建专用文件夹并配置Conda环境;2)安装Python 3.11环境(避免使用3.13版本);3)选择安装CPU/GPU版本的PyTorch;4)解决FFmpeg安装冲突问题;5)配置清华镜像源加速下载;6)测试tiny和small模型进行日语/英语语音转文字;7)说明模型存储位置。文章提供了从环境搭建到实际使用的完整流程,包含常见错误的解决方法,特别强调了Python版本选择和镜像源配置的重要性。所有步骤均在Wind
2026-05-07 15:09:51
637
原创 btstack中添加自定义的demo例程make
本文介绍了在BTStack协议栈中添加自定义BLE例程的步骤。首先需要在example/Makefile.inc文件中添加demo到对应的分类列表(EXAMPLES_LE_ONLY或EXAMPLES_DUAL_MODE),然后创建ble_demo.gatt文件并添加到EXAMPLES_GATT_FILES路径。接着在Makefile.inc末尾添加编译规则,创建源文件ble_demo.c。完成修改后,执行make clean和make命令生成可执行文件,最后通过./ble_demo命令测试运行。整个过程包括
2026-03-17 16:51:00
405
原创 btstack的ATT/GATT属性自动生成
摘要:本文介绍如何使用BTStack工具生成BLE的.h文件。首先需要下载BTStack协议栈,利用其中的compile_gatt.py脚本将.gatt文件转换为.h文件。以hog_keyboard_demo为例,通过Python命令执行转换,成功生成包含GATT服务定义、特征值句柄等内容的头文件。该文件定义了蓝牙HID键盘设备的各种服务特性,包括电池服务、设备信息服务等,为BLE初始化提供必要的GATT规则配置。整个过程验证了BTStack工具链的可用性,为BLE开发提供了基础支持。
2026-03-03 17:12:08
371
原创 ComProbe Protocol Analysis System 抓包流程示例
ComProbe Protocol Analysis System软件抓蓝牙空中包使用流程
2026-03-02 14:30:25
104
原创 USB传输核心结构体解析
这些结构体是 STM32 USB Device 库对 USB 2.0 协议的抽象封装,是 USB 设备完成枚举初始化、状态管理、数据传输的核心载体。所有 USB 设备的行为(如响应主机请求、端点收发数据、类功能实现)都围绕这些结构体展开。请参考st官方的usbd_def.h;目录为:Middlewares\ST\STM32_USB_Device_Library\Core\Inc\usbd_def.h
2026-01-12 11:59:31
1000
原创 USB 设备/配置/接口/端点/描述符 和 HID类请求详解
介绍:设备描述符,配置描述符,接口描述符,端点描述符,hid描述符;HID中断端点(接收/发送) 最大数据包:设置为64字节(最大)和2字节对比;全速模式下中断端点轮询间隔:5ms和1ms对比;USB协议中的:自定义HID和HID鼠标进行对比;USB全速中HID传输流程,对比设置的端点大小与轮询间隔对整个通信周期的影响;
2026-01-09 17:31:33
1004
原创 stm32 HAL配置usb全速 自定义HID类详解
通过stm32cubemx配置usb自定义类型,传输64字节,对比IN/OUT端点包长和对比中断传输轮询时间;使用Bus Hound,PortHelper,sscom软件进行usb的配置查看,usb全速枚举过程和数据传输详细介绍。
2026-01-05 10:06:48
1449
原创 (已解决)vscode打开stm32cubemx生成的工程报红色波浪线警告
现象:keil可以编译,但是vscode报红色波浪线。可以在vscode中的json文件添加keil的文件配置DEfine,即可解决vscode报红问题!!!
2025-11-13 19:37:43
958
原创 keil修改RAM尺寸大小
keil编译失败,显示连接错误:可能是是“默认 RAM 尺寸”埋的坑。STM32F103RB 有 128 KB RAM,但 Keil 默认只给你 20 KB;把 Target→IRAM1 Size 改成 0x20000,也就是128kb,点击编译链接错误立刻消失。
2025-10-31 16:18:23
471
原创 stm32f103(移植HAL库)添加spi的OLED代码(含源码)
使用STM32CubeMX配置spi的OLDE代码,这里的oled代码是直接使用江协科技的oled驱动代码来移植的。先把spi的oled跑通,后面想改就很快,直接改引脚就行,文章结尾附源码和工程资料
2025-10-13 14:49:19
1230
原创 使用NFC快速读取二代身份证uid
读取二代身份证的uid的流程的资料是公开的,参考使用PN532读取的两篇文章,用ST25R3911B测试了下,也可以读出取二代卡的uid,以下是详细资料和修改好的代码
2025-07-08 16:37:57
2041
原创 CSR8670蓝牙音频芯片快速上手(基础详细版)
大致讲解下这四个软件的使用,SDK是 ADK_CSR867x.WIN.4.4.0.21,这里跑一下sink里面的蓝牙耳机工程。介绍下各种软件的基础使用。
2025-03-05 14:22:31
2223
原创 STM32 PWM波形详细图解
步骤一:通过配置ARR(自动重装载值寄存器)和PSC(预分频器)的值,来设置CNT(计数器)的定时周期、计数频率。步骤二:再改变CCR(捕获/比较寄存器)的值,通过CNT与CCR的比较,可对PWM占空比进行调整。经过步骤一和步骤二:即可输出频率和占空比都可以调制的PWM波形ARR自动重装载值寄存器)PSC(预分频器)CNT(计数器)CCR(捕获/比较寄存器)脉冲宽度调制:PWM是一种数字信号控制技术,其中数字信号的占空比被用来控制模拟信号的幅度。
2024-11-30 16:35:27
2586
原创 XShell快速连接虚拟机(Ubuntu系统)
对于刚开始探索 Linux 世界的新手来说,拥有一台自己的服务器可能并不现实。幸运的是,虚拟机技术为我们提供了一个完美的解决方案。通过虚拟机,你可以在个人电脑上模拟出一台或多台服务器环境,比如 Ubuntu 或 CentOS,而无需担心影响主机系统。接下来,我将带你一起学习如何使用 Xshell 这款强大的 SSH 客户端软件,来远程连接并操控你的虚拟机,以 Ubuntu 为例,让我们开始这段精彩的学习之旅吧。
2024-09-15 19:25:21
1537
原创 IIC之原理---(基础/理解)
了解IIC基础的通信与时序知识;基础:使用IIC与AT24C02进行通信;进阶:使用IIC与NAU8822进行通信;通过理解IIC的7地址+8位数据和7地址+9位数据的不同外设通信需求区别。使用STM32进行软件IIC和硬件IIC的模拟。通过查看逻辑分析仪,进行时序的检测判断。
2024-07-30 02:47:55
2764
1
原创 STM32F103定时器中断详解
详细图解介绍:自动重装载寄存器,CNT计算器,PSC预分频器的工作原理。通用定时器通过PSC预分频器把接入的72MHZ的时钟进行分频。再通过CNT以分频后的时钟频率进行计数。定时器TIMx分为三种定时器:(基本定时器、通用定时器、高级定时器)接下来逐个介绍.....
2024-07-13 10:35:00
4001
5
原创 理解归并排序的两种方法(超详细)
结合图文剖析归并排序的思路;学习分治法、递归思想、gap调整区间优化。分治法(Divide and Conquer):归并排序是一种分治算法,它将问题分解成多个小问题,解决这些小问题,然后将它们的解决方案组合起来解决原始问题。递归(Recursion):归并排序的实现通常依赖于递归,这是一种在函数内部调用自身的方法。递归是解决某些问题(如树的遍历、排序等)的强大工具。稳定性(Stability):归并排序是一种稳定的排序算法,这意味着相等的元素在排序后保持它们原始的相对顺序。这对于某些应用场景非常重要。
2024-04-27 01:58:27
1842
原创 屏幕帧缓冲机制
屏幕多缓冲显示通常涉及帧缓冲(Framebuffer)的使用,这是一块与屏幕大小和分辨率相关联的内存区域。在图形用户界面(GUI)中,所有绘制操作都是通过对帧缓冲的操作完成的,这些操作包括内存设置(memset)和内存复制(memcpy)。这些操作的速度直接影响到帧缓冲的处理速度,因此为了优化性能,开发者通常会编写多个版本的 memset 和 memcpy。
2024-04-06 21:48:17
1783
原创 LCD屏幕mmap显示
mmap是一种内存映射文件的方法,它允许将文件或其它对象映射到进程的地址空间。使用mmap映射函数进行映射显示,与屏幕普通直接显示相比有很大的优势。
2024-04-06 00:41:24
1470
原创 系统IO函数接口
系统I/O接口提供了一系列的函数,如 open、read、write、close 等,用于打开、读取、写入和关闭文件。这些函数是进行文件处理的基础,允许程序访问磁盘上的文件资源。
2024-04-02 20:55:09
1500
原创 arm-linux-gcc配置安装
本次下载的交叉编译工具是:arm-linux-gnueabi-5.4.0.tararm-linux-gcc编译工具用于将代码编译成适用于ARM架构的Linux系统上的可执行文件。
2024-03-29 00:12:26
4017
原创 Makefile 变量与函数替换
系统变量进行Makefile操作自定义变量顾名思义就是用户自己定义的变量A = apple # 定义并赋值变量C = $(A) tree # $() 则是对某一个变量进行引用Even:@echo $(A)@echo $(B)@echo $(C)Makefile预定义变量B = ChinaEven :echo $(A);直接定义条件定义方式A = appleA?多命令行定义方式。
2024-03-27 10:32:36
1119
原创 Makefile 目标-依赖
Makefile是一个定义了如何构建一个软件项目的文本文件。Makefile通常包含了一系列的规则和指令,这些规则和指令描述了如何从源代码和其他资源文件构建出一个软件项目的目标文件(如可执行文件或库文件)。它的主要作用是自动化编译过程,确保只编译修改过的源文件,从而提高编译效率。以下是Makefile的一些关键点:
2024-03-24 16:14:54
1420
原创 动态库的制作与链接详解
这里介绍3种方法:方法一:把动态库文件放到系统默认的路径下即可 (/usr/lib 或者 /lib );方法二:把库所在的路径写入(添加)到环境变量中;方法三:在系统的默认路径下添加一个新的路径
2024-03-24 14:43:05
3163
2
原创 GCC制作静态库详解
带大家快速入门,学会制作静态库。本文详细介绍在Linux系统中使用gcc制作静态库的各种细节:库文件的命名: 必须使用lib作为前缀: 比如 libDeployPkg.so.0 / libhgfs.so.0 .....;静态库一般以 .a 为后缀 ;动态库一般以.so为后缀 库文件会有不同的版本, 一般写在后缀后面, 比如 lib.a.so.0.1.2;不管需要制作的是静态库还是动态库,原材料都是.o文件 (可重定位文件) 库文件内部不允许出现主函数main();
2024-03-23 17:03:25
1904
原创 GCC编译过程与实现
详细讲解gcc编译过程:预处理,编译,汇编,链接;使用gcc生成对源文件.c和.h文件进行编译运行,带大家区分它们的区别。一.GCC编辑器以下是常用的编辑器选项,不同的选项可以指导编译器有不同的行为表现,具体如下二.编译过程gcc编译过程分为四个步骤:预处理,编译,汇编,链接;接下来逐个进行介绍2.1 预处理#include 宏定义会被替换:#define 取消宏定义:#undef 条件编译:修改行号以及文件名:#line 998 "Hello.c"清除注释。
2024-03-23 15:37:01
3344
原创 传值、传址、空间释放详细图解
详细介绍函数传值和传地址区别:进行数据操作的区别,函数传值为临时拷贝,不会对实参影响。而传地址时,就是传实参,是可以影响到实参的..........
2024-03-18 22:25:07
1103
原创 九大运算符详解
C语言中的九大运算符分别是:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符、逗号运算符、指针运算符、杂项运算符。算术运算符:用于执行数学计算,如加(+)、减(-)、乘(*)、除(/)和取模(%)等。还有自增(++)和自减(--)运算符。关系运算符:用于比较两个值之间的关系,包括大于(>)、小于(=)和小于等于(
2024-03-16 16:00:47
1189
原创 linux中tar归档与(zip,gzip,bzip格式)压缩和解压
学会在linux中使用tar归档与(zip,gzip,bzip)压缩和解压。在Linux中,文件归档指的是将一个或多个文件或目录集合储存在一个文件中,这个过程也被称为打包。归档本身并不涉及数据压缩,所以生成的归档文件大小是所有包含文件大小的总和。归档通常用于备份和传输操作,方便管理和存储。归档后的文件可以通过不同的命令进行压缩以节省空间和加快传输速度。下面是一些常用的归档和压缩命令:
2024-03-16 14:15:18
2263
原创 死磕Shell命令
熟悉掌握最重要的几个Shell基础命令,在普通的linux日常操作中就显得游刃有余了。top 动态进程信息(类似进程管理器);sort 对文件的内容进行排序;which 查看命令所在的位置;uniq 去掉文件中重复项然后输出等.........
2024-03-13 23:30:51
1237
原创 程序员如何选择职业赛道?
程序员的学历,职位的市场需求,不同技术岗位工资等,都会影响程序员选择职业赛道,我们需要重视评估自己,来确定最适合自己的路径.............
2024-03-13 00:52:07
1057
stm32f103(移植HAL库)添加spi的OLED代码(含源码)
2025-10-13
arm-linux-gnueabi-5.4.0.tar
2024-03-28
MySQL,非空约束删除之后,show create table没变
2022-10-30
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅