我现在有一个负责红外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补丁,因此我应该研究一件事,但在此之前:

  • 是否可以通过编写内核模块从内核内部驱动GPIO来获得更准确的性能?我确实需要从用户空间读取一些数据(要发送的数据),但是除此之外,我只需要在GPIO的末端触发指定频率的led即可,因此驱动程序应该非常简单。
  • 我可以强制驱动程序的优先级,以便其他任务不会中断此gpio触发吗? (数据发送目前大约需要400毫秒,而且很少完成)
  • 有没有更好的方法来创建一个中断,例如每37kHz,这样我就不会通过SW停止系统?

  • 微型 Controller 非常适合此类任务,但如果可能的话,最好避免这种开销。

    最佳答案

    “多芯片连接模式”中的i.MX23 PWM正是为此要求而设计的。

    例如,假设您使用的是24Mhz时钟,则在“多芯片连接模式”中使用PWM之一。

  • MATT = 1(启用多芯片连接模式)
  • MATT_SEL = 1(用户24Mhz时钟)
  • CDIV = 0x2(或DIV_4,即除以4)
  • INACTIVE_STATE = 0x2或0x3
  • ACTIVE_STATE = 0x3或0x2
  • PERIOD = 175(即176-1)

  • 如果使用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。

    10-04 13:41