我读到"软件PWM"的驱动程序。正在以某种方式在PWM-HW上运行并且在不使用CPU的情况下访问所有GPIO。有人可以解释一下这有用吗? Raspberry Pi中是否有第二个处理器用于PWM和PCM模块(是否有块图)?
这个问题与我在机器人中经常使用的this excellent driver有关。
以下是解释,遗憾的是我不理解......
驱动程序通过设置DMA控制块的链接列表来工作 最后一个链接回第一个,所以一旦初始化DMA控制器 不断循环,驾驶员不需要参与其中 当需要改变脉冲宽度时。在给定的时期内有两个DMA 控制块;第一个字转移到GPIO'清除输出' 寄存器,而第二个将一些字传送到PWM FIFO 生成所需的脉冲宽度时间。另外,穿插这些 控制块是每个配置伺服的一个,用于设置输出。
虽然驱动程序确实使用PWM外设,但它只使用它来调整DMA速度 转移,以便产生准确的延迟。"
以下理解是正确的:
DMA控制器就像第二个处理器。您可以在其上运行代码。因此,它用于控制所有Raspberry GPIO引脚的高/低状态以及PWM模块。 DMA控制器持续执行此操作。 Raspberry中可能有多个DMA控制器,因此由于缺少一个DMA控制器,OS Linux的速度不会受到太大影响。
我不明白DMA和PWM究竟是如何协同工作的。
答案 0 :(得分:2)
我建议将RPIO source code与ServoBlaster's一起阅读,因为它略有简化,可以帮助理解。同样非常重要:Broadcom's BCM2835 manual包含所有微小的细节。
有块图吗
该手册包含了该芯片提供的所有功能(据我所知,它并没有显示在框图中。)
以下理解权是正确的吗?
DMA控制器是主芯片的一部分(Broadcom,尽管我认为在台式机CPU上也是如此)。它不能精确地运行代码,但是它可以自己跨外围设备复制内存,而不会浪费主处理器的时间。 DMA控制器具有不同的通道,这些通道可以独立复制内存并独立于CPU运行。
它可以通过"control blocks"进行配置(BCM手册第40页,4.2.1.1):您可以告诉DMA控制器首先将内存从A复制到B,然后从C复制到D,依此类推。
不了解DMA和PWM如何协同工作
DMA is used to send data到PWM控制器(“脉冲宽度调制器”,BCM手册第138页,第9章),它消耗了数据并产生了非常精确的延迟。有趣的是,PWM控制器...不用于生成任何PWM脉冲,而只是用于等待。
有人可以解释它的工作原理吗?
最终,您通过setting memory在一个特殊地址上配置GPIO引脚的值(或PWM或PCM发生器的设置)。 that region中的内存代表外围设备configuration(BCM手册第89页第6章)。
因此,思路是: 使用DMA控制器将1复制到控制GPIO引脚值的内存中;等待脉冲宽度;将0复制到GPIO引脚值上;等待剩余的时间;环。由于DMA控制器可以执行此操作,因此它不会消耗CPU周期。
这里的关键是能够使DMA控制器“等待”确切的时间,为此,RPIO和ServoBlaster在FIFO模式下使用PWM控制器(PCM发生器也具有这样的功能,但让我们坚持一下至PWM)。这意味着PWM控制器将“发送”它从其所谓的FIFO队列中读取的数据,然后停止。 “发送”的方式无关紧要(BCM手册第139页,9.4 MSENi=0
),关键是它需要固定的时间。实际上,它doesn't even matter which data已发送:DMA控制器配置为写入FIFO队列,然后等待直到PWM控制器完成数据发送,这会产生非常精确的延迟。
生成的脉冲的分辨率由PWM传输的持续时间确定,该持续时间取决于PWM控制器运行的频率。
我们的最大分辨率为1ms(由PWM延迟决定),我们希望有一个频率为125Hz的占空比为25%的脉冲。因此,脉冲周期为8ms。将执行DMA操作
因此,这将至少需要10个DMA控制块(8个等待指令,由周期/延迟给出,再加上2个写操作)。
注意: 在ServoBlaster和RPIO中,它将恰好消耗16个DMA控制块,因为(为了获得更高的精度),它们始终在“等待操作”之前执行“内存复制”操作”。除非需要更改引脚值,否则“内存复制”操作只是一个虚拟操作。