我现在有一个负责红外TX载波生成的微 Controller ,但是我开始怀疑我是否可以处理它,并在linux方面进行这项工作-从而降低了嵌入式系统的成本。
我在Freescale i.mx233(454MHz ARM9)上运行,如果直接通过/dev/mem
访问注册表,则可以实现相当稳定的5MHz触发GPIO引脚。
由于我需要37kHz,因此我开始寻找降低速度的方法,但是至少nanowait()
似乎太粗糙了。
我发现在for循环中调用rand()的一种解决方案,似乎可以很好地生成38,4kHz信号,但是根据示波器,有时会出现一些 Not Acceptable 抖动。 (我知道这相当浪费资源,但是当需要完成发送时,系统实际上没有其他任务)
我的问题:
飞思卡尔内核代码(3.8分支)没有CONFIG_PREEMPT_RT补丁,因此我应该研究一件事,但在此之前:
微型 Controller 非常适合此类任务,但如果可能的话,最好避免这种开销。
最佳答案
“多芯片连接模式”中的i.MX23 PWM正是为此要求而设计的。
例如,假设您使用的是24Mhz时钟,则在“多芯片连接模式”中使用PWM之一。
如果使用32Mhz时钟,则需要其他CDIV和PERIOD参数才能达到34Khz。
有关示例代码,请参见“i.MX23应用处理器引用手册”。如果我没有记错的话,驱动程序代码在
arch/arm/plat-mxc/pwm.c
中,但它似乎不支持MATT模式。您可能必须自己扩展代码。关于实现-
上面的答案仅与CPU有关。在实践中,实现该想法的能力取决于电路板设计。该板将需要一个接头连接器(用于外部连接的引脚),该接头连接至GPIO引脚,该引脚可通过Pinmux连接至PWM之一。我以为大多数引用设计将至少有一个通过 header 暴露的PWM可配置GPIO。问题是是否只有一个,是否已经将其用于其他控制目的。
确定存在带免费PWM可配置GPIO的接头连接器后,您需要配置引脚复用器并激活PWM。上面提到的处理器引用手册中对此有说明。大多数系统在引导加载程序
board_init()
(假定为U-boot)中进行此配置,尽管在Linux引导后也可以通过一些mmap
技巧在用户空间中完成此配置。最后,您需要在
platform-mxc_pwm.c
中基于PWM模块的接口(interface)编写驱动程序。如果您使用的是i.MX23 EVK 10.05,则可以修改LED PWM驱动器,因为它已在引导加载程序和内核级别进行了配置,并将您的设备连接到LED输出而不是LED。 (您将需要硬件技术人员来帮助您。)请确保使用CONFIG_LEDS_MXS配置内核。
上面关于实现的评论有些投机,因为我不知道EVK。也许知道它的人可以对此进行改进。
更新2013年9月21日
用i.MX23或具有类似ARM CPU内核的任何SoC生成37kHz信号的另一种方法是使用未使用的片上定时器以所需的频率生成FIQ中断,并编写FIQ中断处理程序来切换GPIO销。 Maxime Ripard于今年4月30日在他的Free Electrons博客上发布了使用i.MX28 SoC的这种方法的complete example。要使用此方法,您将既需要一个未使用的计时器,又不能将FIQ中断用于其他目的,例如使用ARM FIQ的SPI,相机或掉电检测驱动程序之一。您还需要在ARM汇编器中编写ISR。