- 博客(24)
- 收藏
- 关注
原创 STM32 Hal库的Uart串口接受
每次编写相关uart相关模块的时候,总是因为未开启这个函数导致无法开启中断,中断接受数据。于是我去深入了解了一下它的设计工作逻辑。
2025-11-30 14:54:09
412
原创 OpenBLT移植教程
要实现Bootloader远程升级的功能,需要明白该功能的实现分为三个部分:1.上位机:用于将要烧写的程序传输给mcu;2.mcu的bootloader分区:用于接收上位机发送的程序数据;3.mcu的application分区:判断接收到的数据是否为程序升级相关,并跳转到bootloader;OpenBLT作为一款开源的MCU Bootloader,其开源的代码和工具也包含这三个内容。将其理解就能够正确使用了。
2025-10-11 10:50:16
716
原创 Aspice的SWE工程组内容
将软件单元逐步集成为完整的软件,并验证集成过程。设计软件的总体结构,确保能够满足软件需求。单元测试报告、代码审查记录、静态分析报告。将系统需求转化为详细、可验证的软件需求。集成测试计划、集成测试报告、集成记录。详细设计文档、源代码、单元测试规范。合格性测试计划、测试用例、测试报告。验证需求的完整性、一致性、可测试性。验证软件单元是否满足详细设计要求。软件需求规格说明、需求追溯矩阵。软件架构设计文档、接口设计文档。验证集成的软件是否满足软件需求。分析系统需求,识别软件相关部分。将软件需求分配到软件组件。
2025-10-02 09:56:13
251
原创 CMSIS设计的理解
CMSIS是ARM制定的Cortex-M微控制器软件接口标准,旨在为芯片厂商和开发者提供统一的软件框架。其核心组件包括:CMSIS-Core(处理器基础访问)、CMSIS-DSP(优化信号处理库)、CMSIS-RTOS(实时操作系统通用API)、CMSIS-Driver(外设驱动标准)等。该标准解决了不同厂商芯片间的软件兼容性问题,使代码更易移植。例如,ST的HAL库就是在CMSIS基础上构建的高级应用层。通过标准化外设寄存器定义、中断编号等底层接口,CMSIS为嵌入式开发提供了硬件抽象基础,显著提升了开发
2025-09-30 22:40:49
665
原创 CAN的同步机制
我们在学习CAN总线的时候,了解到CAN总线是没有时钟线的。需要总线上的设备保持一致的波特率来约束和正确识别总线上接收到的数据。那每个设备或因为外部干扰或因为时钟有误差,时钟或多或少都会出现误差,那在误差出现的条件下,CAN总线协议需要机制来使得每个设备再次保持同步,这就是CAN的硬同步和再同步。
2025-09-29 19:57:01
591
原创 CAN协议入门
规定在空闲状态下的电平为1,并命名为隐性电平。这里隐形的含义在于它是弱电平,是优先级低的空闲电平,同时也是在can总线没有信号差分的状态。左边的高速can因为硬件连接为闭环,在所有控制器不对总线进行操作的状态下,会自动收缩为一致的电平状态,即canh=canl。而右边的低速can的总线是非闭环的,在空闲状态下需要各个收发器同时进行有源偏执来管理总线的空闲电平。在空闲时将CAN_H偏置到高电压(如~1.75V),CAN_L偏置到低电压(如~3.25V),从而产生一个稳定的差分隐性电平(-1.5V)。
2025-09-24 22:14:20
484
原创 openBLT bootloader 学习记录
3.target dependent:底层与mcu底层库链接的地方,这个部分中间业务层target independent与mcu的底层库抽象开来。2.target independent:是中间层,主要实现openblt业务逻辑的地方,但是不依赖mcu的底层库,依赖的为target dependent 部分。1.application specific:我的理解为app部分 该部分主要用于修改openblt的配置部分,来适配自己需要的OTA升级。需要移植的部分即是章节1提到的4个部分。
2025-08-26 12:46:34
257
原创 数据源码获取与数据类型转换
我在做eeprom模块时,需要将各个数据类型的变量存储进一个结构体来进行临时存储,后等模块任务空闲时再存储进eeprom。这时就需要将各个数据类型的变量转化进同一个类型中(通常使用uint32)。所谓“取源码的操作”,就是直接读取变量在内存中的原始二进制内容(即地址处的4字节),而不是通过赋值或类型转换改变数值。总结:操作的是变量的内存内容(源码),不是变量的数值本身。如果 -300 强制转换为 int8_t(有符号8位整型),结果是 44。所以,(int8_t)(-300) = -44。
2025-08-20 14:39:54
273
原创 编码器学习记录
上一节提到了增量式编码器倍频技术可以扩展M法的测量范围,那么现在我们就来讲解下这个M法究竟是怎样测速的,以及简单介绍一些常用的编码器测速方法。对于电机转速的测量,可以把增量式编码器安装到电机上,用控制器对编码器脉冲进行计数,然后通过特定的方法求出电机转速,常用的编码器测速方法一般有三种:M法、T法和M/T法。M法:又叫做频率测量法。这种方法是在一个固定的定时时间内(以秒为单位),统计这段时间的编码器脉冲数,计算速度值。
2025-08-12 13:40:36
937
原创 MPU6050 问题记录
我使用了HAL_Delay作为软件i2c的延时,之前的读写操作均正常,在进行到mpu_write_mem和mpu_read_mem时发现程序会卡在该部分无法继续。更改软件i2c的delay函数后可以正常工作。当我进入调试时,发现在同样在mpu_set_bypass 函数中具体执行i2c底层的函数会返回错误1的情况,即是进入 if(ret && retry_in_mlsec)。最后调查发现,我这里使用了STM30F0外部引脚中断而且没有使能6050的中断模式,导致单片机会进入中断,影响了软件IIC时序。
2025-08-11 01:26:19
314
原创 延时函数实现记录
STM32 通常运行在 72 MHz 的系统时钟频率下(假设使用的是常见的 STM32F1 系列)。1 微秒 (us) = 1,000,000 分之一秒,因此在 72 MHz 的时钟频率下,1 微秒内可以执行约 72 个时钟周期。,而是对其进行了除以 5 的操作。这个除以 5 的操作是为了补偿循环中其他指令(例如,)来实现延时,需要根据时钟频率计算出每个NOP指令的执行时间。的减法操作和循环判断等)所消耗的额外时钟周期。在 STM32 使用的这段延时代码中,个时钟周期,才能达到期望的延时时间。
2025-08-10 18:41:37
394
原创 FreeRTOS任务调度原理
机制,允许高优先级任务抢占低优先级任务的执行权。:若时间片耗尽或高优先级任务就绪,挂起 PendSV 中断。:允许高优先级中断优先执行,避免上下文切换阻塞关键操作。:仅在启动阶段使用,优先级通常与 PendSV 一致。:PendSV 优先级设为最低,确保其他中断可抢占。:一般优先级高于 PendSV,确保时间管理及时。:保存当前任务上下文,加载下一任务上下文。若需切换任务,挂起 PendSV 中断。,直接挂起 PendSV 中断触发切换。:设为最低优先级,允许其他中断抢占。
2025-04-29 11:20:19
1484
原创 mcu和FreeRTOS的出栈压栈
(一个错误处理函数)。如果任务函数意外退出(如未设计为无限循环),处理器会跳转到此函数(通常是一个死循环),防止系统崩溃。,模拟硬件中断压栈后的状态,使得任务首次调度时,处理器能像从中断返回一样启动任务。:ARM Cortex-M 架构中,栈通常从高地址向低地址生长(满递减栈)。- SP -= 32(假设每个寄存器占 4 字节,共 8 个寄存器)。:出栈后栈指针(SP)向高地址移动(ARM Cortex-M 为满递减栈)。3. SP += 32(假设每个寄存器占 4 字节,共 8 个寄存器)。
2025-04-25 17:30:59
861
原创 FreeRTOS系统移植
因此,c文件和h文件直接移植就好,剩下的就是移植portable的文件了。portable中的文件是需要根据。1. 文件中的c文件: 文件中的c文件都是FreeRTOS的核心c文件实现。2. include 文件夹:FreeRTOS系统需要包含的h文件。接下去就是需要修改代码让项目代码和FreeRTOS系统代码对接起来。3. portable 文件夹:是用于不同mcu架构下的移植文件。至此,所有需要的copy到项目的系统文件就已经完成了。Source中的文件即使FreeRTOS的源码。
2025-04-16 19:35:50
355
原创 Bootloader跳转代码解析
(Vector Table)是程序启动的核心数据结构。在 ARM Cortex-M 系列处理器中,这是一段从Boot跳转到App的代码。
2025-02-17 11:26:27
573
原创 mcu的存储空间分布
而 'ram' 则是用于存储运行code的中间变量,**掉电丢失**。'rom' 'ram' 打引号是因为,目前因为更新换代,它们已经不是严格意义上的rom和ram了。而是用于表示其掉电不丢失,和掉电丢失的特性。:这些变量的初始值存储在 ROM 中,但运行时会被拷贝到 RAM 的对应区域。(如多数 MCU):代码(ROM)和数据(RAM)使用独立总线,可并行访问。:初始化后的该变量区域,通常会被起始文件清零,以保证变量的默认值为0。:通常位于 ROM 的起始位置,存储中断服务程序(ISR)的入口地址。
2025-02-11 11:17:47
1527
原创 MCU的存储大小,数据总线宽度
在编程时,需要根据 MCU 的数据总线宽度正确访问存储器,避免对齐问题。决定了 MCU 一次可以传输的数据量,但不会改变每个地址的存储大小。决定了 MCU 一次可以传输的数据量,但不会改变每个地址的存储大小。每次访问多个地址(如 2 个或 4 个),读取或写入多个字节数据。每次访问 1 个地址,读取或写入 1 字节数据。每次访问 1 个地址,读取或写入 1 字节数据。每次访问 2 个地址,读取或写入 2 字节数据。每次访问 4 个地址,读取或写入 4 字节数据。,这是现代计算机和 MCU 的通用设计。
2025-01-21 16:08:22
583
原创 boot到app的跳转
一些芯片具有中断向量表重映射的功能。在硬件的重映射下,app和boot的中断向量表是并存的,两个表互不干扰。同一个中断,在boot时执行boot的中断,在app执行app的中断。如果中断中的一个函数在app和boot均有定义,那么执行的中断向量表是谁的,那么中断中执行的函数就是谁的。例如在2.2中的软件跳转,起初运行的是boot的中断向量表,其中的函数则是对应的boot层的,一旦跳转到app,则运行的是app的函数。有一些芯片例如arm0系列的,是不具有硬件重映射的功能的,只能进行软件跳转。
2025-01-13 16:16:46
860
2
原创 蓝牙学习日记
运行蓝牙协议栈(如BLE协议栈)。常见射频硬件: Nordic nRF52系列(集成射频和MCU)。实现蓝牙物理层(PHY)和链路层(Link Layer)的功能。小结:硬件上分为mcu与射频硬件,mcu通过蓝牙协议去驱动射频硬件,即完成了蓝牙功能。MCU是蓝牙设备的核心,负责运行蓝牙协议栈、处理数据、控制外设以及执行应用程序逻辑。逻辑链路控制与适配协议(L2CAP):数据包的分段和重组。主机控制接口(HCI):MCU与射频硬件之间的通信接口。射频硬件负责发送和接收蓝牙信号(2.4GHz频段)。
2025-01-06 13:57:59
328
原创 JFlash添加新芯片
在结尾的之前添加新芯片的数据,注意设备信息的参数都是以头表示芯片数据开始,以及为结尾表示芯片数据结束。注意不要把新芯片数据插入到其他的芯片数据之中。打开Jlink文件中的JlinkDevices.xml 记录文件。完成以上步骤就能够使用Jlink烧录新芯片的程序文件了。在Device文件夹中添加芯片厂商提供的芯片数据包。打开Device文件夹可发现,都是各个芯片的数据包。
2025-01-03 09:59:42
2145
4
原创 const关键字
每次使用Const关键字去限制指针变量的时候,总是会忘记const处于不同位置下的作用。因此记录记录整理一下const关键字的用法。
2024-08-27 11:32:48
357
原创 位置式PID学习
将PID公式离散化,e(t) == 目标值-实际值(target_value - measured_value)偏差值, ∫e(t) dt == 误差累加(integral += bias)偏差累计,de(t)/dt == 当前误差值 - 上一次的误差值 (bias - pre_bias)偏差变化趋势。PID控制器参数整定是至关重要的,因为它直接影响到控制系统的性能。是系统的偏差、误差数值与时间的曲线公式(设定值与实际值之差),三个参数,以达到理想的控制效果。是比例、积分和微分系数。
2024-08-26 19:30:35
597
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅