自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 收藏
  • 关注

原创 基于STM32的宠物畜牧低功耗定位器开发实录

终端通过GPS采集位置,LoRa与本地网关通信,NB-IoT作为广域备份直接上云;另外经纬度格式是ddmm.mmmm(度分格式),必须转换为dd.dddddd(度),否则会产生百米级偏差。根因:Stop关闭HSE,唤醒后默认HSI 8MHz,系统时钟树仍认为自己是72MHz,所有波特率、SPI时钟全部错乱。$PCAS03,1,0,0,0*0B:仅输出GPGGA和GPRMC,关闭GPGSV/GPGSA,减少UART负载。解决:强制使用LSE,配置正确负载电容(6-12pF),备份域重新初始化。

2026-06-01 21:51:11 336

原创 基于STM32+FreeRTOS的两轮自平衡小车(蓝牙遥控+LoRa OTA升级)开发全解析

本文详细介绍基于STM32F103C8T6和FreeRTOS的两轮自平衡小车开发方案。系统采用MPU6050姿态传感器和卡尔曼滤波算法实现精确姿态检测(误差<±1°),通过三级PID控制实现稳定平衡。硬件包含TB6612FNG电机驱动、霍尔编码器和双无线模块(蓝牙遥控+LoRa OTA升级)。软件层面采用FreeRTOS多任务调度,划分6个优先级任务,并实现Bootloader引导程序支持LoRa远程固件升级。项目完整展示了嵌入式系统开发中的硬件设计、实时控制算法和无线通信技术集成。

2026-05-22 00:21:17 32

原创 第七章:Makefile多目录项目 - 组织大型项目结构

本文介绍了使用Makefile管理多目录项目的核心方法。首先对比了单目录与多目录项目的结构差异,说明多目录的必要性。随后给出标准项目结构建议,包括src、include、build等目录的规范布局。重点讲解了两种实现方式:递归调用Makefile的传统方法和更推荐的非递归方法。通过一个完整计算器项目的实战示例,展示了非递归Makefile的实现细节,包括自动发现源文件、生成依赖关系、创建目录结构等关键技巧。最后还介绍了模块化管理和第三方库的处理方法,为大型项目构建提供了系统解决方案。

2025-12-16 09:49:07 264

原创 第六章:Makefile自动依赖生成 - 头文件变更自动编译

本文详细介绍了Makefile中自动生成依赖关系的实现方法,解决头文件修改需要手动更新Makefile的问题。主要内容包括:1) 使用GCC的-MMD和-MP选项自动生成依赖文件;2) 两种实现方案对比及推荐写法;3) 完整的实战示例,展示多目录项目的处理方式;4) 常见问题解决方法及高级技巧;5) 生产环境下的完整Makefile模板。通过自动分析#include语句生成.d依赖文件,实现头文件变更时自动重新编译相关文件,大幅提升开发效率。关键三步:编译时添加-MMD -MP选项、定义DEPS变量、使用-

2025-12-15 19:22:49 527

原创 第五章:Makefile条件判断 - 智能构建的核心

文章摘要:Makefile条件判断是智能构建的核心技术,主要包括四种判断方式:ifeq/ifneq(值判断)、ifdef/ifndef(定义判断)、$(if)函数和filter函数。通过条件判断可实现:1)区分调试/发布版本;2)跨平台自动适配;3)功能自动检测;4)构建参数智能选择。最佳实践包括:设置变量默认值、错误检查、组合判断和条件编译不同文件。典型应用场景包括自动检测编译器特性、操作系统适配和功能模块选择。关键技巧是使用变量组合简化复杂条件,并遵循"让Makefile适应环境"的

2025-12-15 19:10:24 164

原创 第四章:Makefile函数使用 - 强大的文本处理能力

本文摘要: Makefile函数使用指南详细介绍了GNU Make中强大的文本处理函数功能。文章首先解释了为什么需要函数(处理文件名转换、路径操作等),然后介绍了函数基本语法。重点讲解了五类常用内置函数:1)字符串处理函数(subst、patsubst等);2)文件名处理函数(dir、notdir等);3)文件列表函数(wildcard);4)条件判断函数(if、or等);5)其他实用函数(shell、error等)。最后通过一个智能Makefile实战示例,展示了如何利用函数自动查找源文件、转换文件名和管

2025-12-09 14:39:22 670

原创 stm32+freertos蓝牙平衡小车核心代码与硬件清单

本文介绍了一款基于STM32F103C8T6的两轮自平衡小车设计方案。系统采用MPU6050姿态传感器获取角度数据,通过卡尔曼滤波处理后,由三级串级PID控制算法实现平衡控制。硬件包含TB6612FNG电机驱动、N20编码电机和蓝牙模块,软件基于FreeRTOS实现多任务调度。关键参数包括平衡环(Kp=180,Kd=0.92)、速度环(Kp=4.8,Ki=0.09)和转向环(Kp=18)。系统可实现±1°精度平衡和蓝牙遥控功能,调试经验强调了滤波处理和参数渐进调整的重要性。

2025-12-09 14:35:46 363

原创 第四章:Makefile函数 - 让构建更智能的魔法工具

本文介绍了Makefile函数的用法,重点讲解了5个核心函数:wildcard自动查找文件、patsubst批量改名、filter文件过滤、addprefix添加前缀和if条件判断。通过示例展示了如何利用这些函数实现自动发现源文件、生成目标文件、设置编译选项等功能。文章还提供了一个完整的智能Makefile实战案例,包含自动版本号、并行编译等高级技巧,并指出了常见错误和解决方法。最后强调Makefile的核心思想是让计算机处理重复工作,开发者只需定义规则。掌握这些函数可以显著提升构建系统的智能化和效率。

2025-12-08 01:09:04 386

原创 第二章:Makefile变量使用 - 让构建文件更简洁

本文介绍了Makefile中变量的使用技巧,主要包括:1) 变量的定义与基本语法;2) 4种变量类型(递归展开、直接展开、条件赋值、追加赋值);3) 自动变量($@、$<等)的应用;4) 特殊变量和命令行参数覆盖;5) 多目录项目的变量实践。通过变量优化,可使Makefile更简洁、灵活,便于维护大型项目。文章还提供了优化示例和最佳实践建议,帮助开发者提升构建效率。

2025-12-07 12:14:27 431

原创 第三章:Makefile模式规则 - 更智能的编译规则

本文详细介绍了Makefile中的模式规则使用方法。模式规则通过%通配符简化了多文件编译过程,只需一个规则即可处理所有同类文件的编译,相比普通规则更加简洁高效。文章讲解了模式规则的基本语法、自动变量使用、静态模式规则等核心概念,并通过示例项目展示了实际应用。还介绍了如何处理多文件类型项目和常见问题解决方案。模式规则的优势在于减少重复代码、提高可维护性和灵活性,是Makefile自动化编译的重要工具。

2025-12-07 12:08:33 349

原创 第二章:Makefile变量使用 - 让构建文件更简洁

在第一章的例子中,我们的Makefile有很多重复的内容。想象一下,如果你的项目有50个文件,每个编译命令都要写gcc,如果要改成clang,得改多少地方?掌握了变量,我们的Makefile已经简洁了很多。在第三章,我们将学习模式规则,让Makefile更加智能,自动处理更多的文件类型,真正做到"一劳永逸"!# 立即展开,此时OPTIONS还没定义,所以CFLAGS的值是 " -Wall"# 使用时才展开,所以CFLAGS的值是 "-O2 -Wall"· ✅ 自动变量:$@、$<、$^、$?

2025-12-04 08:58:34 730

原创 第一章:Makefile入门 - 为什么要用Makefile

Makefile是一个构建自动化工具的配置文件,它告诉make命令如何编译和链接你的程序。想象一下,你有一个包含几十个源文件的项目,每次修改后都要手动输入一堆编译命令,是不是很麻烦?在下一章,我们将学习Makefile的变量使用,让我们的Makefile更简洁、更强大!· recipe(配方):如何生成目标的命令(前面必须是TAB键,不是空格!下一篇预告:第二章:Makefile变量使用 - 让构建文件更简洁。第一章:Makefile入门 - 为什么要用Makefile?

2025-12-04 08:53:47 357

原创 第一章:Makefile入门 - 为什么要用Makefile

Makefile是一个构建自动化工具的配置文件,它告诉make命令如何编译和链接你的程序。想象一下,你有一个包含几十个源文件的项目,每次修改后都要手动输入一堆编译命令,是不是很麻烦?在下一章,我们将学习Makefile的变量使用,让我们的Makefile更简洁、更强大!· recipe(配方):如何生成目标的命令(前面必须是TAB键,不是空格!· target(目标):要生成的文件名,比如program、main.o。· prerequisites(依赖):生成目标所需要的文件。

2025-12-03 12:40:58 259

原创 嵌入式寄存器开发新手常见的小问题user\main.c(9): error: #44: expression must have pointer type

摘要:报错提示指向了非指针对象,需注意指针运算符优先级问题。gpio的优先级低于->操作符,因此在访问GPIOB_BASE寄存器时应先进行强制类型转换,正确写法为:((gpio)GPIOB_BASE)。通过添加括号确保类型转换先于成员访问操作执行,可解决该编译错误。

2025-08-16 14:36:44 153

原创 嵌入式常见错误 ..\app\fft.c(34): error: #18: expected a “)“或者unexpect ;

当出现编译错误时,新手常犯的典型错误是在#define指令后多加了一个分号。解决方法很简单:右键点击错误跳转到定义位置,或直接查看错误提示,找到多余的;号并删除即可。这个简单的语法错误通过编译器提示能快速定位和修正。

2025-07-23 18:39:50 237

原创 error: expected function body after function declarator

出现以上错误的时候可以检查一下头文件的分号是不是用英文的,用中文就会出现以上情况,这种错误往往很难发现。

2025-06-09 21:50:01 478

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除