优秀的 PCB 设计者同时也是出色的艺术家,但是伴随 5G 的全面商用以及物联网设备的普及,电路板走线越来越精密,信号频率日益提高,电磁干扰问题日趋严重,PCB 设计人员不得不去面对一个现实问题:PCB 电路板已经开始像一个具有电阻、电容、电感的组件,而非像过去 10 年前那样仅仅作为线路连接的平台。电磁兼容性信号完整性的问题日益突出,对于 PCB 布线与元器件布局的要求越来越高。

本文首先介绍了 PCB 制造工艺与元器件封装相关的知识,然后重点讨论了笔者工作过程当中总结的一些 PCB Layout 方面的基本布线规范与设计原则。当然,信号完整性作为一个比较系统的工程化问题,这些经验与原则并非绝对适用于任意场合,实际布线时仍然需要具体问题具体分析,结合实际的工况进行设计。而对于信号完整性方面的各类繁杂问题,将会专门新开一篇文章另行讨论。

阅读全文 »

二十一世纪,数字化浪潮席卷了电子工业领域,与传统的模拟电子系统相比,数字系统具备更加优异的精确与可靠性,逐步取代了许多模拟电路的应用场景。数字逻辑电路是对数字信号进行算术与逻辑运算的电路,以逻辑门作为基本电路单元(最早采用 TTL 工艺,伴随半导体工艺技术的不断进步,目前已经逐步被 CMOS 工艺取代),数字电路可以分为组合逻辑电路(基本逻辑门)和时序逻辑电路(逻辑门 + 反馈逻辑回路)两大类。

本篇文章讲解了数字逻辑电路的分析与设计所涉及到的基础理论,首先讲解了数制码制逻辑代数等基础知识,接着重点描述组合逻辑电路时序逻辑电路的分析与设计方法,然后讨论了各种数字集成电路( 含门电路、可编程逻辑元件、半导体存储器)的原理以及使用方法,并且介绍了硬件描述语言可编程逻辑器件的相关知识,最后一部分讲解AD/DA转换以及脉冲波形的产生和转换电路。

阅读全文 »

电子技术发展至今,基础理论方面的突破甚少,进步主要体现在工艺、材料与制程方面。特别是大规模集成电路的广泛应用,过去需要采用大量分立式元器件才能完成的工作,都已经被标准化的模拟、数字集成电路所替代。电子工程师的日常工作内容,逐步从过去各类基础电路的搭建,切换至电子自动化设计 EDA(Electronic Design Automation)、信号完整性 SI(Signal Integrity)、电磁兼容性 EMC(Electro Magnetic Compatibility)等方面。

模拟电子技术作为现代电子工业的理论基石,主要围绕双极性结型晶体管 BJT场效应晶体管 FET 构成的模拟信号放大电路展开,着重分析了其频率响应以及负反馈等特性。伴随近年碳化硅、氮化镓等第三代半导体材料在新能源汽车等领域的广泛应用,模拟电子元件在体积、效率、可靠性方面都取得了显著的提高,本文在写作过程当中参考了《Electronic Devices and Circuit Theory》第 11 版一书。

阅读全文 »

MathJax 是一款运行于 Web 浏览器当中的开源 JavaScript 数学符号渲染引擎,通过它可以方便的在现代 Web 浏览器当中显示数学公式,目前已经能够解析 LaTexMathML 等标记语言。MathJax 项目发源于 2009 年,目前由 NumFOCUS 基金会主持,并且得到了 MathJax 联盟的支持,该联盟是美国数学协会(AMS)和 工业与应用数学协会(SIAM)的共同合资企业。

LaTeX 是一种高质量的排版格式,可以生成复杂的表格与数学公式,是当前电子与数学出版行业的事实标准。本文以 Pandoc 作为 LaTex 渲染引擎(一款用于标记语言文档转换的命令行工具),分门别类的总结了撰写数学公式所需要经常使用到的 LaTeX 语法,方便写作相关科技类文章时随手查阅。

阅读全文 »

笔者作为常年工作在一线的 IT 技术研发人员,早在 2018 年就已经不玩儿互联网行业了。主要是感觉 Web 技术栈已然走向全家桶化(例如后端 Spring 全家桶、前端 Vue 全家桶),而开发方式也日趋套路化与工程化,上手难度与技术门槛以肉眼可见的速度不断下探,进而伴随着大量从业人员的持续涌入,整个行业全面开启了 996 内卷模式

除此之外,叠加近几日中概股跌穿了板凳,以及反垄断监管的不断强化,互联网行业合规经营的大幕徐徐拉开。未来全行业的整体薪酬水平,必然回归至类似财务会计这类市场化职位应有的水平。高薪光环终究是到了褪去的时刻,重新回到利润与收支挂钩的市场化薪酬体系,将会是整个行业未来的大势所趋。

阅读全文 »

Shell 既是一套命令行工具(交互式地解释和执行用户输入的命令)也是一种脚本设计语言(定义有变量与参数,并提供了控制、循环、分支结构)。Bash Shell 是由 GUN 官方项目提供的 Shell 解释器,名称源自于 Bourne Again SHell 的英文缩写,整合了传统 Korn Shell 以及 C Shell 的有效特性,并且尽量遵循IEEE POSIX P1003.2/ISO 9945.2规范,同时在编程与交互使用方面提供了大量的功能改进,因而在提供丰富功能的基础之上,展现出了良好的兼容特性,大多数.sh脚本可以无需移植修改即可交由 Bash Shell 来执行。

当用户登入任意一款 Linux 操作系统时,初始化程序init都将会为用户启动一个Bash Shell命令解析器,其即可以用于解析命令行输入并与内核进行交互,也可以作为高效的脚本编程语言,运用其提供的变量、参数、循环、分支等编程语法特性,完成一些批量的自动化的任务处理工作,本文将会围绕 Bash Shell 的脚本编程特性,加以进行详细的分析、说明与示例。

阅读全文 »

Qt 5.14.2 是跨平台应用开发框架 Qt 的最新版本,除了采用基于 C++11 的经典 Qt Widgets 进行桌面应用程序开发以外,还支持通过 Qt Quick 快速开发适用于移动端设备的用户界面,因为 Qt 5 底层图形渲染引擎基于 GPU 硬件加速,所以其能够保持与原生 C++ 近乎等同的运行效率。笔者计划通过两篇文章分别对这 2 种技术进行介绍,但是无论如何,在传统跨平台桌面应用开发领域,Qt Widgets 依然是 Qt5 最为基础与核心的内容。

虽然 Qt 6 发布在即,但是官方声明将会依然保持 API 的兼容与稳定性,因此本文依然基于当前最新的 Qt5 稳定版本撰写。全文将会分别对 Qt Widgets 当中使用较为频繁的窗口部件布局管理应用主窗口事件系统对象模型风格与样式国际化等部分内容进行深入介绍,同时展示完善的示例代码以及程序运行效果,并结合《QtQuick 篇》一文讲解混合编程相关的技术。

阅读全文 »

由于 Material Style 这样富含动画效果的用户界面风格,并不能简单的加入到以静态图形作为主要显示单元的QWidget当中。所以 Qt 官方推出了一种声明式编程语言 QML(Qt 元对象语言,Qt Meta-Object Language),其提供了一种具有更高可读性的声明式语法,并附带了必要的 JavaScript 语句和动态属性绑定支持。QML 的语言特性和引擎框架由 Qt QML 模块提供,该模块同时提供了 QMLC++ 两套接口。

Qt Quick 是一款基于 QML 的应用程序标准库,包含有可视化类型、交互类型、动画、模型和视图、粒子特效等特性,这些都是由 Qt5 上的Qt Quick模块提供,通过import语句即可方便的进行导入。Qt Quick 同样提供了 QMLC++ 两套接口,可以轻松构建具有流畅动画效果的动态 QML 用户界面。而 Qt 5.7 版本以后推出的 Qt Quick Controls 更是提供了丰富的开箱即用控件,让快速开发成为了可能。

阅读全文 »

万众期待的 Raspberry Pi 4B 终于发布,之前由于产品原型的需要,一直计划采购 3B+,后来供应商透露新版 4B 稍晚就会面市,所以稍微等待了一段时间,今天终于拿到了一块 2G 内存的板子。一直以为 4B 只会简单的更新一下 SoC 并增大 DDR 容量,但是实际上还带来了 Type-CBluetooth 5.0Micro HDMIUSB 3.0 乃至 DDR4 等诸多崭新升级。而官方推荐的应用范围,开始从教育渗透至工业领域,逐步发展为一套完整的嵌入式生态链。

本文基于树莓派基金会官方提供的 《Raspberry Pi Documentation》,笔者翻译了其中较为常用的配置章节,便于读者拿到板子以后能够快速上手,并避免使用一些官方不推荐的操作和工具库。此外,本文也会涉及 OpenCVdlib 的编译,以及 Electron 在树莓派上的部署等话题。文章内容将会伴随笔者的日常使用而长期进行更新,欢迎各位爱好者朋友持续关注与勘误。

阅读全文 »

Android 可以采用 Kotlin、Java、C++ 语言编写应用程序,Android SDK 会将这些代码连同相应的数据和资源文件编译为 Android 软件包,即一个带有.apk后缀的归档文件,也就是 Android 应用程序的安装文件。本质上 Android 系统是一种多用户的 Linux 系统,每个应用程序都运行在独立的 Linux 用户 ID进程之下,从而为每个 Android 应用都提供了独立的安全沙盒,体现了最小权限的设计原则。

鉴于 Google 官方提供了完善的文档,本文并不过多过深的涉及 Android SDK 开发的具体知识细节,仅会在简单介绍 Android 开发当中的一些基本概念之后,着重分析经典/低功耗蓝牙NFCWIFI指纹识别5G 等硬件外设的通信协议概念以及相应的实现步骤,并且展示一些比较典型的应用场景与示例代码,从而为读者在进行物联网相关项目的开发时,在移动设备应用控制端提供即有的现成经验。

阅读全文 »

STLink 是由意法半导体公司推出的在线调试编程器,采用5VUSB2.0全速接口进行供电与数据传输,可以方便的对内部固件进行升级,同时支持以 JTAGSWD 模式连接至 STM32 系列微控制器,或者以 SWIM 模式连接至 STM8 系列微控制器,操作温度介于0 ~ 50℃之间。由于 ST 公司极为重视中国市场,因此 STLink 的销售价格相对其它国外大厂的在线仿真设备要实惠许多,基本成为国内嵌入式工程师人手上必备的工具。

本文详细介绍 Keil uVision 5 开发环境下 ST-LINK/V2 版本的调试编程器使用方法,并介绍了相关接口的详细定义与接线方法,文中部分内容翻译至意法半导体官方提供的《用于 STM8 与 STM32 的 ST-LINK/V2 在线调试编程器用户手册》,以确保使用方法与解释的规范性。

阅读全文 »

GNU Make用于控制如何从程序的源代码文件编译并链接为可执行文件,通过make命令从名称为makefile的文件中获取构建信息,该文件定义了一系列规则来指定源文件的编译先后顺序、是否需要重新编译、甚至于进行更为复杂的操作。通过makefile文件可以方便的实现工程的自动化编译,只需要执行make命令即可完成编译动作,从而极大的提高了开发人员的工作效率。

CMake 3.17是一款源代码构建管理工具,最初作为各种 Makefile 方言的生成器,后来逐步发展为现代化的构建系统,广泛用于 C 和 C++ 工程源代码的构建。官方提供的《CMake Tutorial》 为开发人员提供了一个循序渐进的指南,涵盖了 CMake 构建过程中常见问题的解决方案。如果需要构建从第三方发布的源代码包,则可以参考《User Interaction Guide》。而《Using Dependencies Guide》则主要针对需要使用第三方库的开发人员。

阅读全文 »

自本世纪六十年代开始,数字半导体技术席卷了全球电子工业,伴随工艺与制程的持续演进,高频高速电子信号的处理需求愈加旺盛,电子技术的发展重心逐步由模拟时代,过渡至全面的数字化阶段。虽然模拟电路以及分立式电子元器件的使用频率逐年下降,但是在电磁兼容性处理、开关电源设计等场景当中,传统的模拟电子技术以及相关分立式元器件依然扮演着不可或缺的角色。

本文定位为一篇导论性质的文章,用于帮助当前开发团队里的嵌入式软件工程师,快速了解模拟数字电子技术相关的术语与概念,因此行文中并不涉及各类电路原理的深入数学分析,仅仅言简意赅的汇总了日常工作相关的模拟、数字电路知识。文章中的部分公式与原理图摘取自Wikipedia 维基百科,写作过程当中参考了《Understanding Basic Electronics》第 2 版一书。

阅读全文 »

嵌入式 Linux 是将日益流行的 Linux 操作系统进行裁剪与修改,使之能在嵌入式硬件上运行的一种操作系统,拥有许多开源的参考与移植,也出现了 RTLinux 等实时性更强的发行版本。嵌入式 Linux 应用开发过程当中,会大量运用到 C 语言去开发原生的 Linux 应用程序,从而获得较小的存储空间占用,以及更高的执行效率,并且能够兼顾较好的代码维护效率。

本文首先会介绍文件 IO进程与进程间通信多线程网络编程等 Linux 原生应用程序开发的内容,然后分门别类的对串口GPIOSPII2C 等常用的协议开发进行了介绍。阅读本文前需要具备 C 编程语言基础,并且理解 GNU 编译器、链接器、调试器的相关概念。

阅读全文 »

2011 年,C++ 标准委员会发布了 ISO C++ 标准的一个重要修订版 C++ 11;该修订版是 C++ 语言演进过程当中的重要一步,也是当前获得编译器(GCCLLVMQt5Visual C++支持较多,兼容性最为优秀的一个版本。增添了类型说明符autodecltypeLambda 表达式智能指针 unique_ptr shared_ptr weak_ptr空指针 nullptr等诸多新特性,语言风格更加灵活统一的同时,极大提升了程序的编写效率。

本文基于《C++ Primer》一书最新的第 5 版撰写而成,该书作为 C++ 语言学习的经典读物,同样与时俱进增添了 C++ 11 的诸多新特性。因此,本文也选择了支持 C++ 11 标准的 Qt5 作为开发编译环境。由于 C++ 面向过程的语法与 C 语言类似,而笔者之前已经在《Linux C 标准程序设计》一文对相关内容进行了详尽的表述,因而本文将会着重笔墨水介绍 C++ 面向对象以及标准库方面的内容。

阅读全文 »

GNU 的正确发音为[g'noo],名称由英文句子GNU's Not Unix递归缩写组成,是一项由自由软件基金会推动的操作系统计划。GNU 计划最早开始于 1984 年 1 月,目标是完成一个由Hurd内核与一系列应用程序、系统库、开发工具组成的GNU 操作系统。但由于 Hurd 的开发工作迟迟未能完成,因而普遍选择采用 Linux Kernel 作为操作系统的内核,这一套技术组合正是闻名遐迩的 GNU/Linux 操作系统。

GCCGDB 组成的编译套件正是 GNU 计划下诞生的优秀开源项目,也是 GNU/Linux 技术体系不可或缺的构成要素。虽然当前 ClangLLVM 编译套件的发展风头正劲,但是由于嵌入式 Linux 设备通常只提供基于 GCC 的交叉编译工具链,加之两者在使用上差异不大,而 GDB 又同时提供了两者编译后程序的完整 Debug 支持,因而笔者依然选择 GCCGDB 组合来作为本文的撰写的目标。

阅读全文 »

Python 诞生于 20 世纪 90 年代初,是一款非常简洁易读的解释型脚本语言;擅长于科学计算与图形处理,传统的计算机视觉库 OpenCV、三维可视化库 VTK、医学图像处理库 ITK都提供了 Python 调用接口,Python 也原生提供了 NumPySciPymatplotlib等强大的科学计算扩展库。Web 应用开发方面,Python 也提供有 DjangoTornado 等开发框架。概而言之,得益于强大的开源社区支持,Python 已经成为一门功能丰富的胶水语言。

本文示例代码基于Python 3.6.6版本编写,在简单介绍相关语法以及 pipvirtualenv 等扩展库的使用之后,将会实现一个基于官方 XML 解析库ElementTree的 SVG 图片合并小程序。文中涉及的代码已经提交至笔者的 Github,需要的朋友可以直接进行克隆,任何缪误或者建议请向我提交issue。如果需要采用 Python 进行 Web 开发,可以参见我的《使用 Django2 快速开发 Web 项目》一文。

阅读全文 »

JTAG(Joint Test Action Group,联合测试行动组)是一种用于芯片内部测试的国际标准协议,ARMDSPFPGA等主流 IC 都对其提供了良好支持,标准 JTAG 接口拥有TMS模式选择、TCK时钟、TDI数据输入、TDO数据输出共 4 条信号线。笔者当前使用的 Mini2440 开发板原厂提供的 JTAG 调试器是采用并口的H-JTAG,由于现在的计算机设备早已经不提供并口支持,因此笔者选择了较为通用的J-Link作为 ARM9 仿真调试器。

J-Link是德国SEGGER公司推出的一款专用于 ARM 内核微控制器的 JTAG 仿真调试设备,能够与 ARM 官方提供的 Keil 集成开发环境无缝衔接,支持 Cortex-A/R、Cortex-M、ARM7、ARM9、ARM11、Renesas RX、Microchip PIC、Silicon Labs 8051、RISC-V 等系列的微控制器。笔者 7 年前购置了一台 J-Link V8 版本的J-Link调试器,当时由于使用不当造成固件丢失,因此特别撰写此文来记录一下固件恢复的过程。

阅读全文 »

开发人员长期以来对于 Microsoft Windows 操作系统总抱以嗤之以鼻的态度,笔者亲身经历了Windows XPWindows 7Windows 10的版本演变过程,抛开众所周知的偏见,事实上是能够感觉到系统稳定性、用户体验方面的大幅改善的,叠加近年来 CmderNeovim 等辅助开发工具的出现与逐渐成熟,作为软件开发环境,其使用体验已经完全可以与 Linux 媲美,并在图形界面的稳定性以及交互的友好性方面胜于后者。

但是对于广大硬件电子工程师而言,Altium DesignerPadsAllegro 等商业 EDA 工具仅提供支持 Windows 操作系统的版本,而高频高速 PCB 电路设计基本离不开 Windows 操作系统环境,因而 Windows 和 Linux 在笔者日常工作里都各自拥有着其不可替代性。本文主要用于记录一些笔者使用 Windows 10 操作系统的配置和习惯,便于切换到新的工作环境时快速的展开,因而全文也将会持续保持更新。

阅读全文 »