树莓派:基于DMA的PWM工作原理及ServoBlaster驱动疑问
关于ServoBlaster(Software PWM驱动)工作机制与树莓派硬件的疑问
我最近在做机器人项目,一直在用ServoBlaster这个非常好用的驱动——它属于那种“Software PWM”驱动,能依托PWM硬件运行,不用占用CPU就能控制所有GPIO引脚。现在我有几个搞不懂的问题想请教:
- 这种驱动的具体工作机制是什么?
- 树莓派里有没有专门给PWM和PCM模块用的独立处理器?有没有对应的模块框图可以参考?
我特意去查了官方解释,但实在没看明白:
该驱动通过构建首尾相连的DMA控制块链表实现初始化,之后DMA控制器会持续循环运行,仅在需要更改脉冲宽度时才需驱动介入。一个周期内包含两个DMA控制块:第一个向GPIO“清除输出”寄存器传输单个字,第二个向PWM FIFO传输若干字以生成所需脉冲宽度时长。此外,每个配置的舵机对应一个插入其中的控制块,用于设置输出。
虽然驱动会用到PWM外设,但仅用其来同步DMA传输,以生成精准延时。
我自己试着理了理,不知道这个理解对不对:
DMA控制器如同独立处理器,可运行代码,在此与PWM模块协同控制树莓派所有GPIO引脚的高低电平状态,并持续执行该操作。树莓派可能配备多个DMA控制器,因此占用一个不会对Linux系统速度造成明显影响。
最让我困惑的点是:DMA和PWM到底是怎么协同工作的?
内容的提问来源于stack exchange,提问作者Jonny
相关产品推荐
相关产品推荐

