- 博客(219)
- 收藏
- 关注

原创 SimpleFOC学习笔记汇总(2025.07.16更新)
在机器人领域,掌握无刷电机的控制相当于掌握机器人设计的“半壁江山”。这个年代,对个人来说学习一种新技术最好是通过开源项目了。通过开源项目快速将项目搭建起来,接着结合实践与理论才能真正掌握技术。未来的一段很长的时间里,将分享simpleFOC学习的笔记。通过分享笔记的方式,进一步提高自己对FOC的理解。大家互相学习,共同进步吧。
2025-01-14 23:56:44
3609
5

原创 嵌入式CANopen协议从入门到落地产品(更新2023.10.18)
一、前言我写CANopen系列博文的初衷是分享如何使用STM32单片机开发一款CANopen产品,所谓实战为主,理论为辅。光看CANopen协议的理论是很枯燥的,而且无论看多少遍都无法掌握CANopen协议。我认为掌握CANopen协议的唯一方法是自己设计一个CANopen从站。以前我在电气研发的时候,看了很多遍讲CANopen协议的pdf与书籍,最后也没看懂CANopen是什么东西。害的我在工作上一碰到CANopen协议就害怕,觉得是一个非常复杂的东西,一般人根本学不会。命运的转折点又来了,上一年(2
2021-07-28 21:16:36
16838
16

原创 STM32+CubeMX开发笔记汇总(更新2025.08.04)
只会用HAL库,不会完全不理会寄存器,只能算是入门。别扯寄存器开发周期长什么的,移植会很困难。在高手面前,这些都是问题。在高手看来,怎样提高效率与减少空间才值得品味。
2021-07-13 21:47:53
5707
3

原创 嵌入式实时操作系统RTX5快速入门 (完结)
一、前言在实际工作上使用过ucosIII与FreeRTOS,对它们俩的API都较为熟悉,那么当有新的项目时,直接二选一就好了。为什么非得去折腾另一款新的RTOS(RTX5)?原因是使用RTOS会影响系统的执行效率(ISR切换线程,线程切换线程都需要时间)。但是,RTX5在这方面做得不错,这是我非得去折腾一个新的RTOS的原因。RTX5的简单介绍可以查看安富莱的总结:第3章 RTX5操作系统介绍非得折腾去RTX5的理由:实时性强。以低的中断延迟执行高速实时操作(对于M3/M4/M7内核可以实现零中断延
2021-06-09 23:01:16
28984
22
原创 Hexo - 免费搭建个人博客07 - 添加右上角的“目录”
我的博客:https://q164129345.github.io/如上所示,在个人博客的右上角增加“目录”。有了目录,可以方便地切换各个自定义的页面。
2025-08-05 00:06:30
84
原创 STM32F103_Bootloader程序开发14 - 警惕!别在main()函数里设置中断向量表VTOR
摘要:STM32中断向量表(SCB->VTOR)应在SystemInit()函数中重定位,而非main()函数。系统启动流程中,SystemInit()是最早可安全执行C代码的地方,若在main()中设置VTOR,会导致在设置前可能出现中断,从而跳转到错误的中断服务程序。规范做法是在system_stm32f1xx.c文件的SystemInit()函数中完成VTOR设置,确保在任何可能产生中断的操作前完成重定向。文末提供了基于STM32F103的标准SCB实现项目地址和IAP升级测试结果。
2025-08-04 20:15:00
415
原创 STM32F103_Bootloader程序开发13 - 巧用逆向拷贝,实现固件更新的“准原子”操作,无惧升级中的意外掉电
本文针对STM32F103 IAP Bootloader中固件搬运函数存在的潜在风险进行优化。当固件更新过程中意外掉电时,传统顺序拷贝可能导致App区被部分写入但校验通过,造成系统崩溃。 关键改进点: 采用逆向拷贝技术,将向量表(包含栈指针和复位向量)作为最后一步写入 新增OP_Flash_ReverseCopy()函数实现从尾部开始的固件迁移 确保即使掉电,App区要么完全有效,要么完全无效 该方案使固件更新具备"准原子性",大幅提升系统可靠性。项目代码已开源,包含详细的注释和边界检查
2025-08-03 18:13:58
641
原创 Hexo - 免费搭建个人博客06 - 安装、切换主题Butterfly
本文介绍了Hexo博客更换Butterfly主题的完整过程。首先在官方主题库中找到Butterfly主题,通过git clone指令成功安装主题文件。随后安装必要的渲染插件,使用hexo三合一指令在本地测试新主题效果,最后将更新后的博客部署到GitHub Pages。整个过程图文并茂地展示了从主题选择、安装配置到最终部署的全部步骤,成功实现了博客主题的更换。
2025-07-24 00:00:38
339
原创 Hexo - 免费搭建个人博客05 - 更新个人博客
博客更新与项目备份流程 本文记录了作者对个人博客系统进行维护的两个主要操作:首先更新博客内容并推送到GitHub公开仓库,随后将Hexo项目备份至私有仓库。作者通过修改_config.yml配置文件,使用Hexo命令链hexo clean && hexo generate && hexo server在本地测试变更,确认无误后将更新推送到q164129345.github.io公开博客站点。完成内容更新后,作者又将整个Hexo项目作为版本备份提交到私有GitHub仓库,确保项
2025-07-23 23:49:59
353
原创 Hexo - 免费搭建个人博客04 - 创建另一个私人仓库,对Hexo项目进行版本管理
本文介绍了如何将本地Hexo博客项目上传到GitHub私人仓库。首先需在GitHub创建myblog仓库,然后按照提示步骤操作:初始化本地仓库、添加文件(使用git add .替代README.md)、提交更改并推送到远程仓库。通过截图展示了成功上传Hexo项目到GitHub的全过程,包括命令行操作和最终效果展示,为Hexo博客的版本管理提供了简单实用的解决方案。
2025-07-23 23:41:40
257
原创 Hexo - 免费搭建个人博客03 - 将个人博客托管到github,个人博客公开给大家访问
我的博客:https://q164129345.github.io/既然要将个人博客托管到github,首先我们肯定要有一个github账户。另外也需要在电脑上安装另外一个著名的代码管理工具git。
2025-07-23 23:37:10
1361
1
原创 Hexo - 免费搭建个人博客01 - 安装软件工具
追求系统稳定性、可靠性以及希望减少维护频率的用户来说,LTS版本无疑是更优的选择。在终端输入以下指令,将npm切换到国内源,目的是提高安装软件包的速度。官方网址:https://nodejs.org/zh-cn。能查看到Node.js的版本号与npm的版本号。如上所示,在终端输入以下指令完成客户端的安装。完成安装后,在命令行输入。
2025-07-23 23:20:14
299
原创 无刷电机控制 - 基于STM32F405+CubeMX+HAL库+SimpleFOC04,完成霍尔传感器的驱动代码
本文介绍了基于STM32F405和霍尔传感器的无刷电机FOC控制系统实现。主要内容包括:1)硬件电路设计,详细说明了霍尔传感器与STM32的接口连接;2)CubeMX配置GPIO和中断;3)从simpleFOC移植霍尔传感器代码并进行STM32 HAL库适配;4)代码实现细节,包括中断处理、传感器初始化和位置检测;5)系统调试过程。项目代码已开源在Gitee和GitHub平台,为开发者提供了完整的参考实现方案。该系统通过霍尔传感器实现了电机转子位置检测,为FOC控制提供了重要反馈信号。
2025-07-18 09:22:25
367
原创 无刷电机控制 - 基于STM32F405+CubeMX+HAL库+SimpleFOC03,开环速度控制
摘要:本文介绍了基于STM32F405和SimpleFOC库实现对中空三相无刷电机的开环速度控制。实验采用21极对数的电机参数配置,通过BLDCDriver6PWM驱动模块成功驱动电机旋转。项目提供了完整的代码实现,包括电机对象实例化和参数设置,并开源在Gitee和GitHub平台,为无刷电机控制开发提供了参考实例。通过PWM信号控制实现了仅连接三相线即可驱动电机转动的效果。
2025-07-16 19:19:37
300
原创 无刷电机控制 - 基于STM32F405+CubeMX+HAL库+SimpleFOC02 ,完成三相半桥驱动程序BLDCDriver6PWM
如上所示,本次实验使用中空三相无刷电机 + STM32F405的FOC电机控制板。
2025-07-15 21:18:59
832
原创 无刷电机控制 - 基于STM32F405+CubeMX+HAL库+SimpleFOC01 ,移植simpleFOC
STM32F405与STM32F103在FOC电机控制中的性能对比分析 本文对比了STM32F405和STM32F103在FOC电机控制应用中的核心差异。STM32F405凭借Cortex-M4内核、168MHz主频、硬件FPU和DSP指令集,在运算能力上显著优于72MHz的STM32F103(Cortex-M3)。具体差异体现在: 处理器性能:F405支持浮点运算和DSP指令 内存资源:F405具有112KB SRAM和512-1024KB Flash 外设支持:F405提供更快的ADC采样(2.4Msp
2025-07-07 19:36:16
725
原创 STM32F103_Bootloader程序开发12 - IAP升级全流程
本教程使用正点原子战舰板开发。》上一章节实现App跳转bootloader,接着,跳转到bootloader后,下位机要发送报文‘C’给IAP上位机,表示我准备好接收固件数据。
2025-07-04 18:54:24
420
原创 STM32F103_Bootloader程序开发11 - 实现 App 安全跳转至 Bootloader
想象一下,我们的单片机 App 正在稳定地运行着,突然我们想给它升级一下,添加个新功能。我们该如何安全地通知它:“嘿,准备好接收新固件了” ? 这就需要 App 和 Bootloader 之间建立一个可靠的"秘密握手"机制。整个流程就像一次精心策划的"交接仪式":项目地址:现在,我们来看看 App 程序需要增加哪些代码来实现这个"交接仪式"。这个文件负责处理从 App 跳转到 Bootloader 的所有核心逻辑。代码亮点解析: 变量的定义: 函数:头文件很简单,主要是声明 函数,以便在其他文件中(比如
2025-07-02 19:00:00
722
原创 STM32F103_Bootloader程序开发10 - 实现IAP通讯看门狗与提升“跳转状态机”的健壮性
在嵌入式系统的生命周期中,固件更新(IAP,In-Application Programming)是不可或缺的一环。一个设计精良的Bootloader不仅是产品迭代的基石,更是系统稳定性的最后一道防线。在本系列之前的文章中,我们已经成功实现了通过Ymodem协议进行固件的下载、校验与搬运。这个问题看似简单,背后却隐藏着巨大的风险。想象一下,当现场的设备收到一条进入IAP模式的指令后,它跳转到了Bootloader。
2025-07-01 19:43:41
935
原创 STM32F103_Bootloader程序开发09 - 恰到好处的Ymodem协议
这是一个完全解耦的YModem协议下位机实现,专门为STM32F103系列微控制器设计。接收来自任何数据源的YModem格式数据(串口、网口、蓝牙、文件等)验证数据包的完整性(CRC16校验)将固件数据写入Flash存储器的指定区域提供传输进度反馈完全独立于通信接口,支持任意数据源。
2025-06-25 15:12:04
815
原创 STM32F103_LL库+寄存器学习笔记12.3 - 串口DMA高效收发实战3:支持多实例化的版本
《STM32F103_LL库+寄存器学习笔记12.2 - 串口DMA高效收发实战2:进一步提高串口接收的效率》基于上一个版本,进一步提升代码的模块化水平,支持多实例化。如上所示,收发大量的数据,没有丢包。项目地址:github:gitee(国内):1.2、bsp_usart_drive.h1.3、main.c
2025-06-21 16:53:25
680
原创 VScode - 我的常用插件01 - 主题插件Noctis
是一款为 Visual Studio Code 提供的,主打。它有多种配色风格,适合不同的开发者审美和工作场景。
2025-06-10 14:02:00
468
原创 STM32F103_Bootloader程序开发08 - 将App下载缓存区的固件搬运到App区,运行新的App程序(op_flash.c与op_flash.h)
如上所示,开始完成op_flash模块与fw_verify模块。上一章节使用J-Flash将App_crc.bin下载到咱项目定义的”App下载缓存区“,起始地址0x08040000、大小0x30000。然后,通过soft_crc32.c的函数Calculate_Firmware_CRC32_SW()对App_crc.bin进行CRC32校验。详细请回头看上一章节《CRC32校验成功,证明"App下载缓冲区"的固件完整性没有问题。
2025-06-07 19:09:07
957
原创 Python | Windows11通过离线方式安装pyserial
因公司网络访问的限制,没办法使用pip install pyserial去轻松地安装pyserial库。打开网页:https://pypi.org/project/pyserial/#files。
2025-06-06 23:14:11
431
原创 STM32F103_Bootloader程序开发07 - 使用J-Flash将App_crc.bin烧录到App下载缓存区,再校验CRC32,确认固件完整性
本章节做一个实验“校验一遍App缓存区的固件”,看看能不能通过CRC32校验。在OTA升级流程上,当bootloader程序接收完上位机下发的App固件到App下载缓存区后,bootloader程序要对App下载缓存区的固件进行CRC32校验。项目地址:gitee(国内): https://gitee.com/wallace89/MCU_Develop/tree/main/bootloader07_stm32f103_check_crc32。
2025-05-31 10:31:51
527
原创 STM32F103_Bootloader程序开发06 - IAP升级用的App.bin增加CRC32校验码,确保固件完整性,防止“变砖”
crc_add.bat脚本有没有将改动固件的内容呢?让ChatGPT帮我检查一下。
2025-05-30 09:25:18
561
13
原创 STM32F103_Bootloader程序开发05 - Keil修改生成文件的路径与文件名,自动生成bin格式文件
这是 ARM Keil 自带的一个命令行工具,用于将编译生成的目标文件(axf/elf格式)转换为其他格式(比如 bin、hex)。
2025-05-29 21:02:24
565
原创 STM32F103_Bootloader程序开发04 - App跳转模块(app_jump.c与app_jump.h)
本章节的目的是上一章节《[[STM32F103_Bootloader程序开发03 - 启动入口与升级模式判断(boot_entry.c与boot_entry.h)]]》学会使用"C/C++的构造函数(constructor)机制"让我们自己编写的函数在main()之前先运行。本章节将结合上一章节的代码,梳理“无须deinit"的实现过程。如上所示,摘自bootloader开源项目。
2025-05-28 19:07:03
1166
原创 STM32F103_Bootloader程序开发03 - 启动入口与升级模式判断(boot_entry.c与boot_entry.h)
强烈建议大家去学习一下这个优秀的开源项目。我暂时将bootloader程序分别五个模块,先从"启动入口与升级模式判断"模块开始吧。代码分别是boot_entry.c与boot_entry.h。项目刚开始,boot_entry.c与boot_entry.h会随着项目的推进会增加一些代码。项目地址:gitee(国内): https://gitee.com/wallace89/MCU_Develop/tree/main/bootloader03_stm32f103_boot_entry。
2025-05-26 20:47:11
1118
原创 STM32F103_Bootloader程序开发02 - Bootloader程序架构与STM32F103ZET6的Flash内存规划(flash_map.h)
在工业设备和机器人项目中,固件远程升级能力已成为提升设备维护性与生命周期的关键手段。本文将围绕STM32平台,系统性介绍一个简洁、可靠的Bootloader程序设计思路。每个模块各司其职,既保证了流程的清晰、易维护,又为后续功能拓展(如安全保护、异常处理)预留了接口。通过模块化设计,能够高效实现与上位机的安全固件升级,显著提升系统的可靠性和可维护性。
2025-05-25 19:04:47
1032
原创 STM32F103 HAL多实例通用USART驱动 - 高效DMA+RingBuffer方案,量产级工程模板
前阵子完成的LL库与寄存器版本的代码,有一个明显的缺点是不支持多实例化。最近,计划基于HAL库系统地梳理一遍bootloader程序开发。在bootloader程序开发项目里,需要用到HAL库的串口驱动代码。所以,继续把代码优化优化,将多实例化模块做出来。bsp_usart_hal 驱动代码特点总结:支持多实例通用管理DMA收发全流程、双缓冲高效传输RingBuffer无缝缓存机制健壮的错误统计与自恢复机制工程化量产导向测试效果如下,接收与发送都没有丢包。
2025-05-24 19:38:03
764
原创 STM32F103_Bootloader程序开发01 - 什么是IAP?跟OTA有什么关系?
IAP,中文一般称为“应用程序内编程”或“在应用中自编程”。本质含义:MCU 在运行用户代码(App或Bootloader)时,通过自身的代码(而不是用外部编程器/仿真器)来擦写和更新片上 Flash 内容。典型的应用场景:在系统上线后,通过串口、CAN、USB、以太网等接口下载新固件,并写入指定Flash区,完成固件升级。实际场景:工程师用串口工具将固件下载到MCU,MCU通过IAP代码将固件烧写到App区。OTA,直译就是“空中下载”或者“远程升级”。
2025-05-23 18:02:34
991
原创 STM32F103_LL库+寄存器学习笔记12.2 - 串口DMA高效收发实战2:进一步提高串口接收的效率
通过优化代码算法,在串口空闲中断回调里不需要暂时关闭DMA接收,达到提高串口接收的效率。在IDLE接收中断里关闭DMA接收会导致接收过程中有数据丢失风险(关DMA的瞬间如果有数据到来,会丢帧!
2025-05-20 18:51:53
734
原创 STM32F103_LL库+寄存器学习笔记24 - TIM产生中心PWM波,中心对齐模式1 + PWM模式2(FOC算法专用)
之前的笔记使用HAL库实现三相中心对齐且互补的PWM波形,本章节将采用LL库与寄存器方式实现。详细的解释请看之前的HAL库笔记。
2025-05-18 10:27:07
1223
原创 STM32F103_LL库+寄存器学习笔记23 - PWM波形输出及软件方式调整周期与占空比
脉宽调制(PWM)是 STM32 定时器最常用的输出模式之一,广泛应用于电机驱动、LED 调光、伺服控制和功率管理等场景。本篇文章将以 TIM5 为例,从寄存器层面深入剖析 PWM 输出的原理与实现步骤。通过本篇博客,你不仅能掌握 CubeMX 及 LL 库的调用,更能从底层寄存器视角构建完整的 PWM 输出思维,为后续复杂控制奠定坚实基础。本章节使用TIM5生成周期为1ms的PWM波形,占空比50%。并介绍如何通过软件方式改变PWM波形的周期与占空比。
2025-05-14 18:27:21
790
原创 STM32F103_LL库+寄存器学习笔记22 - 基础定时器TIM实现1ms周期回调
如上所示,STM32F103有两个基本定时器TIM6与TIM7,所谓「基本定时器」,即功能最简单的定时器。
2025-05-13 19:03:44
765
原创 STM32F103_LL库+寄存器学习笔记12.1 - 串口DMA高效收发实战:引入ringbuffer结构(开源库lwrb)
在STM32串口通信中,传统中断方式处理效率低、耦合度高,难以应对高频收发场景。为此,本章引入ringbuffer结构,配合USART1的DMA机制,实现接收数据的自动搬运与发送数据的非阻塞输出。ringbuffer作为中间缓冲区,有效解耦了硬件DMA与用户代码逻辑,不仅提升了数据处理效率,也增强了系统稳定性和可扩展性。效果如下:如上所示,从SSCOM串口助手与单片机的全局变量看来,单片机没有丢包。单片机一共发送356607bytes,接收344960bytes。
2025-05-12 18:50:53
469
原创 STM32F103_HAL库+寄存器学习笔记21 - CAN接收过滤器:CPU减负神器,提升系统效率的第一道防线
在STM32F103的CAN总线应用中,硬件过滤器(Filter)承担着关键角色。本章将从寄存器层面深入剖析CAN接收过滤器的工作机制与配置方法,帮助理解如何高效筛选关键信息,减轻CPU负担。通过合理使用过滤器,不仅能提升系统整体运行效率,还能显著降低接收溢出风险。文章将结合HAL库操作与直接寄存器配置,全面构建底层视角下的CAN接收优化思路。
2025-04-27 21:39:18
873
原创 STM32F103_HAL库+寄存器学习笔记20 - CAN发送中断+ringbuffer + CAN空闲接收中断+接收所有CAN报文+ringbuffer
如上所示,在[[STM32F103_HAL库+寄存器学习笔记19 - CAN发送中断+CAN接收中断+接收所有CAN报文+ringbuffer数据结构]]的基础上,为CAN发送也安排上强大的ringbuffer(环形缓冲区)。CAN发送有三个发送邮箱,为什么还另外需要ringbuffer?
2025-04-24 19:09:04
1077
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人