- 博客(53)
- 收藏
- 关注
原创 特权&非特权 MSP&PSP
Arm Cortex-M内具有两种运行模式:Thread Mode和Handler Mode。Thread模式:除了中断和系统异常之外的普通代码运行时,内核所处于的模式;Handler模式:中断或者异常发生时,内核所处于的模式。
2026-11-09 10:54:35
163
原创 VTOR的对齐
通过Armv8-M Architecture Reference Manual.pdf可以发现,确实VTOR的最小对齐为0x80,所以这里有两种可能:一,供应商固化在flash里面的库函数Interrupt_Initialisation有bug把后8位mask掉了;二,芯片设计时,硬件上就把后8位mask掉了。最近有一个问题会导致MCU不停的reset,经过调试发现是由于中断向量表被意外篡改了,那是什么原因导致中断向量表被意外篡改的呢?主要原因是VTOR的对齐问题,接下来详细介绍一下这个问题。
2026-10-28 17:17:33
200
原创 轮询式状态机和事件驱动式状态机的优劣势对比
当硬件中断(如 UART DMA 接收完成、Timer 溢出、按键触发)发生时,中断回调函数(ISR)将事件压入事件队列(Event Queue)并唤醒 CPU。:需要管理“中断上下文(ISR)”与“主线程上下文”之间的数据传递,必须严格做原子保护/关中断保护,防止队列死锁或数据破坏。需要维护一个环形事件队列(Event Queue),且需要考虑队列溢出(Queue Overflow)时的异常处理策略。事件由中断在微秒级内直接推送,无需等待下一个轮询周期,对紧急事件(如过流保护、关键握手包)响应极快。
2026-10-22 18:30:00
541
原创 窥探MCU的总线系统
以STM32L431的总线矩阵为例:从上图可以看出,总共有5条主控总线,和7条被控总线。深入理解总线概念,我们用SRAM1作为示例从两方面来认识“总线”。
2026-09-30 18:00:00
389
原创 STM32L4系列防火墙
call gate其实就是被保护区域的首地址,这个首地址就像一个门,只有从这个门才能进入才能执行防火墙内部的代码(必须从首地址上的指令开始执行)。“任何对受保护区域的访问必须经过call gate”的意思就是对受保护区域的访问必须从这个区域的第一条指令开始。其他任何没有经过call gate而直接访问受保护区域的行为是不能成功的。什么是call gate?
2026-09-24 18:00:00
371
原创 常见通信协议的硬件通信原理——电路结构
并且正是因为显性为逻辑0,隐性为逻辑1,成了can总线仲裁时ID越小优先级越高的关键,当两个不同的ID往总线上同时发送消息,一定会在依次传输ID位时,大的ID为逻辑1(总线隐性),小的ID为逻辑0(总线显性)这是时候小ID仲裁获胜。首先需要明确一点,我们这里讲的是CAN驱动电路,所以指的是收发器中的部分电路,这和can controller是两码事,can controller是mcu内部的外设。),A引脚的推挽输出电路下管导通,上管截止,B引脚相反,下管截止,上管导通。)时,此时Vab应该为。
2026-09-14 13:54:26
111
原创 MOS管的工作原理
先来介绍一下P型衬底,P型衬底是在硅晶体中混入了磷元素,导致+5价的磷和+4价硅在形成8原子稳定状态(八电子稳定结构的驱动:半导体晶体最喜欢的稳定状态,是每个原子周围都有 8 个共享电子(即 4 对共价键)。)时,多出了一个不稳定的电子,这个电子在栅极和ss之间电容的电场力作用下,会移动到靠近正极的区域(栅极),这就使得两个隔离的N型区域之间形成了可以自由移动电子通路,从而就使得两个隔离的N型区域导通了。栅极电压高于源极电压一个阈值(Vgs > Vth)
2026-09-14 10:22:16
138
原创 基于 DMA 和环形队列的RS485通信协议栈
当前产品需要基于RS485的通信协议栈,所以设计了一个基于DMA和环形队列的通信协议栈,有效解决了,提升了,并且。
2026-09-09 11:24:24
167
原创 Secure Boot Part 3 —— 信任根和信任链
这一篇文章主要详述整个安全启动的信任根和信任链。信任根,顾名思义系统的信任根本,这是信任的锚定物,当A被信任根验证通过,A再去对B进行验证,这个过程形成的链路被称为信任链。类似于,你去银行贷款,银行要查看你的工作或者工资流水等等,这里的信任根是你的工作或者工资流水,并不是你本人,当你拿到贷款买房后,这个时候房产证成为新的信用凭证,可以继续抵押办理贷款去买车,由此产生了信用链。
2026-09-08 17:19:10
153
原创 Secure Boot Part 2 —— 安全启动流程
当前boot的设计逻辑是:一级boot对二级boot的进行验签,通过后,启动二级boot;二级boot启动后,首先查看是否有刷新请求,如果有,进入刷写流程,刷写完毕后,在线校验APP的hash值和签名,校验通过启动APP,如果没有,则进入APP的hash验证流程,验证通过后启动APP。
2026-09-07 17:15:14
174
原创 Secure Boot Part 1 —— Flash分区
app区域 0x8020000 - 0x803F7FF, 128kB。一级bootloader区域 0x8000000 - 0x8007FFF, 32kB。二级bootloader区域 0x8008000 - 0x801FFFF,
2026-09-07 11:49:23
180
原创 诊断协议栈配置Agent
我们都知道诊断协议栈分为静态代码部分和配置部分。对于配置部分,我们可以利用大模型进行配置。对于这个想法,开发一个agent来为我们工作是一个非常不错的想法。
2026-09-01 17:08:41
184
原创 任务上下文切换[2]
之前介绍了上下文切换原理,我们在原来切换的基础上,利用PendSV进行上下文切换。简单说一下原因:1. 防止usage fault——在其他中断发生时,如果systick触发进行上下文切换,导致系统直接进入线程模式会发生usage fault;这里有多资料可以查,就不多说了。PendSV主要做上下文(R4-R11和EXC_RETURN)保存和恢复,如果判断是首次执行任务,不需要执行上下文保存。这里做两件事:负责current task和next task的切换和触发PendSV。
2026-04-15 14:27:31
68
原创 任务上下文切换[1]
对于支持抢占的OS来说,任务的执行权是OS根据其优先级来决定的,每次任务调度时,会发生从任务A切换到任务B的情形。以systick触发任务切换为例,当前任务A正在执行,systick中断触发,此时栈的变化情况和裸机相同。不同的是,裸机不会有切换任务发生,而是回到原处继续执行,OS会发生任务切换,从任务A切换到任务B执行,而不是回到任务A,所以这里要将任务A的运行上下文保存任务A的栈中,等下次切换回任务A时,可以从任务A的栈中恢复任务现场,从而继续执行任务B。2.恢复下一个任务的运行现场。
2026-03-30 16:22:10
367
原创 寄存器R4-R11由谁保存?
当有操作系统时,我们可以通过代码手动来存储R4-R11,从而保存一个完成的任务快照,那么没有操作系统裸机运行时,如果有中断触发,除了硬件自动保存的中断,R4-R11保存吗?如果不保存,那么中断服务函数如果改动了R4-R11中任意一个寄存器,运行现场不就破坏了吗?TaskA 的这些寄存器是它的“私有财产”,如果现在不把它们封存在 TaskA 的栈里,等一会儿切回 TaskA 时,它的 $R4-R11$ 就变成了一堆无法预测的乱码。所以,在裸机环境下,虽然硬件没帮你在中断入口存 $R4-R11$,但。
2026-03-26 10:39:00
275
原创 RS485通信设计
通过初始化函数将通信模式初始化为DOWNLOAD_REQUEST_FRAME,HANDSHAKE_FRAME和PROGRAM_FRAME。当DMA完成数据接收时,会触发硬件中断,调用该回调函数。该函数根据当前通信所处的帧类型,切换乒乓buffer的存储区,并更新相应的状态。2. 中断回调函数 HAL_UART_RxCpltCallback。1. 模式初始化函数 Uart_XXX_Init。遍历乒乓缓存的两个缓冲区,返回ready的缓冲区。3. 获取乒乓缓存中当前ready的缓冲区。
2026-03-11 11:29:57
221
原创 Flash Handler重要函数解析
如果该函数返回值为PROG_WRITING,系统状态一直保持SYS_ST_DOWNLOADING;如果该函数返回值为PROG_FINISHED,退出当前状态,转变为SYS_ST_VERIFY,进行APP验证;如果该函数返回值为PROG_ERROR,推出当前状态,转变为SYS_ST_BOOT,等待新的刷写请求。2. 刷写请求处理函数 Flash_Program_Request_Handler。1. 刷写包长度接收函数 receive_flash_data_length。
2026-03-11 10:27:27
58
原创 FLASH分区
app区域 0x8020000 - 0x803F7FF, 128kB。bootloader区域 0x8000000 - 0x801FFFF, 128kB。
2026-03-11 09:51:27
42
原创 State Machine
摘要:系统启动后根据内存值判断进入两条主线流程:1)若为刷写请求值,则依次进行握手、接收包信息、下载和校验,最终跳转APP;2)若非刷写请求值,则校验APP后直接跳转。所有流程出现错误都会回到SYS_ST_BOOT状态等待新请求。状态转换包含握手超时、下载错误、校验失败等异常处理,确保系统可靠性。
2026-03-10 14:18:01
332
原创 RS485 总线负载率监测
本系统旨在实时监测 RS485 总线的物理占用情况。通过 STM32L4 硬件外设与软件算法相结合,实现在高波特率(115200bps)下对总线负载率的精准统计,误差控制在 1% 以内。
2026-02-10 14:17:24
564
原创 波特率,比特率和带宽
定义:指单位时间内传输的二进制位(bit)的数量。单位本质:它是你真正关心的“净荷”。比如 100Mbps 的宽带,意味着每秒能传送 10^8个0或1。
2026-02-03 10:31:51
387
原创 滑动窗口算法(Sliding Window)
滑动窗口可以看作是在数据结构(如数组或链表)上移动的一个“取景框”。窗口(Window):由左边界(left)和右边界(right)围成的区间。滑动(Sliding):窗口的边界根据特定条件向右移动。
2026-02-02 15:54:28
341
原创 高效嵌入式通信:基于 DMA 环形缓冲与三级解耦架构设计
/ 槽位式存储:每个槽位存放一个固定长度的消息帧// 写指针:指向下一个待写入的槽位// 读指针:指向下一个待读取的槽位// 计数器:当前仓库中积压的消息帧数量这套方案通过牺牲少量的内存(2 倍的 temp_stream 空间)和内存拷贝开销(memmove),换取了极高的系统健壮性。解耦彻底:底层驱动、协议解析、业务逻辑互不干扰。抗噪性强:滑动窗口机制允许数据流中存在杂质,能自动找回同步。开发友好:业务逻辑只需通过即可获取成品数据。
2026-02-02 15:43:34
655
原创 非对齐访问错误
指令类型指令示例对齐要求是否受 UNALIGN_TRP 影响双字访问LDRDSTRD必须 8 字节对齐否(始终检查)多寄存器访问LDMSTMPUSHPOP必须 4 字节对齐否(始终检查)普通字/半字LDRSTRLDRH4 或 2 字节对齐是(仅在位为 1 时报错)
2026-01-13 09:23:47
298
原创 微处理器世界的电平和人类世界的0/1
大概懂了,也就是说肖特基触发器的一段连接着外围电路,经过这个触发器之后输出的电压,就会要么是3.3v表示1,要么是0v表示0,没有中间态。或者说对于CPU来说,它其实没有0和1的概念,它只知道电路状态,0和1是现实世界的,人们根据调试器输出的电压,将其在电脑屏幕上显示出0和1。: 将电压模拟信号(连续变化的电压)转化成数字信号(离散的 $0$ 和 $1$),主要有两种完全不同的技术路径:一种是**“判别式”: 在物理世界中,数字信号的 $1$ 和 $0$ 并不是凭空存在的逻辑,而是通过。
2026-01-08 10:55:54
163
原创 STM32的USART通信
每当 UART 数据寄存器满时,它绕过 CPU,直接触发一个硬件请求,由 DMA 将寄存器里的 8 位数据搬运到内存。调用这个函数之后会使能接收中断,当有数据过来了,会触发中断,在中断服务函数里面将RDR寄存器里面的值读出来。(Receive Data register Not Empty)标志位,直到收到数据。循环,不断检查状态寄存器(ISR)中的。
2026-01-05 15:24:37
244
原创 异步串行通信及UART硬件工作机制
异步串行通信按照相应的物理协议将物理信号转化成数字信号的通信过程;根据原理,我们需要告诉外设电路波特率字长有无校验位和停止位长度等。
2026-01-05 14:21:31
484
原创 DMA+UART通信
利用DMA可以实现,无需CPU的接入,可以将数据从某一地址搬运到另外一块地址。所以,利用这一特性,我们将uart寄存器的数据直接搬运到指定的内存区域——数据缓冲区。这里选择第一种方式来实现,接收。
2026-01-04 17:19:31
208
原创 关于S32K311调试系统组件——coresight
Debug Access Port, 是微控制器内部的调试访问机制,它定义了如何访问内存、寄存器和其他调试资源。DAP时调试器访问芯片内部资源的唯一门户。J-Link> r0 # 拉低 Reset。J-Link> r1 # 释放 Reset。
2025-12-22 11:15:50
361
原创 S32K311启动过程中,向量表重定向
在MCU的启动过程中,NXP官方提供的启动代码会对中断向量表进行重定向,将向量表从flash定向到ram。具体实现分析如下。
2025-12-17 17:35:59
471
原创 IIC通信基础和调试
1. 两条通信总线,一根时钟线,一根数据线,半双工;2. 主从通信,可以挂多个从机,每个从机都有一个地址(7位,加1位读写标志位);3. 电路:两条通信总线都上拉,挂接在总线上设备的IO口设置成开漏输出,这种设计支持线与逻辑,因此多个设备同时驱动总线时,低电平会主导总线状态,这是多主设备仲裁的硬件基础,电平为低时,总线为忙碌状态。
2025-11-19 17:04:13
140
原创 SecOC - Secure Onboard Communication
Secured I-PDU由Authentic I-PDU和Authenticator (eg: MAC )组成。同时Secured IPDU中可以附加Secured I-PDU Header和FreshnessValue信息。Secured I-PDU Header指示Authentic I-PDU的长度,当没有Secured I-PDU Header时,Authentic I-PDU长度由配置获取。Freshness Value是在生成Authenticator时使用的新鲜度值。
2025-07-17 11:26:56
370
原创 SAE J1939
SAE J1939 该顶层文件地描述了通用网络、OSI分层结构、下级文档的结构,并且为所有预分配值和名称提供了控制。SAE J1939-73 应用层—诊断。SAE J1939-11 物理层,250K比特/秒,屏蔽双绞线。SAE J1939-13 物理层,非车载诊断连接器。用来使外部设备,如诊断工具,可以访问网络。SAE J1939-15 简化物理层,250K位/秒,非屏蔽双绞线(UTP)
2025-07-08 11:26:48
271
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅