查看: 1445|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3299

    主题

    6546

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32024
    最后登录
    2024-4-25
    发表于 2020-6-18 10:34:40 | 显示全部楼层 |阅读模式
    使用i.MX RT1010 FlexIO来模拟低功耗状态机

    介绍


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




    硬件平台


    为了演示FlexIO模拟的状态机例程,需要用到一块如下图所示的i.MX RT1010EVK板子,涉及到的FlexIO引脚标注在图中。
    1.png
    i.MX RT1010总共提供了27个FlexIO引脚,FlexIO模拟的状态机支持8个状态,每个状态可以控制8个FlexIO引脚作为输出。在本文的例程中,使用FlexIO一共模拟了三个状态,每个状态控制三个引脚作为输出,这三个状态的跳转由另外三个引脚(FXIO[21], FXIO[22] and FXIO[23])的输入来确定。



    下表列举了例程中用到的FlexIO引脚以及具体的位置和状态:
    2.png
    为了进行例程演示,需要对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的微体系结构。
    3.png
    图中总体上显示了状态机的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。
    4.png
    2. 状态机模拟

    下图是本例程的状态机示意图。
    5.png
    为了实现图所示的状态机,需要配置以下寄存器。


    将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]的值和状态跳转的关系。
    6.png
    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加油站

    签到签到
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-26 02:51 , Processed in 0.115400 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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