自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

wallace89的博客

分享学习,分享经验,一起成长

  • 博客(201)
  • 收藏
  • 关注

原创 SimpleFOC学习笔记汇总(2025.02.09更新)

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

2025-01-14 23:56:44 2521 5

原创 嵌入式CANopen协议从入门到落地产品(更新2023.10.18)

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

2021-07-28 21:16:36 16418 16

原创 STM32+CubeMX开发笔记汇总(更新2025.06.07)

只会用HAL库,不会完全不理会寄存器,只能算是入门。别扯寄存器开发周期长什么的,移植会很困难。在高手面前,这些都是问题。在高手看来,怎样提高效率与减少空间才值得品味。

2021-07-13 21:47:53 4590 3

原创 嵌入式实时操作系统RTX5快速入门 (完结)

一、前言在实际工作上使用过ucosIII与FreeRTOS,对它们俩的API都较为熟悉,那么当有新的项目时,直接二选一就好了。为什么非得去折腾另一款新的RTOS(RTX5)?原因是使用RTOS会影响系统的执行效率(ISR切换线程,线程切换线程都需要时间)。但是,RTX5在这方面做得不错,这是我非得去折腾一个新的RTOS的原因。RTX5的简单介绍可以查看安富莱的总结:第3章 RTX5操作系统介绍非得折腾去RTX5的理由:实时性强。以低的中断延迟执行高速实时操作(对于M3/M4/M7内核可以实现零中断延

2021-06-09 23:01:16 27846 22

原创 VScode - 我的常用插件01 - 主题插件Noctis

是一款为 Visual Studio Code 提供的,主打。它有多种配色风格,适合不同的开发者审美和工作场景。

2025-06-10 14:02:00 216

原创 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 901

原创 Python | Windows11通过离线方式安装pyserial

因公司网络访问的限制,没办法使用pip install pyserial去轻松地安装pyserial库。打开网页:https://pypi.org/project/pyserial/#files。

2025-06-06 23:14:11 342

原创 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 438

原创 STM32F103_Bootloader程序开发06 - IAP升级用的App.bin增加CRC32校验码,确保固件完整性,防止“变砖”

crc_add.bat脚本有没有将改动固件的内容呢?让ChatGPT帮我检查一下。

2025-05-30 09:25:18 421

原创 STM32F103_Bootloader程序开发05 - Keil修改生成文件的路径与文件名,自动生成bin格式文件

这是 ARM Keil 自带的一个命令行工具,用于将编译生成的目标文件(axf/elf格式)转换为其他格式(比如 bin、hex)。

2025-05-29 21:02:24 443

原创 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 1059

原创 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 1050

原创 STM32F103_Bootloader程序开发02 - Bootloader程序架构与STM32F103ZET6的Flash内存规划(flash_map.h)

在工业设备和机器人项目中,固件远程升级能力已成为提升设备维护性与生命周期的关键手段。本文将围绕STM32平台,系统性介绍一个简洁、可靠的Bootloader程序设计思路。每个模块各司其职,既保证了流程的清晰、易维护,又为后续功能拓展(如安全保护、异常处理)预留了接口。通过模块化设计,能够高效实现与上位机的安全固件升级,显著提升系统的可靠性和可维护性。

2025-05-25 19:04:47 929

原创 STM32F103 HAL多实例通用USART驱动 - 高效DMA+RingBuffer方案,量产级工程模板

前阵子完成的LL库与寄存器版本的代码,有一个明显的缺点是不支持多实例化。最近,计划基于HAL库系统地梳理一遍bootloader程序开发。在bootloader程序开发项目里,需要用到HAL库的串口驱动代码。所以,继续把代码优化优化,将多实例化模块做出来。bsp_usart_hal 驱动代码特点总结:支持多实例通用管理DMA收发全流程、双缓冲高效传输RingBuffer无缝缓存机制健壮的错误统计与自恢复机制工程化量产导向测试效果如下,接收与发送都没有丢包。

2025-05-24 19:38:03 656

原创 STM32F103_Bootloader程序开发01 - 什么是IAP?跟OTA有什么关系?

IAP,中文一般称为“应用程序内编程”或“在应用中自编程”。本质含义:MCU 在运行用户代码(App或Bootloader)时,通过自身的代码(而不是用外部编程器/仿真器)来擦写和更新片上 Flash 内容。典型的应用场景:在系统上线后,通过串口、CAN、USB、以太网等接口下载新固件,并写入指定Flash区,完成固件升级。实际场景:工程师用串口工具将固件下载到MCU,MCU通过IAP代码将固件烧写到App区。OTA,直译就是“空中下载”或者“远程升级”。

2025-05-23 18:02:34 914

原创 STM32F103_LL库+寄存器学习笔记12.2 - 串口DMA高效收发实战2:进一步提高串口接收的效率

通过优化代码算法,在串口空闲中断回调里不需要暂时关闭DMA接收,达到提高串口接收的效率。在IDLE接收中断里关闭DMA接收会导致接收过程中有数据丢失风险(关DMA的瞬间如果有数据到来,会丢帧!

2025-05-20 18:51:53 667

原创 STM32F103_LL库+寄存器学习笔记24 - TIM产生中心PWM波,中心对齐模式1 + PWM模式2(FOC算法专用)

之前的笔记使用HAL库实现三相中心对齐且互补的PWM波形,本章节将采用LL库与寄存器方式实现。详细的解释请看之前的HAL库笔记。

2025-05-18 10:27:07 1049

原创 STM32F103_LL库+寄存器学习笔记23 - PWM波形输出及软件方式调整周期与占空比

脉宽调制(PWM)是 STM32 定时器最常用的输出模式之一,广泛应用于电机驱动、LED 调光、伺服控制和功率管理等场景。本篇文章将以 TIM5 为例,从寄存器层面深入剖析 PWM 输出的原理与实现步骤。通过本篇博客,你不仅能掌握 CubeMX 及 LL 库的调用,更能从底层寄存器视角构建完整的 PWM 输出思维,为后续复杂控制奠定坚实基础。本章节使用TIM5生成周期为1ms的PWM波形,占空比50%。并介绍如何通过软件方式改变PWM波形的周期与占空比。

2025-05-14 18:27:21 700

原创 STM32F103_LL库+寄存器学习笔记22 - 基础定时器TIM实现1ms周期回调

如上所示,STM32F103有两个基本定时器TIM6与TIM7,所谓「基本定时器」,即功能最简单的定时器。

2025-05-13 19:03:44 707

原创 STM32F103_LL库+寄存器学习笔记12.1 - 串口DMA高效收发实战:引入ringbuffer结构(开源库lwrb)

在STM32串口通信中,传统中断方式处理效率低、耦合度高,难以应对高频收发场景。为此,本章引入ringbuffer结构,配合USART1的DMA机制,实现接收数据的自动搬运与发送数据的非阻塞输出。ringbuffer作为中间缓冲区,有效解耦了硬件DMA与用户代码逻辑,不仅提升了数据处理效率,也增强了系统稳定性和可扩展性。效果如下:如上所示,从SSCOM串口助手与单片机的全局变量看来,单片机没有丢包。单片机一共发送356607bytes,接收344960bytes。

2025-05-12 18:50:53 385

原创 STM32F103_HAL库+寄存器学习笔记21 - CAN接收过滤器:CPU减负神器,提升系统效率的第一道防线

在STM32F103的CAN总线应用中,硬件过滤器(Filter)承担着关键角色。本章将从寄存器层面深入剖析CAN接收过滤器的工作机制与配置方法,帮助理解如何高效筛选关键信息,减轻CPU负担。通过合理使用过滤器,不仅能提升系统整体运行效率,还能显著降低接收溢出风险。文章将结合HAL库操作与直接寄存器配置,全面构建底层视角下的CAN接收优化思路。

2025-04-27 21:39:18 766

原创 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 964

原创 STM32F103_HAL库+寄存器学习笔记19 - CAN发送中断+CAN接收中断+接收所有CAN报文+ringbuffer数据结构

官方:https://docs.majerle.eu/projects/lwrb/en/latest/index.html如上所示,LwRB的功能很齐全。一般,新手应该先从怎样放入消息与怎样取出消息先开始。

2025-04-21 22:17:53 1049

原创 STM32F103_HAL库+寄存器学习笔记18 - CAN接收溢出中断

如上所示,根据《STM32F1中文参考手册》的章节22.8,通过寄存器CAN_IER可以打开FIFO1溢出中断。然后,在全局中断里查看寄存器CAN_RF1R的FOVR1是否被置1。如上所示,寄存器CAN_RF1R的FOVR1的说明。

2025-04-18 09:11:08 745

原创 STM32F103_HAL库+寄存器学习笔记17 - CAN中断接收 + 接收CAN总线所有报文

如上所示,本实验的目的是使能CAN接收FIFO1的挂号中断,使用CAN过滤器0与CAN接收FIFO1的组合,接收CAN总线上所有的CAN报文。如上所示,STM32F103有两个3级深度的接收FIFO。外设CAN想要正常接收CAN报文,必须配置接收FIFO与接收滤波器。两者缺一不可,否则导致无法接收CAN报文。如上所示,当接收FIFO的3级深度(缓存)都被占满时,将会导致溢出。此时,必须让MCU快读取接收FIFO的邮箱,避免出现溢出。

2025-04-17 20:17:24 805

原创 STM32F103_HAL库+寄存器学习笔记16 - 监控CAN发送失败(轮询方式)

从上一章节看到,当CAN消息发送失败时,CAN错误状态寄存器ESR的TEC会持续累加,LEC等于0x03(ACK错误)。本次实验的目的是编写一个函数CAN_Check_Error(),在main()的主循环里每隔50ms执行一次,将寄存器CAN_ESR的各个段赋值给全局变量gCanESR,方便应用程序获取寄存器CAN_ESR的各个段的内容。

2025-04-16 21:45:00 887

原创 STM32F103_HAL库+寄存器学习笔记15 - 梳理CAN发送失败时,涉及哪些寄存器

上一章节完成CAN发送完成中断,在梳理二级发送缓存之前,先梳理怎样监控CAN发送失败。

2025-04-15 21:25:50 453

原创 STM32F103_HAL库+寄存器学习笔记14 - CAN发送完成中断

通过采用 CAN 发送完成中断,你可以让 CPU 从忙等待中解放出来,专注于其他任务,从而实现更高的效率和更好的系统响应。中断能让系统在处理多个任务时保持较好的调度和响应,适合复杂实时系统的设计。STM32CubeMX的CAN代码不支持LL库,所以只能用HAL库,或者自己撸寄存器(最高效、最底层的方式)。程序效果:如上所示,CAN分析仪持续收到间隔100ms的CAN消息。

2025-04-02 10:04:01 1113

原创 STM32F103_HAL库+寄存器学习笔记13 - 梳理外设CAN与如何发送CAN报文(串行发送)

CAN总线因其高速稳定的数据传输与卓越抗干扰性能,在汽车、机器人及工业自动化中被广泛应用。它采用分布式网络结构,实现多节点间实时通信,确保各控制模块精准协同。在汽车领域,CAN总线连接发动机、制动、车身系统,保障车辆安全;在机器人和工业控制中,传感器与执行器间信息传递迅速,使其成为智能制造与自动化控制不可或缺的重要技术。遗憾的是CubeMX不支持生成CAN总线的LL库代码。所以,梳理完HAL库的实现方式后,继续梳理寄存器方式的实现。以下是本章节的效果,开发板每隔100ms往CAN总线发送一个报文。

2025-03-31 20:01:33 1569

原创 STM32F103_LL库+寄存器学习笔记12 - 提高串口通讯程序的健壮性:异常监控 + 超时保护机制

首先,进行USART和DMA状态监测、记录异常状态并主动处理,是另外,STM32串口+DMA通信中引入项目地址:https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library11_usart_dma_error_check。

2025-03-30 18:59:49 873

原创 STM32F103_LL库+寄存器学习笔记11 - 串口收发的中断优先级梳理

接收端的所有中断(USART空闲+DMA接收)优先级均高于发送端(DMA发送)。另外,如果有其他实时性要求更高的外设,需要把串口通讯的中断优先级调低的话,也要保证规则:USART空闲中断 = DMA接收通道中断 > DMA发送通道中断。

2025-03-28 21:41:50 610

原创 STM32F103_LL库+寄存器学习笔记10 - DMA传输过半+DMA传输完成中断实现DMA串口接收“双缓冲“

[[STM32F103_LL库+寄存器学习笔记09 - DMA串口接收与DMA串口发送,串口接收空闲中断]]》上一章节完成DMA发送与接收。此时,有一个致命的问题可能会导致数据包丢失。原因是USART1接收只开启了接收空闲中断(IDLE),DMA在连续模式下,如果数据一直持续发送(或者数据包的大小比接收缓存区要大),将会出现数据被覆盖,被覆盖的数据等于丢失的数据。实现更加健壮的串口接收程序是总的来说就是另外,中断的处理必须保证简单,尽可能保证。

2025-03-28 21:38:10 1425

原创 STM32F103_LL库+寄存器学习笔记09 - DMA串口接收与DMA串口发送,串口接收空闲中断

上一章节《》完成DMA辅助串口发送。接着,梳理DMA辅助串口接收,且启动串口接收空闲中断。效果如下所示:串口助手发送字符串给STM32F103,接着马上收到来自STM32F103发出来的字符串。来一个高强度的测试效果,115200 波特率意味着每秒传输 115200 个比特。如果使用标准格式(1 个起始位、8 个数据位、1 个停止位,共 10 个比特传输一个字节),那么每秒可以传输 115200 / 10 = 11520 个字节。

2025-03-27 23:08:36 823

原创 STM32F103_LL库+寄存器学习笔记08 - DMA串口发送,开启DMA传输完成中断

DMA辅助USART发送与接收能够显著降低CPU负担,尤其在大数据量传输时优势明显。这样可以让CPU腾出更多资源去处理其他任务,同时利用DMA的并行传输能力提高数据传输效率。大概可以这样理解:STM32F1的CPU是一个核,DMA1是第二个核,DMA2是第三个核。掌握DMA的使用后,相当于你的STM32F1芯片从单核变成三核。虽然,DMA只能用于数据的搬运,但是一个计算机系统做的绝大部分的活不就是数据搬运吗?所以,DMA必须学会!必须学会!必须学会!

2025-03-27 22:46:20 1170

原创 STM32F103_LL库+寄存器学习笔记07 - 串口接收缓冲区非空中断

上一章节《[[STM32F103_LL库+寄存器学习笔记06 - 梳理串口与串行发送“Hello,World"]]》梳理完USART的基本设置与发送字符串“Hello,World",接着梳理接收缓冲区非空中断。实用的串口接收程序都会使用中断方式,不会使用轮询方式。最主要的原因当波特率较高时,轮询极其容易错失数据,而中断方式能确保及时获取数据。另外,轮询方式需要不断查询USART_SR的RXNE位(接收数据寄存器非空),即使没有数据到达。这会导致CPU资源浪费,尤其在低速通讯或数据不频繁到达时。

2025-03-27 22:23:28 1073

原创 STM32F103_LL库+寄存器学习笔记06 - 梳理串口与串行发送“Hello,World“

USART是嵌入式非常重要的通讯方式,它的功能强大、灵活性高且用途广泛。只停留在HAL库层面上用USART只能算是入门,要加深对USART的理解,必须从寄存器层面入手。接下来,先从最简单的USART串行发送开始。另外,在接下来的几个章节里,我会逐步地完成一个能在实际产品上使用,可靠的、健壮的串口收发的驱动程序。比如,为了实现高效地收发程序,肯定要用DMA。然后配合DMA的传输过半中断、传输完成中断来实现高效的串口数据发送与接收。比如,时刻监控USART的健康状态,及时发现通讯异常,解决问题。

2025-03-27 21:56:47 835

原创 STM32F103_LL库+寄存器学习笔记05 - GPIO输入模式,捕获上升沿进入中断回调

GPIO设置输入模式后,一般会用轮询的方式去查看GPIO的电平状态。比如,最常用的案例是用于检测按钮的当前状态(是按下还是没按下)。中断的使用一般用于计算脉冲的频率与计算脉冲的数量。项目地址:https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library05_gpio_input_interrupt。

2025-03-26 22:13:32 605

原创 STM32F103_LL库+寄存器学习笔记04 - GPIO设置输出模式

GPIOx_LCKR(Lock Configuration Register,端口配置锁定寄存器)的主要功能是锁定GPIO引脚的配置,防止意外修改。简单来说,它就像给GPIO配置(比如输入/输出模式、上下拉状态等)加了一把“锁”,一旦锁定,除非复位芯片,否则无法再更改这些配置。锁定指的是对寄存器GPIOx_CRL与GPIOx_CRH的锁定,其他寄存器ODR、IDR、BSRR、BRR都能正常使用。换句话说,锁定只冻结了“引脚的功能设置”,而引脚的实际操作(输入读取或输出控制)依然正常工作。

2025-03-26 22:00:49 764

原创 STM32F103_LL库+寄存器学习笔记03 - GPIO设置输入模式,并轮询GPIO的电平状态

中断上一章节完成SysTick中断。接着,开始梳理大家肯定逃不过的外设GPIO。首先,先梳理一下LL库怎样去设置GPIO的模式,读取GPIO的电平的状态。项目地址:https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library03_gpio_input。

2025-03-26 21:49:49 1242

原创 STM32F103_LL库+寄存器学习笔记02 - 开启SysTick(滴答定时器)中断

上一章节对CubeMX生成的最小系统框架进行梳理,在此工程的基础上,梳理SysTick(滴答定时器)中断是怎样开启的?为什么SysTick中断会自动调用函数?效果如下:在代码stm32f1xx_it.c里的函数在持续被调用,将全局变量gTickCount持续累加。项目地址:https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library02_SysTick_Interrupt。

2025-03-25 23:26:04 1175 2

空空如也

空空如也

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

TA关注的人

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