boringhex.top博客

非典型程序员的小破站

hexo通过插件支持很多种部署方式,比如GitHub Page、腾讯云COS、阿里云OSS等等,我最后选择通过GitHub Actions实现自动部署。

但是在编写STM32 裸机编程指南系列时发现一个问题,GitHub Actions产生永久链接跟本地的不一致,这给文章间的引用造成了很大麻烦。

因为我配置hexo的永久链接为:permalink: posts/:hash/,而hexo在计算hash时是通过文件名和时间,所以应该是GitHub Actions系统时间与本地不同导致的。

在 GitHub Actions 中,可以通过设置环境变量来指定时区。

阅读全文 »

为符合《9706.1-2007 医用电气设备 第1部分:基本安全和基本性能的通用要求》的检测要求,企业提供的电器绝缘图中应至少包含以下信息:

阅读全文 »

执行git status时,如果路径或文件名中有中文,会显示为八进制乱码,很不方便:

1
2
3
4
5
6
7
❯ git status
On branch develop
Your branch is up to date with 'origin/develop'.

Untracked files:
(use "git add <file>..." to include in what will be committed)
"\344\270\255\346\226\207.txt"
阅读全文 »

GitHub上前有996.ICU,后有955.WLB,今天在GitHub上发起了一个针对电子工程师、嵌入式工程师职业环境的仓库👉 boringhex-top/awesome-companies-for-ee: 对电子工程师、嵌入式工程师友好的公司列表 (github.com),希望可以好好维护,促进行业发展😀

喜欢的当然要力挺打CALL,不喜欢的也要提醒其他小伙伴避坑呀🤭

阅读全文 »

Eric S. Raymond 在2004年发表过一篇 How To Ask Questions The Smart Way 文章,最新版是2014年的3.10版,原文网址: http://www.catb.org/~esr/faqs/smart-questions.html 。 这篇文章写的非常好,我深受启发。然原文过于冗长,有很多信息也已经过时;网上的 中文版大多是照搬翻译,语感不佳,有浓厚的译制片配音的语调。且文章是站在国外程序员的视角写的,与中国特色社会主义程序员不符。为了更好的宣扬提问的智慧,于是我对原文做了大量的删减和本土化改造,更贴近中国程序员的实际情况。

阅读全文 »

对于开发者来说,包管理工具是绕不开的话题,Ubuntu广受喜爱的原因之一也包含其方便的apt包管理工具,MacOS上有homebrew供开发者使用,这些包管理工具让开发环境的搭建非常顺滑。这里的包,是指广义的软件包,不仅包含常见的图形用户界面(GUI)软件,也包含命令行界面(CLI)软件和工具。

而开发者苦Windows命令行甚至powershell久矣,在早前的版本上,真的没有特别好用的工具。如今,终于也有了历经时间和用户考验的包管理器:Chocolatey,Scoop和Winget。Winget时间不久,由微软官方社区维护,但目前人气不如前两者。我只简单使用过chocolatey,没太多发言权,但scoop真的很好很强大,并且现在scoop的社区非常活跃,参与者众多,维护更新很快。我在GitHub上的第一次PR就提给了scoop。

阅读全文 »

系列目录

带设备仪表盘的网络服务器

Nucleo-F429ZI 带有板载以太网。以太网硬件需要两个组件:PHY(向铜缆、光缆等介质发送和接收电信号)和 MAC(驱动 PHY 控制器)。
在我们的Nucleo开发板上,MAC控制器是MCU内置的,PHY是外部的(具体来说,是Microchip的LAN8720a)。

MAC和PHY可以用多个接口通信,我们将使用RMII。为此,一些引脚必须配置为使用其替代功能 (AF)。要实现 Web 服务器,我们需要 3 个软件组件:

  • 网络驱动程序,用于向 MAC 控制器发送/接收以太网帧
  • 一个网络堆栈,用于解析帧并理解 TCP/IP
  • 理解HTTP的网络库

我们将使用猫鼬网络库,它在单个文件中实现所有这些。这是一个双重许可的库(GPLv2/商业),旨在使网络嵌入式开发快速简便。

阅读全文 »

系列目录

配置时钟

启动后,Nucleo-F429ZI CPU以16MHz运行,最大频率为180MHz。请注意,系统时钟频率并不是我们需要关心的唯一因素。外设连接到不同的总线,APB1 和 APB2 时钟不同。 它们的时钟速度由频率预分频器配置值,在 RCC 中设置。主 CPU 时钟源也可以不同 - 我们可以使用外部晶体振荡器 (HSE) 或内部振荡器(HSI)。在我们的例子中,我们将使用 HSI。

当CPU从闪存执行指令时,闪存读取速度(大约25MHz)在CPU时钟变高时成为瓶颈。有几个技巧会有所帮助,指令预取就是其中之一。此外,我们可以给闪存控制器提供一些线索,告诉它系统时钟有多快:该值称为闪存延迟。对于 180MHz 系统时钟,FLASH_LATENCY值为 5。闪存控制器中的位 8 和 9 控制启用指令和数据缓存:

1
FLASH->ACR |= FLASH_LATENCY | BIT(8) | BIT(9);      // Flash latency, caches
阅读全文 »

系列目录

供应商CMSIS头文件

在前面的部分,我们仅使用数据手册、编辑器和GCC编译器开发了固件程序,使用数据手册创建了外设结构定义。

现在我们已经知道MCU是怎么工作的,是时候介绍一下CMSIS头文件了。它是什么?它是由MCU厂商创建和提供的带有全部定义的头文件。它包含MCU相关的全部,所以很庞大。

CMSIS代表通用微控制器软件接口标准(Common Microcontroller Software Interface Standard),因此它是MCU制造商指定外设API的共同基础。 因为CMSIS是一种ARM标准,并且CMSIS头文件由MCU厂商提供,所以是权威的来源。因此,使用供应商头文件是首选方法,而不是手动编写定义。

在这一节,我们将使用供应商CMSIS头文件替换 mcu.h 中的API函数,并保持固件其它部分不变。

阅读全文 »

系列目录

用Segger Ozone进行调试

如果我们的固件卡在某个地方并且 printf 调试不起作用怎么办?甚至连启动代码都不起作用怎么办?我们需要一个调试器。那有很多选项,但我建议使用Segger的Ozone调试器。为什么?因为它是独立的,不依赖任何IDE。我们可以把 firmware.elf 直接提供给Ozone,它会自动拾取源文件。

可以从Segger网站下载 Ozone。在用它调试我们的Nucleo开发板之前,我们需要把板载的ST-LINK固件改成jlink的固件,这样Ozone才能识别。遵循Segger网站的说明完成固件修改。

阅读全文 »
0%