- 博客(46)
- 收藏
- 关注
原创 卡尔曼滤波算法公式详解及应用(内附完整C代码及注释)
本文是一篇卡尔曼滤波算法实用指南,通过通俗易懂的方式介绍其核心原理和使用方法。文章首先列出五个核心公式并解释参数意义,强调实际应用而非数学推导。然后通过信号框图展示预测与更新过程的关系,并以匀速直线运动为例说明如何建立状态方程。作者用打靶情景形象解释算法物理意义——用测量值修正预测值得到最优估计。详细说明使用流程:确定观测量/状态量/控制量、计算关键矩阵、初始化参数、迭代计算及参数调节。最后提供单传感器(标量形式)和多传感器融合(矩阵形式)的具体代码实现,帮助读者快速掌握这一广泛应用于导航、控制等领域的优化
2025-05-28 20:52:42
9004
6
原创 在Winodws使用VSCode配置ESP32开发环境
本文详细介绍了在Windows系统下配置ESP32开发环境的完整流程。主要内容包括:1)下载安装ESP-IDF物联网开发框架并配置环境变量;2)安装VSCode编辑器;3)在VSCode中安装配置ESP-IDF扩展工具。文章特别强调了安装过程中的关键步骤和常见错误,如ESP-IDF安装时需点击修复按钮、正确设置环境变量路径等。通过这三个主要步骤,开发者可以成功搭建ESP32开发环境,为后续物联网项目开发做好准备。
2025-12-09 11:59:10
732
原创 Windows快速安装CMake工具
本文介绍了跨平台构建工具CMake的基本概念、下载和安装方法。CMake通过"CMakeLists.txt"文件为不同平台生成本地构建文件,支持Windows、Linux和MacOS系统。文章提供了官方下载链接和国内镜像两种获取方式,详细说明了Windows系统下的安装步骤,包括添加环境变量和选择安装目录。安装完成后即可配合IDE使用。
2025-12-09 11:12:08
252
原创 冒泡排序和插入排序算法详解及实现(内附代码及注释)
本文介绍了插入排序算法的工作原理及实现。插入排序通过构建有序序列,将未排序元素逐个插入到已排序部分的适当位置,实现方式类似于整理扑克牌。其时间复杂度最好为O(n),最差为O(n²),空间复杂度为O(1),是一种稳定的原地排序算法。相比冒泡排序,插入排序在实际应用中效率更高,特别适合资源受限的嵌入式系统。文中提供了C语言实现的完整代码,包含插入排序和冒泡排序两种实现方式,并详细注释了算法流程。
2025-11-20 19:10:32
474
原创 改进版快速排序算法详解及实现(内附完整代码及注释)
本文介绍了快速排序算法的C++实现,重点讲解了其分治思想和三数取中优化方法。文章阐述了算法的核心流程:选取基准值、左右双指针遍历、分区交换和递归处理。针对不同场景给出了使用建议,指出在嵌入式系统需考虑内存限制(推荐SRAM≥32KB)。提供了完整代码实现,包含三数取中函数、递归排序逻辑和正/逆序支持,并建议小数据量时可简化基准值选取以提高效率。最后通过测试案例验证了算法正确性。
2025-11-14 17:29:43
530
原创 单片机中的机器周期、指令周期、总线周期的联系和区别
本文系统解析了计算机系统中的三种关键周期概念:总线周期、机器周期和指令周期。总线周期是CPU与存储器进行一次数据交换的最小时间单位;机器周期包含多个总线周期,对应指令执行的一个基本阶段(如取指、译码);指令周期则包含若干机器周期,是完成整条指令的时间。三者呈层级包含关系(指令周期≥机器周期≥总线周期),其中现代架构通过流水线和单周期指令技术已模糊了这种严格划分。文章通过厨房运作的类比,生动阐释了这些抽象概念的实际意义与相互关系。
2025-10-22 21:19:00
876
原创 软件模拟SPI通信详解(内附完整代码及注释)
摘要: 本文详细介绍了SPI通信协议及其应用。SPI是一种高速同步串行接口,包含CLK、CS、MOSI和MISO四线制。文章重点解析了时钟极性(CPOL)和相位(CPHA)参数,通过时序图说明数据采样过程。针对CPOL=0、CPHA=1的从机设备,提供了完整的软件模拟SPI实现方案,包含C语言和面向对象的C++版本代码。其中C++版本采用继承方式实现多设备支持,包含管脚初始化、时钟控制、数据收发等核心功能。两种实现均采用高位先发的MSB传输方式,通过精确的时序控制实现SPI通信功能。
2025-10-22 20:51:18
1446
原创 单片机进入 B. 中断无限循环异常解决方法
【摘要】开发者在CS32L015单片机项目中遇到罕见硬件SPI异常:未开启中断却触发SPI中断,导致系统陷入B.中断死循环。通过Keil仿真分析发现,SPI发送数据后中断标志位异常置位但未清除。解决方法是:1)在SPI操作前关闭中断并复位标志位;2)通过NVIC控制器定位异常中断源;3)检查中断配置、回调函数及清除操作。该案例揭示了外设中断处理的隐蔽问题,提供了一套通过NVIC中断控制器快速定位B.中断异常的标准排查流程。
2025-10-13 19:34:00
1206
原创 【CS32L015C8T6】SPI详解及硬件SPI配置方法(内附完整代码及注释)
本文介绍了在CS32L015C8T6单片机上开发SPI通信的实践经验。作者针对该芯片资料匮乏、官方驱动不适用等问题,详细讲解了SPI协议原理、时序特点及硬件实现机制。文章重点分析了CS32L015的SPI硬件资源,包括双SPI接口、12Mbps速率和CRC校验功能,并提供了完整的初始化代码和GPIO配置方法。通过对比三个核心通信函数(发送、接收、收发)的工作原理,深入解析了SPI基于移位寄存器的数据交换本质。本文旨在为开发者提供实用参考,减少重复开发工作。
2025-09-24 10:16:57
1212
1
原创 【CS32L015C8T6】UART串口通信详解及驱动配置方法(内附完整代码及注释)
本文介绍了CS32L015C8T6单片机的UART串口通信配置方法。首先对比了串行通信和并行通信的特点,重点讲解了UART串口协议的基本原理和连接方式。针对CS32L015C8T6芯片,详细说明了其串口硬件资源,包括4个通用串口和1个低功耗串口的区别。文章提供了完整的串口配置流程:GPIO复用初始化、UART参数设置、中断配置及回调函数实现,并附有详细的代码注释。特别指出该芯片特有的"BaudDouble"参数的作用,虽然能支持更高波特率但不会改变实际配置波特率。最后给出了UART数据收
2025-09-24 10:07:37
776
原创 【CS32L015C8T6】GPIO驱动配置方法(内附完整代码及注释)
本文介绍了芯海CS32L015C8T6单片机的GPIO配置方法。该芯片具有4个GPIO端口(A-D),每个端口最多8个复用功能。文章详细说明了GPIO配置的特殊参数(如硬件消抖功能),并提供了完整的初始化代码示例,包括中断模式、SWD下载端口、输入/输出模式的配置方法。作者分享了在实际开发中总结的经验,旨在帮助开发者减少重复工作。代码示例包含详细注释,展示了GPIO模式设置、中断配置、时钟使能等关键操作。
2025-09-19 16:42:32
340
原创 【CS32L015C8T6】ADC驱动配置方法(内附完整代码及注释)
本文介绍了芯海CS32L015C8T6单片机的ADC配置方法。该MCU采用12位精度ADC,具有17个外部和5个内部输入通道,但缺乏DMA功能。文章详细阐述了配置流程:1)设置GPIO模拟输入功能;2)配置ADC参数(包括自动累加功能);3)实现中断处理。重点讲解了ADC单通道中断回调函数的实现方法,并提供了完整代码示例。作者分享了实际开发中的经验,指出官方驱动代码的不足,帮助开发者避免重复造轮子。适用于需要低成本ADC解决方案的嵌入式开发场景。
2025-09-19 14:57:06
1065
3
原创 【CS32L015C8T6】下载Hex文件配置及异常现象解决方法
本文介绍了CS32L015C8T6单片机在Keil环境下的下载配置方法及常见问题解决方案。主要内容包括:1)选择正确的下载器和Cortex-M0+内核;2)处理地址映射错误提示;3)通过Debug-Setting界面重新配置Flash下载算法;4)添加64KB Flash下载算法后成功下载Hex文件。文章提供了基于芯海官方HAL库开发的实用技巧,适用于开发过程中遇到的下载异常情况。
2025-09-10 20:02:51
481
原创 【CS32L015C8T6】内部FLASH读写方法(内附完整代码及注释)
本文介绍了芯海CS32L015C8T6单片机内部FLASH操作方法。该芯片具有64KB FLASH(128个512B扇区)和8KB SRAM,文章详细讲解了FLASH地址定义差异,并提供了基于HAL库的读写函数代码:写入函数包含解锁、擦除(以扇区为单位)、编程(双字写入)和上锁流程;读取函数采用memcpy实现数据复制。文末附有完整代码注释,并提示需要官方支持库可联系作者或芯海官方。
2025-09-10 19:52:10
548
原创 【CS32L015C8T6】配置单片机PWM输出(内附完整代码及注释)
摘要:本文介绍了CS32L015微控制器的PWM配置方法。CS32L015是一款基于ARM Cortex-M0+内核的低功耗MCU,内置丰富外设资源,包含多个定时器模块。文章详细说明了其PWM硬件资源,包括3个16位高级定时器、4个通用定时器等。重点描述了PWM配置步骤:1)使能时钟;2)初始化GPIO复用功能;3)配置定时器参数;4)设置PWM模式。最后提供了完整的代码实现,包括定时器初始化、PWM通道配置等关键函数,并附有详细注释,可作为开发参考。
2025-09-04 20:00:39
551
原创 【CS32L015C8T6】使用 通用定时器 配置单片机时基TimeBase(内附完整代码及注释)
本文介绍了CS32L015微控制器的时基(TimeBase)和SysTick系统滴答的概念、联系与区别。时基作为系统时间基准可由SysTick或通用定时器实现,常用于延时、任务调度等功能。文章详细讲解了通过CS32L015的基本定时器配置系统时基的步骤,包括时钟使能、定时器选择、结构体初始化、中断优先级设置等关键环节,并提供了完整的配置代码示例。该配置可实现软件定时器扩展功能,适用于嵌入式系统开发。
2025-09-04 19:53:57
908
原创 【C++】使用箱线图算法剔除数据样本中的异常值
本文介绍了箱线图算法及其在数据处理中的应用。主要内容包括:箱线图基于五数概括(最小值、Q1、Q2、Q3、最大值)展示数据分布,通过IQR(四分位距)识别异常值(1.5倍IQR为温和异常值,3倍IQR为极端异常值)。应用场景包括异常值检测、多组数据比较、偏态分析和离散程度判断,适用于非正态分布数据。文章还指出箱线图的局限性(无法显示复杂分布、小样本不稳定性等),并提供了C++实现的快速排序和箱线图计算代码。
2025-07-24 22:23:15
1168
原创 【C++】使用中值滤波算法过滤数据样本中的尖刺噪声
本文介绍了中值滤波的基本原理、优劣分析和应用领域。中值滤波通过滑动窗口排序取中值的方式有效去除椒盐噪声并保留边缘信息,在图像处理和数据滤波中应用广泛。文章详细阐述了算法实现步骤,包括窗口定义、邻域像素收集、排序取中值等核心流程,并提供了C语言实现代码。同时分析了中值滤波的局限性,如对高斯噪声效果不佳、窗口过大导致模糊等问题。最后列举了其在医学影像、卫星遥感、工业检测等领域的典型应用场景。
2025-07-24 22:21:25
605
原创 【Keil】C/C++混合编程的简单方法
本文介绍了在Keil开发环境下实现C与C++混合编程的方法。主要内容包括:1)在.c文件中调用C++代码的步骤:在.cpp文件中定义C风格接口函数,在其中调用C++类方法,并在main.c中声明调用;2)在.cpp文件中调用C代码的方法:使用extern "C"声明C函数。文章通过具体代码示例展示了如何解决两种语言因编译规则差异导致的调用问题,帮助开发者在保持C语言高效性的同时,利用C++面向对象特性增强功能。适用于嵌入式开发中需要融合两种语言优势的场景。
2025-07-15 22:20:11
1385
原创 嵌入式变量存储空间详解(内附代码及注释)
摘要:本文以STM32G070CBT6单片机为例,详细解析了嵌入式系统中内存和变量的存储管理。128KB的内部FLASH用于存储程序代码、中断向量表和常量,支持通过特定操作进行数据写入。36KB的SRAM则分为栈(存储局部变量)、堆(动态分配内存)和静态存储区(全局变量)三个区域,并配以代码示例说明不同变量的存储位置。文章还强调了查看.map文件进行内存分配验证的重要性,为嵌入式开发者提供了实用的内存管理参考。(149字)
2025-07-15 21:40:51
1089
原创 FreeRTOS源码学习之内核初始化
本文介绍了使用STM32CubeMX添加FreeRTOS后的初始化流程。主要内容包括:1)主函数中通过osKernelInitialize()进行内核初始化,并通过osKernelStart()启动任务调度;2)详细解析了osKernelInitialize()函数,该函数会检查中断状态并配置堆内存,将内核状态设为就绪;3)解释了IS_IRQ()宏如何通过读取IPSR寄存器检测当前是否处于中断上下文。文章还特别说明了在中断中不进行内核初始化的原因,是为了避免中断嵌套导致的资源竞争问题。
2025-07-11 11:34:38
633
原创 【Python】使用LM算法根据数据样本拟合近似函数
摘要:LM(Levenberg-Marquardt)算法是一种结合梯度下降与高斯-牛顿法优点的非线性优化算法,适用于最小二乘问题求解。其特点包括收敛速度快、数值稳定性好,广泛应用于数据拟合、参数估计等领域。本文通过Python代码示例,展示了使用scipy库中的curve_fit函数实现多项式拟合的过程,并对比了不同多项式阶数的拟合效果。结果表明,高阶多项式通常能获得更好的拟合效果,但需根据实际数据特点选择合适的拟合函数。
2025-07-11 11:30:19
745
原创 3、结合STM32CubeMX学习FreeRTOS实时操作系统——队列
本文介绍了FreeRTOS队列的核心概念、特性和使用方法。队列作为任务间通信的基础组件,具有FIFO、线程安全、阻塞机制等特性。文章详细讲解了队列的常用API函数(如xQueueSend、xQueueReceive等)、创建配置原则及选型指南,并通过示例代码演示了在任务中使用队列实现数据通信的过程。特别强调了在中断程序中需要使用FromISR后缀的队列操作函数。最后通过Keil仿真案例展示了两个任务间通过队列传递模拟传感器数据的具体实现方法。
2025-06-23 23:34:08
890
原创 2、结合STM32CubeMX学习FreeRTOS实时操作系统——任务
本文介绍了如何在STM32CubeMX中使用FreeRTOS的任务管理功能。FreeRTOS的任务是具有独立堆栈的循环函数,包含运行、就绪、阻塞和挂起四种状态。文章详细说明了任务状态转换机制,强调高优先级任务必须使用阻塞指令(如osDelay)以确保低优先级任务执行。通过STM32CubeMX创建任务后,开发者只需在app_freertos.c文件中编写具体功能代码。配置任务时需合理设置优先级,生成代码后系统会自动注册任务并调用osKernelStart()启动调度。示例展示了LED闪烁任务的实现,并指出F
2025-06-23 23:09:59
1194
原创 1、使用STM32CubeMX在项目中添加FreeRTOS源码
本文介绍了使用STM32CubeMX配置FreeRTOS系统的完整流程:1)需先下载FreeRTOS支持包;2)添加FreeRTOS系统时需在CMSIS_V1(适用于资源有限场景)和CMSIS_V2(支持动态内存分配)版本间选择;3)介绍了Project Manager的设置技巧;4)推荐将系统时钟源从SysTick改为TIMx定时器以提升兼容性;5)最后生成项目代码。文章还对比了CMSIS_V1和V2的特性差异,为开发者提供版本选择参考。
2025-06-18 20:24:37
927
原创 结合 STM32CubeMX 使用 FreeRTOS 实时操作系统
本文介绍了使用STM32CubeMX配置FreeRTOS操作系统的学习教程。作者指出STM32CubeMX简化了嵌入式开发流程,可以快速生成包含FreeRTOS源码的项目。教程分为两个阶段:核心基础(任务管理、调度、队列、信号量等)和进阶功能(定时器、内存管理、中断等)。作者推荐了学习顺序,并参考了CSDN博主"不秃也很强"的相关教程。该系列将通过由浅入深的方式,帮助开发者系统掌握FreeRTOS在STM32平台的应用。
2025-06-18 20:08:57
723
原创 MS1003时间测量芯片驱动配置(内附完整代码及注释)
MS1003是一款高精度时间测量芯片(TDC),具有ps级的时间分辨率(1ps时间内光飞行0.3mm),是MS1002的升级版,有更高的精度和更小的封装,配置方式也更丰富,适用于激光雷达、激光测距和脉冲间隔测量。◼自动测量START到STOP之间的时间间隔,无需再配置寄存器◼在非校准模式下,可以测量(小于配置的预期脉冲数)内的任意数量的脉冲◼双通道单精度模式测量最小时间分辨率46ps(光在1ps时间飞行0.3毫米)◼单通道双精度模式测量最小时间分辨率23ps◼非校准单精度测量范围。
2025-06-16 18:08:05
989
6
原创 LSMDSV16X六轴传感器驱动,启用SFLP功能输出四元数(内附驱动代码及注释)
最近在使用LSMDSV16X六轴传感器来做三维空间位姿估计,因为LSMDSV16X传感器有一个SFLP低功耗传感器融合功能,可以直接输出加速度计和陀螺仪数据融合后计算出的四元数,这个四元数是以世界坐标系位参考的,可以用来表示机身在世界坐标系下的姿态,类似于MPU6050的内置传感器融合模块,但是MPU6050价格太贵,所以使用LSMDSV16X来实现。驱动直接使用LSMDSV16X六轴传感器的官方版本,本文将介绍如何将官方驱动成功移植到开发者自己的项目中并实现运行。
2025-06-16 16:19:39
976
原创 二、使用LSM6DS3TR六轴传感器加速度计+陀螺仪数据融合算法计算三维空间旋转向量(内附完整代码及注释)
本文介绍了一种新的加速度计和陀螺仪的传感器融合思路,用来计算三维空间的旋转向量,内附完整版的算法代码以及注释。
2025-05-23 00:05:26
1794
2
原创 一、LSM6DS3TR六轴传感器驱动及数据读取(内附完整代码及注释)
本文介绍了LSM6DS3TR六轴传感器的驱动设计思路,内附完整驱动代码和注释
2025-05-22 20:58:10
2897
6
原创 【软件模拟I2C】详解IIC通信协议(内附完整软件模拟IIC代码及注释)
IIC通信协议详解,内附软件模拟IIC通信协议完整代码以及代码注释,包甜的@!
2025-04-30 00:02:04
3245
原创 【网络修复】修复浏览器无法打开网页异常
加速器在开启时会自动修改系统网络配置,正常关闭软件时会自动恢复网络配置,但是如果不关闭软件直接关机,软件来不及恢复网络配置,就会造成系统网络配置被修改,很有可能出现浏览器无法上网的现象。此方法能修复微信等软件可正常使用,但浏览器无法上网的情况。,选择你当前正在使用的,无法上网的网络,右键单击,打开。如果以上方法都不行,那就试一下把网络的DNS址设置为。1)使用管理员身份运行命令提示符。2)选择IPv4协议,双击进入。此方法能解决80%网络问题。2)在命令提示符中输入。4)点击确认,问题解决。
2025-04-26 12:08:04
3466
4
原创 【LeetCode】122.买卖股票的最佳时机Ⅱ
1、分析问题关系得出,最大利润便是向量中所有升序列的序列尾减去序列头然后相加,比如说{1,2,3},最大利润为3-1=2,等价为(3-2)+(2-1)=2,在数组中可以用后一位减去前一位,若值>0,说明这两个数是递增的,便可以在总利润中加上两者差值。这里提供另一种时间复杂度O(N)版本,双指针,通常用来优化算法运行时间,但是麻烦一点,需要特别注意边界条件、停止条件和指针逻辑,容易出错,最好先画出流程图。
2023-09-14 17:00:42
146
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅