欢迎来到大云屋众创空间
这里源于广东工业大学大学城校区的一间小实验室。我们是一群喜欢动手的电子爱好者,在此记录和分享学习心得与项目经验,希望打造一处知识共享的角落,在互联网上留下我们探索技术的足迹。
这不仅仅是一个博客,更是一个开放共享的协作项目。本博客是一个公开的 Hugo 项目,我们欢迎所有感兴趣的朋友直接通过提交 Pull Request 来分享你的内容。我们欢迎你用代码和文字来和我们一同参与博客共建。
这里源于广东工业大学大学城校区的一间小实验室。我们是一群喜欢动手的电子爱好者,在此记录和分享学习心得与项目经验,希望打造一处知识共享的角落,在互联网上留下我们探索技术的足迹。
这不仅仅是一个博客,更是一个开放共享的协作项目。本博客是一个公开的 Hugo 项目,我们欢迎所有感兴趣的朋友直接通过提交 Pull Request 来分享你的内容。我们欢迎你用代码和文字来和我们一同参与博客共建。
如果你在使用 STM32CubeIDE for VSCode 插件,可能会发现它默认的烧录工具只完美支持正版 STLink。市面上几十块钱的仿制 STLink 经常出现连接不稳定、烧录失败、甚至无法识别的“玄学”问题。 为了彻底解决这个问题,我们推荐使用 DAPLink 调试器配合 OpenOCD。这不仅能解决烧录问题,还能让你拥有一套适用于几乎所有 ARM 芯片(不仅限于 STM32)的通用开发环境。本教程将以 STM32CubeIDE for VSCode 生成的项目为基础,教你如何“外挂” OpenOCD 来接管烧录和调试工作。 本教程虽然以 STM32CubeIDE for VSCode 为例,但同样适用于任何基于 OpenOCD 的工具链配置,只需要稍作修改。 Warning 本教程涉及 Scoop 的安装。安装 Scoop 前需要检查自己的用户文件夹是否含有中文,如果有中文会导致安装后无法正常使用,且卸载复杂的后果。可以修改默认用户文件夹或重装系统,建议重装系统。 ...
笔者最近在研究国产单片机。大家对国产单片机的固有印象可能还停留在一比一复刻 STM32,但是随着国产单片机产业的蓬勃发展,各个国产单片机也在自己的产品中做出了自己的特色,其中沁恒家的 RISC-V 系列单片机我最近比较感兴趣(因为沁恒真的敢送)。 说到沁恒,相信大家对他们家 CH340 这款经典的 USB 转串口芯片并不陌生。而在单片机领域,沁恒同样展现出强大的技术实力,尤其在USB功能方面独树一帜:既有经济实用、集成 USB2.0 接口的 V203 系列,也有搭载高速 480MHz USB PHY 的 V307 系列,为嵌入式开发者提供了丰富的选择。 LibXR 是一个功能强大的跨平台 C++ 开发框架,集成了丰富的外设驱动、数据结构、通信中间件、操作系统封装和数学工具库。它为 CH32 系列单片机提供了一个兼容层,不仅对 CH32 标准库进行了高层次的抽象封装,还修复了原库中的一些已知问题,大大提升了开发效率和代码质量。 本文将详细介绍如何在Linux环境下搭建基于 CH32 单片机和 LibXR 库的完整开发环境,帮助开发者快速上手这一优秀的开发组合。 环境准备 1. 获取项目模板 LibXR 官方提供了现成的项目模板,支持 CH32V307 和 CH32V203 两种型号,已预配置好构建脚本和调试配置,无需手动设置。 # 克隆对应芯片的模板项目 git clone https://github.com/xrobot-org/CH32V307_LibXR_Template.git # 或者选择 CH32V203 模板 # git clone https://github.com/xrobot-org/CH32V203_LibXR_Template.git # 初始化 LibXR 子模块 git submodule add https://github.com/Jiu-xiao/libxr 2. 安装调试工具链 CH32 芯片需要专用的调试工具。从MounRiver 官网下载 Linux 版工具链: ...
引言 在一些高速信号板,例如 FPGA、ARM 处理器板,少不了 BGA 封装的走线绘制。这种封装走线又多又杂,在实际应用中经常会用到打过孔换层的走线方法,来在有限的空间中把线走通。但是这种走线会不会对信号产生影响呢?下面我们用 HFSS 和 ADS 仿真软件进行探究。 使用嘉立创阻抗神器计算,可获得的常用的 50Ohm 阻抗四层板叠层结构图,我们先仿照该结构图在 HFSS 中建立类似结构: 测试模型是否建立成功,先建立如图微带线模型,并进行 S 参数仿真测试: 分析 S11 参数,可得微带线归一化阻抗在中心点左右,即在 50ohm 处。 下面来建立类似 BGA 封装条件的传输模型 上图中,类 BGA 的传输模型,在发射与接收端各有两个触点。信号在表层进行传输,通过过孔在地平面进行回流,传输长度约为 3 到 4cm。下面是测得的 S11 参数,可以发现,因为有过孔作用,在高频处 S11 参数并不是稳定的 50Ohm。 将仿真参数导出到 ADS 软件进行时域仿真。仿真使用 500Mhz,1Vpp 的方波信号进行传输,可以看到波形还是很完整的。 下面我们来换一个模型,加入过孔换层操作,进行仿真 可以看到 S11 参数比较杂乱,跟上面比起来差别非常大。 下面仍然使用 ADS 进行时域仿真 可以看到,除了波形抖动幅度略微增大,眼图几乎没有什么变化。这里大胆猜测一下,在短距离传输下,就算是在线路中有过孔这种阻抗不连续的现象,只要及时在附近给电流提供完整的回流路径,对波形几乎没什么影响。 总结 在 3 到 4cm 这种长度的布线中,存在过孔换层对信号质量影响不大。在实际应用中只需及时给换层提供回流路径,且回流过孔尽量靠近换层过孔即可。
前言——开关节点振铃 为什么电源板子总炸?新焊好的电源,刚开始一段时间正常,但是用多一会,MOS 管就星火漫天,炸管不断。导致这个现象的部分原因,是这篇文章将要讲解的内容——开关节点振铃。DCDC 中,存在一个电流节点,开关过程中,这个节点存在大电流的电流换向,导致了电压过冲等现象的发生,容易烧坏器件。想要规避这类现象的发生,我们需要了解它的产生原理,发生场景等,再去想方设法地去解决。本文用 LTspice 仿真软件,详细探究振铃背后的秘密。 1 开关节点振铃是什么 下图是 BUCK(降压)电路的基本拓补,如红圈所示位置是开关节点。 在 DCDC 工作过程中,开关 S1 由 PWM 控制器控制,一开一关。电路有两种工作状态: S1 闭合,电流 I1 流进节点,I2 为 0 S1 开路,电流 I2 流进节点,I1 为 0 观察下面仿真波形图,理想状态下,I1 和 I2 应只有一条支路有电流,此时开关节点电压也为规整的方波。 但是正常来说,实际上我们制作出来的 DCDC,开关节点电压并不会这么规整,下图所示是振铃的仿真图形。 由上图,能看出,在开关电源的上升沿处出现了一个很高电压的尖峰,放大上升沿部分,可以发现上升沿出现了一个逐步衰减的高频震荡。相较于理想方波,这种现象对器件来说非常不友好,如果不加以控制,可能会导致 MOS 管或者二极管击穿烧毁的现象,影响电源的稳定性。 开关节点的振铃现象可以分为上冲和下冲,如上图所示是上冲现象,下冲现象也将在下文详细分析。 2 震荡如何产生 在电路里面,只要是震荡,基本都和 LC 回路有关,实际应用中震荡产生的原因基本都是由于电路布线布局瑕疵而产生的杂散电容电感引起。 如图所示 LC 震荡回路,当在电压源给予 LC 电路高频脉冲时,电路便会引发震荡,震荡的频率取决于 LC 回路的特征频率。 $$f=\frac{1}{2 \pi \sqrt{LC}}$$ DCDC 中,连续快速开关,开关的上升沿和下降沿相当于给整个电路一个高频激励,引发 LC 谐振回路震荡。接下来,要解析震荡产生的原因,只需在 BUCK 电路中找出存在 LC 杂散的回路即可。 ...
1 写在前面——Hello World 这是一个个人公众号,该篇文章是建号的第一篇文章。建立这个公众号旨在分享一些电子设计相关的内容,同时记录一下博主自身的学习经历(本人记忆力不好,写下来或许过一段时间还能看起来回忆一下)。这第一篇文章,主要内容是想记录一下自己这半年来的学习经历,记录一下博主从一个电子设计新手,后面通过学习,逐渐入门,到现在终于可以独立设计一些小项目的过程,感悟与体会。本文不会过多涉及技术难点的讲解,仅仅作为学习过程、想法的记录,同时也希望有需要的同学看到这篇文章,可以对电子设计入门有一个初步的理解。 2 我的第一个项目——升压电源 其实大家在网上查找,很多文章或者一些人都会建议:小白入门电源第一个项目最好都是自己去设计一个 BUCK(降压)电路。其实这也是我刚开始的想法,我确实准备去实现一个比较正统的 BUCK 电路,但是后面误打误撞,去加入了一支智能车的队伍,因为需要就直接跳过了 BUCK,去做了一个 BOOST(升压)电源。虽然有点走了歪门邪道,但是不妨碍博主从中学习到了很多东西。接下来讲讲我做这个电源项目做的一些准备跟实践吧。 我认为学习电源理论是很重要的,懂得如何选取元件,计算元件参数,等到后面做出实物,测试的时候也需要用理论去解释测试得到的现象(正常或异常现象),才能真正地反哺到你的知识里,给你带来提升。我自己的学习路线是,先把模电、数电基础给学了,再去深入学习开关电源的理论知识,然后可以去尝试用软件搭建仿真模型,验证自己的思路是否正确,再去真正的制作实物。制作完实物之后,无论是否正常工作,测试工作都是非常必要的,最好使用示波器去测量不同节点的波形,看看跟自己的理论知识是否有出入,一般来说,新手的第一版电源波形都会有各种各样的奇怪的现象。当然,问题存在的时候也是你该进步的时候了,不要惧怕问题,去思考如何解释并解决这个现象,才能更好地学到东西。 电源基础拓补大致分为三种类型:BUCK(降压),BOOST(升压),BUCK-BOOST(升降压)。其中 BUCK(降压)最为简单,因为无论是从元件理论值计算、选取,还是稳定性分析建模、或是电路复杂度来说,它都简单,所以很适合入门。但是学会了 buck 之后,其他两个原理也是大致相通,入门可以通过这三个拓补进行学习。为了系统学习电源知识,当时我去找了很多资料,有网课、博客、书籍等,它们各有利弊,网课跟博客我个人感觉比较零散,特别是博客比较适合有一定基础的人去学习,不然很难系统掌握电源设计的相关知识。我个人觉得还是书籍资料比较适合我,能够支撑起电源理论知识的系统学习,《精通开关电源设计》这本经典教材我极力推荐。我在开始我的项目之前我看了这本书一个月左右,把一些比较重要的章节看了,里面很详细讲了伏秒定律、元件选取、稳定性分析等内容。对于入门来说,细看里面重要的章节已经很足够了。 开关电源无非就是一个能量的转换器,电能从输入端流动到输出端,一定程度上电能保持不变(假设转换器损耗的能量很小),变化的只是他们的形式,即是电源的电压与电流。关于开关电源的原理网上很多资料都有细讲,这里不多赘述。开关电源的比较重要的点,一是元件选取,包括 MOS 管、输入输出电容、电感、MOS 管输入电阻阻值等,这些可能还会根据实物的工作状态去调整;二是 PCB 的 Layout(布局),要考虑到功率元件的散热以及环路最小化问题,良好的散热可以提高功率元件的功率上限,环路设计好了可以大大提高电源工作的稳定性(不那么容易炸板),入门电源设计可以重点学习这两个内容。 我做的第一个电源项目改了四版,第一次出的问题最大,当时不懂得给 MOS 管散热的重要性,只参考了数据手册里面的电流极限值,在成品制作出来之后,理论计算 10A 的电流才跑不到 3A 就炸了。后面经过了解,MOS 管数据手册都是在保持 MOS 管在 25 度的情况下测得的电流极限值,但是在实际使用中 MOS 管散热没做好是会升温直接炸的,根本跑不到极限值,第一次电源实验就以失败告终了。后面换了一下 MOS 管的封装,改成了更好散热的封装,电源就正常了很多,极限电流也上去了,但是还是会有很多小问题,当时电源在带载的时候是正常的,但是空载情况下,电源发生了啸叫,这就很不正常了。后面发现电源在空载情况下因为布局不佳的问题,电源电路有轻微的震荡,导致了啸叫的产生。后面两版都是优化了布局布线,电路可以在接近理论值良好工作。经过最后测试这个 6V 转 12V 升压电路可以在极限负载 10A(120W)输出情况下正常持续工作 3min(对当时智能车的应用来说足够了)。 这里再提一下测试很重要!测试很重要!测试很重要!一定要熟练掌握示波器、万用表等仪器的使用方法。 当时做这个项目时间比较紧,说实话是翘了不少课来做的(当然不推荐)。即使在比较有压力的情况下也做了大概一个多月时间,当时我真的感觉电路怎么那么玄学。但后面慢慢研究,其实那些玄学的背后都是一个又一个的知识,那些谜团的背后都是自身技术提升的契机,只要有探索的欲望和耐心,去攻克这些难关,一定能有不少的收获。我感觉这是作为电子设计学习的基础了,一定要有解决问题的耐心,电子的学习是不能急于求成的。 3 后来的学习 第一个电源项目是成功把我领进了电子设计的大门,一些基础的,也属实是把之前学过的模电、数电、信号与系统这些都给用上了,做完这个项目之后,有一种加了一堆调味料终于成品菜出锅的感觉,说实话很爽。后面一些简单的驱动电路、单片机最小系统板其实都是水到渠成,也没有特别难的点。万事开头难,只要入了这个门,其实发现电子设计也没有想象中的难。 其实我 4 到 6 月份弄得智能车项目其实是寄掉了。连校赛也没能出去,但是当时也没感到多遗憾,毕竟感觉自己在这里面也收获到了自己想要的东西,它确确实实把我领进了电子设计的大门。 后面做过的小作品其实也有挺多,智能车那块还有一个超级电容无线充电,最终成品功率不高但是散热布局做的还算到位,如果有时间改改参数或许还能往上提个一两百 W。还有后面的电赛开始尝试一些尝试一些高频的电路设计(其实也就 100MHz 以下,一般现在来说叫中频了),大部分电路器件都是成品芯片,其实也没太多技术性可言,我当时感觉唯一比较有难度的是,尝试去给高速运算放大器做频率补偿,提高运放电路稳定性或者去达到运放标定的最大带宽。后面的学习比起第一次设计电路还是要轻松太多了。 4 我的一些想法 其实电子设计相关的学习还是很好玩的,很有意思。这是一个能把想法真正实现到成品的一项技能。我大一加入学校科创团队,到现在,我感觉我是走了一条自己喜欢的道路。 网上有很多说法,叫"板级硬件已死",我现在其实也不知道真实情况是不是这样。因为板级硬件(就是 PCB 电路板上能画的)很多都已经被集成芯片取代,集成芯片价格更低,性能更好,留给板级硬件师发挥的空间并不多,我打电赛期间也是这么感觉的。不过应该也是是我自身水平实力不够,现在还没有办法触碰到一些更高难度的板级硬件技术,所有现在才会有这种感觉。在网上查阅,很多网友推荐了一些比较有前景或技术含量的方向,例如大功率电子电力方向,板级射频、天线或者系统工程师(其实我也不是很知道系统工程师是什么意思)。他们意思就是,功率做大、频率做高、电路做复杂的意思。它们在网上很多文章都有分析,况且我自己理解也不深,也就不多说了。这里只说我自身的情况。 ...
开发背景 资源连接:Clocking Wizard v6.0 手册 pg065-clk-wiz 物理硬件平台:Xilinx Artix-7 FPGA A704 开发工具:VsCode 编译器,Vivado 综合布局,Modelsim 仿真,Verilog 开发语言 博主为了准备电赛,实现其中一个扫频的功能,便利用 Vivado 中现成的 IP 核实现动态调整锁相环输出的频率和相位。过程中发现现有的资料较少遇到不少问题,便以此写一篇文章为记录,也可以供大家参考。有问题的地方劳烦大家指出,也可以进行交流。 开发思路 由于我需要从 88MHz-108MHz,并且以 0.1MHz(100K)的频率进行扫频,再阅读手册 15-19 页其相关寄存器,发现 Clocking Wizard 其中有一个公共寄存器控制所有时钟输出频率和相位后,各自时钟还有相关寄存器自行控制。也就是说输入频率,先经过公共的整数+分数倍频(如倍频 8.125),然后经过整数分频后,最后经过每个时钟各自的分频才会输出。 注意这里特别提到了倍频和分频是整数还是包含分数,分数部分只能为"125"的倍数,倍频只有唯一一次在公共寄存器,普通时钟自身没有倍频只有整数分频,特别的:第一个时钟有分数分频。 由于我只需要一路时钟输出,所有我选择了第一个时钟。 所有我们为了输出时钟更加的精准,我们需要计算每个频率的相关参数,但是由于硬件描述语言不便于计算相关参数,并且目标频率是有步进的(虽然是一个范围),由此我决定利用 Python 脚本生成相关参数,再作为 COE 文件导入工程,用 ROM 存放直接读取,这样子更加便捷并且时序上更简单。 最后利用 Vivado 现有的 Clocking,用 AXI4Lite 协议(握手协议)来读写其内部寄存器,从而达到改变频率和相位的效果。 (以下截出了部分的寄存器,其它寄存器描述大差不差,英语不好可以翻译一下。) 这里的 C_BASEADDR 是基准地址,是内部自己控制的,不需要我们控制,我们只需要控制 0x200 这个公共寄存器,由于相位我们单独控制就不需要控制 0x204 了,另外时钟 0 控制频率的寄存器是 0x208,往下翻发现时钟 1 是 0x214,时钟 2 是 0x220……所以我们在写代码的时候可以以时钟 0 的频率寄存器为准,地址可以是 0x208+时钟号×0x00C(就是按 12 递增),同样的道理,相位寄存器也可以这样写。 写完寄存器后,要记得写重载寄存器 0x25C,Bit[0]位表示要重新加载,Bit[1]在控制重新加载默认(也就是在 Vivado 的 UI 界面配置的初始化状态),还是加载你动态写入的寄存器。加载完成后,也就是 Locked 拉高,内部会重新将 Bit[0]进行复位成 0。 ...
引言 最近我尝试在 STM32H723ZGT6 上使用 STM32CubeMX + CMake + GCC 方案配置 ADC1 的 DMA Circular Mode,发现在我的 STM32CubeMX 的参数配置正确的情况下仍然配置不成功。现象是可以进入 ADC1 对应的 DMA1_Stream0_IRQHandler 中断函数,但是无法进入 HAL_ADC_ConvCpltCallback。经过排查发现系统稳定地在 DMA 中断中报告传输错误(TEIF - Transfer Error Interrupt Flag)。下面是我的错误验证代码: void DMA1_Stream0_IRQHandler(void) { /* USER CODE BEGIN DMA1_Stream0_IRQn 0 */ if (__HAL_DMA_GET_FLAG(&hdma_adc1, DMA_FLAG_TEIF0_4)) { log_e("DMA1 Stream0 transfer error occurred"); // 此处报错 } /* USER CODE END DMA1_Stream0_IRQn 0 */ HAL_DMA_IRQHandler(&hdma_adc1); /* USER CODE BEGIN DMA1_Stream0_IRQn 1 */ /* USER CODE END DMA1_Stream0_IRQn 1 */ } 常规的调试手段,如排查 MPU 配置、管理 D-Cache 一致性,乃至验证外设时钟与模拟电源,均无法解决问题。从这个现象可以看出,这个坑并非来自 ADC 或 DMA 外设本身的功能缺陷,而是两者在特定工作模式下,触发了系统级深层次的硬件冲突。幸运的是,最终我在社区的帮助下解决了这一问题。 ...
在使用 STM32 系列单片机进行信号处理的过程中,我们往往会选择 ARM 提供的 CMSIS-DSP 库。CMSIS-DSP库涵盖了嵌入式信号处理的大部分常用算法函数,同时针对 Cortex-M 核心做了手工汇编优化,还提供了统一的接口。目前使用 CMSIS-DSP 库有以下几种方案: Keil 项目 + 封装好的 CMSIS-DSP 库 CMSIS-Pack STM32CubeMX CMake 项目 + Software Components STM32CubeMX CMake 项目 + CMSIS-DSP 源码 其中后两种方案更现代化,可以适配 STM32 for Visual Studio Code、CLion 等现代开发环境。而现在(2025 年 7 月)通过 Software Components 安装的 DSP Library 版本还停留在 v1.4.0,这是 2013 年 1 月发布的 CMSIS-DSP 版本,距今已超过十年。这十年里 ARM 为 CMSIS-DSP 追加了更多Cortex-M 架构的支持,新增了窗函数等功能模块。而第三种方案直接从 GitHub 上抓取源码,版本最新,功能最全面。但是需要一些 CMake 配置,没有第二种方案直接快捷。而这篇文章的使命就是带你将 GitHub 上的 CMSIS-DSP 源码加入到 STM32CubeMX 生成的 CMake 项目中。(下图是第二种方法通过 Software Components 配置 CMSIS-DSP) ...