在线时间5107 小时
UID3441752
注册时间2017-11-21
NXP金币1101794
TA的每日心情 | 开心 2025-7-11 08:53 |
|---|
签到天数: 301 天 连续签到: 2 天 [LV.8]以坛为家I
管理员
  
- 积分
- 43324
- 最后登录
- 2026-4-3
|
使用i.MX RT1010 FlexIO来模拟低功耗状态机
介绍
本文主要介绍如何使用i.MX RT1010 FlexIO模块来模拟状态机。
FlexIO模块模拟的状态机最多支持8种状态的跳转,每一种状态可以控制8个引脚作为输出,此外状态机的状态跳转是由三个可选的输入引脚决定的。该状态机可以在低功耗模式下运行,不需要CPU的参与。
硬件平台
为了演示FlexIO模拟的状态机例程,需要用到一块如下图所示的i.MX RT1010EVK板子,涉及到的FlexIO引脚标注在图中。
i.MX RT1010总共提供了27个FlexIO引脚,FlexIO模拟的状态机支持8个状态,每个状态可以控制8个FlexIO引脚作为输出。在本文的例程中,使用FlexIO一共模拟了三个状态,每个状态控制三个引脚作为输出,这三个状态的跳转由另外三个引脚(FXIO[21], FXIO[22] and FXIO[23])的输入来确定。
下表列举了例程中用到的FlexIO引脚以及具体的位置和状态:
为了进行例程演示,需要对RT1010 EVK板子做以下改动:
将电阻R792去掉,再用0欧姆电阻焊接上R800。
去掉跳帽J31和跳帽J32,去掉电阻 R237和R236。
确保GPIO_AD_11接地。
将USB插到J41进行供电。
FlexIO状态机模拟
1. 状态模式简介
FlexIO模块的Shifter提供6种工作模式,本文重点介绍其状态模式。
状态模式的设置是由寄存器FLEXIOx_SHIFTCTLn的SMOD位决定的,将其写入0x6设置成状态模式。FlexIO的状态模式最多提供8个状态,该特性允许状态机的运行不需要CPU的参与,并且在低功耗模式下得以保留。下图详细展示了Shifter的微体系结构。
图中总体上显示了状态机的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。
2. 状态机模拟
下图是本例程的状态机示意图。
为了实现图所示的状态机,需要配置以下寄存器。
将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
下图显示了SHIFTBUF[2:0]的值和状态跳转的关系。
Shifter0,Shifter1,Shifter2使用Timer0作为触发源。Timer0被配置为16位计数器模式,一直使能且永不复位。Timer0的递减源为FlexIO时钟。
FlEXIO01.TIMCTL[0] =0x00000003
FlEXIO01.TIMCMP[0]= 0x0000176F
3. 低功耗和时钟
FlexIO状态机可以保持在低功耗模式,本文以wait mode为例,有两个注意点:
1.进入低功耗模式时,确保FlexIO时钟使能,FlexIO的DOZEN清零,则FlexIO应该保持功能正常。
2.将寄存器CCM_CCGR5的CG1设置为0x3,这就确保了在除了STOP模式之外,FlexIO时钟都能被使能。
4. 例程演示
在本文例程中,当FXIO[23:21]的输入值为011时,FlexIO模块驱动在FXIO[2]引脚上驱动频率为FLEXIO_CLK / 12000方波输出,如下图所示。
总结
本文介绍了FlexIO模块的低功耗状态机功能,并描述了FlexIO状态模式的详细使用方法和注意事项。基于其低功耗特性和灵活性,用户可以脱离CPU的控制实现特定的功能,从而节省硬件资源。
文章出处:恩智浦MCU加油站
|
|