查看: 5825|回复: 0

[分享] 使用 i.MX RT1010 FlexIO 来模拟低功耗状态机

[复制链接]
  • TA的每日心情
    开心
    2025-7-11 08:53
  • 签到天数: 301 天

    连续签到: 2 天

    [LV.8]以坛为家I

    3918

    主题

    7536

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    39903
    最后登录
    2025-8-19
    发表于 2020-5-20 14:25:32 | 显示全部楼层 |阅读模式
    使用 i.MX RT1010 FlexIO 来模拟低功耗状态机


    1 介绍
    这篇应用笔记主要介绍了如何使用 i.MX RT1010 FlexIO 模块来模拟状态机。FlexIO 模块模拟的状态机最多支持 8 种状态的跳转,每一种状态可以控制 8 个引脚作为输出,此外状态机的状态跳转是由三个可选的输入引脚决定的。该状态机可以在低功耗模式下运行,不需要 CPU 的参与。


    2 硬件平台
    为了演示 FlexIO 模拟的状态机例程,需要用到一块如 图1 所示的 i.MX RT1010 EVK 板子,涉及到的 FlexIO 引脚标注在图中。
    1.png
    i.MX RT1010 总共提供了 27 个 FlexIO 引脚,FlexIO 模拟的状态机支持 8 个状态,每个状态可以控制 8 个 FlexIO 引脚作为输出。在本文的例程中,使用 FlexIO 一共模拟了三个状态,每个状态控制三个引脚作为输出,这三个状态的跳转由三个引脚(FXIO[21],FXIO[22] and FXIO[23])的输入来确定。
    表 1 列举了例程中用到的 FlexIO 引脚以及具体的位置和状态:
    2.png
    3.png
    为了使例程能够演示起来,还需要对 RT1010 EVK 板子做以下改动:
    • 将电阻 R792 去掉,在用 0 欧姆电阻焊接上 R800。
    • 去掉跳帽 J31 和跳帽 J32,去掉电阻 R237 和 R236。
    • 确保 GPIO_AD_11 接地。
    • 将 USB 插到 J41 进行供电。


    3 FlexIO 状态机模拟
    3.1 状态模式简介
    FlexIO 模块的 Shifter 提供 6 种工作模式,本应用笔记重点介绍其状态模式。状态模式的设置是由寄存器 FLEXIOx_SHIFTCTLn的 SMOD 位决定的,将其写入 0x6 设置成状态模式。 FlexIO 的状态模式最多提供 8 个状态,该特性允许状态机的运行不需要CPU 的参与,并且在低功耗模式下得以保留。图 2 详细展示了 Shifter 的微体系结构。
    4.png

    图 3 总体上显示了状态机的 I/O 分配情况。 通过设置寄存器 FLEXIOx.SHIFTCTLn 的 PINSEL,用户可以选择三个连续的FlexIO 引脚作为状态机的控制输入。 状态机的下一状态和移位器的低三位相关,每个状态有八个可配置的输出,并分配给了FlexIO 引脚 FXIO [0] -FXIO [7]。 通过设置 FLEXIOx.SHIFTCFGn 寄存器的 PWIDTH [3:0],SSTOP [1:0]和 SSTART [1:0],可以启用或禁用 FXIO [0] -FXIO [7]这 8 个引脚,启动的情况下,还应将 FLEXIOx.SHIFTCTLn 寄存器的 PINCFG 配置为output。

    5.png

    3.2 状态机模拟
    图 4 是本应用笔记例程的一个状态机示意图。

    6.png

    为了实现 图 4 所示的状态机,需要配置以下寄存器。
    将 FLEXIO01.SHIFTCTL [2:0]的 PINCFG 设置为 0x03,使能 Shifter 引脚(FXIO [0],FXIO [1],FXIO [2])。 将FLEXIO01.SHIFTCTL [2:0]的 PINSEL 设置为 0x15,选择 FXIO [21],FXIO [22],FXIO [23]作为状态输入控制引脚。 将FLEXIO01.SHIFTCTL [2:0]的 SMOD 设置为 0x06,使 Shifter0,Shifter1 和 Shifter2 处于状态模式。



    • FlEXIO01.SHIFTCTL[0] = 0x00831506
    • FlEXIO01.SHIFTCTL[1] = 0x00831506
    • FlEXIO01.SHIFTCTL[2] = 0x00831506
    将 FLEXIO01.SHIFTCTL [2:0]的 PWIDTH [3:0]设置为 0xF,禁用 FXIO [7:4])。 将 FLEXIO01.SHIFTCTL [2:0]的 SSTOP
    [1:0]设置为 0x2,禁用 FXIO [3]输出并启用 FXIO [2]输出。 将 FLEXIO01.SHIFTCTL [2:0]的 SSTART [1:0]设置为 0x0,启
    用 FXIO [1:0]作为输出。
    • FlEXIO01.SHIFTCFG[0] = 0x000F0020
    • FlEXIO01.SHIFTCFG[1] = 0x000F0020
    • FlEXIO01.SHIFTCFG[2] = 0x000F0020
    在状态模式下,寄存器 FLEXIOx.SHIFTSTATE 包含了状态机当前的状态值, 默认情况下(重置后)为 0x0。当状态机正确启动后,FLEXIOx.SHIFTSTATE 指向当前状态,该状态由寄存器 FLEXIOx.SHIFTERBUFn 的值定义的。 它的 32 位值包含当前状态输出(FLEXIOx.SHIFTBUFF [31:24])和下一个状态(FLEXIOx.SHIFTBUF [23:0])的值。 FLEXIOx.SHIFTBUF 的低 24 位包含 8 个组,每个组包括 3 位, 这 3 位定义了根据输入组合选择的下一个状态的值。 例如,如果输入组合为 000,则FLEXIOx.SHIFTBUF [2:0]位定义的值表示要跳转的下一个状态。
    • FlEXIO01.SHIFTBUF[0] = 0x00208208
    • FlEXIO01.SHIFTBUF[1] = 0x02408408
    • FlEXIO01.SHIFTBUF[2] = 0x06249249
    图 5 显示了 SHIFTBUF [2:0]的值和状态跳转的关系。

    7.png

    Shifter0,Shifter1,Shifter2 使用 Timer0 作为触发源。 Timer0 被配置为 16 位计数器模式,一直使能且永不复位。 Timer0 的递
    减源为 FlexIO 时钟。
    • FlEXIO01.TIMCTL[0] = 0x00000003
    • FlEXIO01.TIMCMP[0] = 0x0000176F



    3.3 低功耗和时钟
    FlexIO 状态机可以保持在低功耗模式,本文以 wait mode 为例,有两个注意点:
    1. 进入低功耗模式时,确保 FlexIO 时钟使能,FlexIO 的 DOZEN 清零,则 FlexIO 应该保持功能正常。
    2. 将寄存器 CCM_CCGR5 的 CG1 设置为 0x3,这就确保了在除了 STOP 模式之外,FlexIO 时钟都能被使能。

    3.4 例程演示
    在本文例程中,当 FXIO [23:21]的输入值为 011 时,FlexIO 模块驱动在 FXIO [2]引脚上驱动频率为 FLEXIO_CLK/12000 方波输出,如 图 6 所示。

    8.png

    4 总结
    本应用文档介绍了 FlexIO 模块的低功耗状态机功能,并描述了 FlexIO 状态模式的详细使用方法和注意事项。 基于其低功耗特性和灵活性,用户可以脱离 CPU 的控制实现特定的功能,从而节省硬件资源。


    点击查看完整版

    qiandao qiandao
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-20 05:57 , Processed in 0.113505 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表