【原创】树莓派3B开发Go语言(四)-自写库实现pwm输出

Python017

【原创】树莓派3B开发Go语言(四)-自写库实现pwm输出,第1张

在前一小节中介绍了点亮第一个LED灯,这里我们准备进阶尝试下,输出第一段PWM波形。(PWM也就是脉宽调制,一种可调占空比的技术,得到的效果就是:如果用示波器测量引脚会发现有方波输出,而且高电平、低电平的时间是可调的。)

这里爪爪熊准备写成一个golang的库,并开源到github上,后续更新将直接更新到github中,如果你有兴趣可以和我联系。 github.com/dpawsbear/bear_rpi_go

我在很多的教程中都看到说树莓派的PWM(硬件)只有一个GPIO能够输出,就是 GPIO1 。这可是不小的打击,因为我想使用至少四个 PWM ,还是不死心,想通过硬件手册上找寻蛛丝马迹,看看究竟怎么回事。

手册上找寻东西稍等下讲述,这里先提供一种方法测试 树莓派3B PWM 方法:用指令控制硬件PWM。

这里通过指令的方式掌握了基本的pwm设置技巧,决定去翻一下手册看看到底PWM怎么回事,这里因为没有 BCM2837 的手册,根据之前文章引用官网所说, BCM2835 BCM2837 应该是一样的。这里我们直接翻阅 BCM2835 的手册,直接找到 PWM 章节。找到了如下图:

图中可以看到在博通的命名规则中 GPIO 12、13、18、19、40、41、45、52、53 均可以作为PWM输出。但是只有两路PWM0 PWM1。根据我之前所学知识,不出意外应该是PWM0 和 PWM1可以输出不一样的占空比,但是频率应该是一样的。因为没有示波器,暂时不好测试。先找到下面对应图:

根据以上两个图对比可以发现如下规律:

对照上面的表可以看出从 BCM2837 中印出来的能够使用在PWM上的就这几个了。

为了验证个人猜想是否正确,这里先直接使用指令的模式,模拟配置下是否能够正常输出。

通过上面一系列指令模拟发现,(GPIO1、GPIO26)、(GPIO23、GPIO24)是绑定在一起的,调节任意一个,另外一个也会发生变化。也即是PWM0、PWM1虽然输出了两路,可以理解成两路其实都是连在一个输出口上。这里由于没有示波器或者逻辑分析仪这类设备(仅有一个LED灯),所以测试很简陋,下一步是使用示波器这类东西对频率以及信号稳定性进行下测试。

小节:树莓派具有四路硬件输出PWM能力,但是四路中只能输出两个独立(占空比独立)的PWM,同时四路输出的频率均是恒定的。

上面大概了解清楚了树莓派3B的PWM结构,接下来就是探究如何使用Go语言进行设置。

因为拿到了手册,这里我想直接操作寄存器的方式进行设置,也是顺便学习下Go语言处理寄存器的过程。首先需要拿到pwm 系列寄存器的基地址,但是翻了一圈手册,发现只有偏移,没有找到基地址。

经过了一段时间的努力后,决定写一个 树莓派3B golang包开源放在github上,只需要写相关程序进行调用就可以了,以下是相关demo(pwm)(在GPIO.12 上输出PWM波,放上LED灯会有呼吸灯的效果,具体多少频率还没有进行测试)

以下是demo(pwm) 源码

如果你想每一步走得扎实,那么我的建议如下:

对一名从未接触过程序开发的小白来说,首先得足够了解计算机,至少你得知道你写的代码在计算机内部是如何运行的,你的数据是如何通过网络传输,《微机原理与接口技术》和《TCP/IP详解》(三卷)是很好的学习入门 之选,同时也是很好的参考手册

一切准备就绪,开始写你的第一个程序,建议选C语言,基本的数据结构、指针、函数、循环、条件判断、手动GC等都上手试一遍,做到了然于胸,信手拈来

进入正题,学习Go语言,你会发现,换汤不换药,程序的构成无非那么几类,当然Go会有自己的特性,比如slice、goroutine、channel等,当然这一切得基于go开发环境

至于教程,最合适的莫过于官方文档,老老实实看完,别太在意网上的各种项目实战,先学会走路,再学跑

最重要的一点:纸上得来终觉浅,绝知此事要躬行,多敲敲代码,熟能生巧,happy coding!

CoreDNS 使用GO语言开发,除非你想开发插件或者编译CoreDNS ,否则你无需担心。 如下章节展示了如何获取CoreDNS 的编译文件(可执行版本)或从源码编译安装。

对 CoreDNS 的每个版本,我们给多种操作系统提供了 pre-compiled

binaries 。

对 Linux,还提供了面向ARM,PowerPC和其他架构的cross-compiled编译文件。

我们同样将每个版本都发布到Docker images。你可以在 public Docker

hub 内的 CoreDNS organization找到。Docker image 的格式如 scratch + CoreDNS + TLS 认证 (for DoT, DoH, and gRPC).

要编译 CoreDNS,我们建议你有一个工作的GO设置。如果你还没有配置,请参考文档。 CoreDNS 使用Go模块来实现它的依赖管理。

关于编译的最新文档参见 coredns source .

如果你有 coredns 编译文件,你可以使用 -plugins flag 来列出所有的插件。

如果找不到 Corefile (See Configuration ) 文件, CoreDNS 会加载 whoami 插件,插件会返回client的IP地址和端口。我们启动 CoreDNS,运行在端口 1053 ,使用 dig 进行查询测试:

从另外一个 terminal 窗口, dig 会返回类似于下面的内容:

下一篇 将展示如何开启更多好玩的插件。