在线时间4926 小时
UID3441752
注册时间2017-11-21
NXP金币56414
TA的每日心情 | 开心 2025-7-11 08:53 |
|---|
签到天数: 301 天 连续签到: 2 天 [LV.8]以坛为家I
管理员
  
- 积分
- 41585
- 最后登录
- 2025-12-1
|
使用 i.MX RT1010 FlexIO 来模拟低功耗状态机
1 介绍
这篇应用笔记主要介绍了如何使用 i.MX RT1010 FlexIO 模块来模拟状态机。FlexIO 模块模拟的状态机最多支持 8 种状态的跳转,每一种状态可以控制 8 个引脚作为输出,此外状态机的状态跳转是由三个可选的输入引脚决定的。该状态机可以在低功耗模式下运行,不需要 CPU 的参与。
2 硬件平台
为了演示 FlexIO 模拟的状态机例程,需要用到一块如 图1 所示的 i.MX RT1010 EVK 板子,涉及到的 FlexIO 引脚标注在图中。
i.MX RT1010 总共提供了 27 个 FlexIO 引脚,FlexIO 模拟的状态机支持 8 个状态,每个状态可以控制 8 个 FlexIO 引脚作为输出。在本文的例程中,使用 FlexIO 一共模拟了三个状态,每个状态控制三个引脚作为输出,这三个状态的跳转由三个引脚(FXIO[21],FXIO[22] and FXIO[23])的输入来确定。
表 1 列举了例程中用到的 FlexIO 引脚以及具体的位置和状态:
为了使例程能够演示起来,还需要对 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 的微体系结构。
图 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。
3.2 状态机模拟
图 4 是本应用笔记例程的一个状态机示意图。
为了实现 图 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]的值和状态跳转的关系。
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 所示。
4 总结
本应用文档介绍了 FlexIO 模块的低功耗状态机功能,并描述了 FlexIO 状态模式的详细使用方法和注意事项。 基于其低功耗特性和灵活性,用户可以脱离 CPU 的控制实现特定的功能,从而节省硬件资源。
点击查看完整版
|
|