不会 SCT,你还当什么 RD!

 一、SCT 概述
      SCT :状态可配置定时器(State Configurable Timer),状态可配置定时器是恩智浦半导体特有的一种外设。它可像大多数传统定时器一样工作,但添加了一个硬件有限状态机,从而提供更高水平的可配置性和控制度。这允许将 SCT 配置为多个 PWM、带死区控制的 PWM、带重置功能的 PWM 以及传统计时器无法复制的多种其他配置。除非使能了需要内核来服务的 SCTimer/PWM 中断,否则配置好 SCTimer/PWM 后,它就可以自主从微控制器内核运行。

二、SCT 原理与框图

      SCT 主要由定时器 Timer 和硬件有限状态机引擎 State Machine 两大部分组成,图 1 左边为定时器,右边为状态机,与传统的 Timer 比较,SCT 增加了事件和状态(Event/State)的概念。

      普通定时器可以向上/向下计数(counter)、计数值重载、计数值匹配(match logic)、产生中断、DMA 触发。

      硬件有限状态机引擎可以灵活定义计数器、输出信号、中断、DMA 行为。

         

       状态机是一个由有限数量的状态 State 和这些状态之间的转移 Transition (或称之为事件 Event)及动作构成的行为模式。由状态、输入、输出、切换(事件)组成。

      产生事件的条件可以是:计数器匹配、输入/输出高低电平或者上升沿下降沿

      产生事件后可以:驱动输出信号、切换状态机状态、启动/停止/禁能/限制计数器、捕获当前计数值、产生中断或者 DMA 请求。

      状态机是基于事件的数学模型,有事件才会有状态机,其转化过程如下图 2:

         
三、SCT 定时器特性

3.1 SCT 内部资源与特性
         

      输入信号: 4 路,输入源可以是芯片内部信号或者外部引脚,如 SCT 输入信号连接模拟比较器输出或者 ADC 阈值比较输出。

      输出信号: 6 路,可以像输入信号一样作为事件产生的条件,可以连接到片内其他模块,比如作为 ADC 触发信号,或者连接到片外引脚

      捕获/比较寄存器:8 个,Match 和 Capture 寄存器共享,灵活选择使用 Match 或者 Capture 模式,

      事件:8 个,Match 事件或者 Input / Output toggle 事件触发。

      状态: 8 个。

      Counter 特性
          A. 可以配置为 2 个 16-bit 或者 1 个 32-bit 计数器
          B. Counter 可以由系统时钟或者外部输入驱动
          C. 可以设置为单一向上计数或者 up-dow
          D. 数量可配置的匹配寄存器和捕获寄存器。总共 5 个匹配和捕获寄存器。
          E. 匹配或输入或输出转换时触发以下事件:中断;停止、限制、挂起定时器或改变
          F. 计数方向;切换输出;改变状态。
          G. 计数器值可以载入捕获寄存器,由匹配或输入 / 输出切换触发。

 

      事件创建特性:
          A.
以下条件定义了一次事件:计数器匹配条件、输入 (或输出)条件 (如上升沿或下降沿或电平)、匹配和 / 或输入 / 输出条件组合。
          B. 所选事件可以限制、挂起、启动或停止计数器操作,或者改变其方向。事件触发状态改变、输出切换、中断和 DMA 事务。
          C. 匹配寄存器 0 可用作自动限值。
          D. 在双向模式中,事件可以根据计数方向使能。
          E. 可以保持匹配事件,直至发生另一个符合条件的事件。

 

3.2 SCT 输入/输出信号

      SCT 输入/输出信号框图如图 3:
         


      A. SCT 输入信号片内连接设置

      首先设置 Input Mux 外设寄存器,分别选择四个输入信号连接片内其他模块信号或者片外引脚
      //设置 SCT_INPUT0 信号连接到 SCT_PIN0 功能
      Chip_INMUX_SetSCTInMux(LPC_INMUX, SCT_INMUX_0,SCT_INP_IN0);
         
      B. SCT 输入信号片外连接设置

          如果将 SCT 输入信号连接到 SCT_PINx 信号,还需配置 Switch
          Matrix 引脚分配寄存器 PINASSIGN[6:7] 连接到片外引脚
          //设置 SCT_PIN0 到 P0_0 脚,如图绿色线
          Chip_SWM_MovablePinAssign(SWM_SCT_IN0_I, 0);
          

      C. SCT 输出信号片外连接设置

          需配置 Switch Matrix 引脚分配寄存器 PINASSIGN[7:9],连接到片外引脚
          //设置 SCT_OUT0 到 P0_0 脚,绿色线
          Chip_SWM_MovablePinAssign(SWM_SCT_OUT0_O, 0);
         

      D. SCT 输出信号片内连接设置

          SCT_OUT3 还可以连接到 ADC 的 ADC_trigger 信号,触发 ADC 采样序列
          通过设置 ADC 转换序列寄存器 SEQ[A:B]_CTRL,来选择触发源
          Chip_ADC_SetSequencerBits(LPC_ADC, ADC_SEQA_IDX, (3 <<12));

         
         

四、SCT 状态机 State Machine

4.1 状态 (State)

      状态存储过去的信息,反映从系统开始到现在时刻的输入变化,其存储在 SCT 的状态寄存器中,状态寄存器的值反映了状态机的当前状态。

          

4.2 事件 (Event)

     事件是状态机从一个状态向下一个状态变化的过程,该过程需要系统满足一定的触发条件才会开始,同时在该过程中还会触发一系列的动作。


                       

4.3 事件触发

      事件触发定义主要通过事件控制寄存器 EV[0:7]_CTRL 和事件使能寄存器 EV[0:7]_STATE 设置。八个事件分别对应八个控制寄存器和八个使能寄存器。

      计数器及计数匹配条件:

         

      输入\输出信号条件:

         

4.4 事件动作

      SCT 所有的动作都由事件来驱动,是事件的输出结果,

      SCT 事件驱动列表及对应的设置寄存器如下:
          

4.4.1   SCT 输出信号

      SCT 模块共有 6 个输出信号 SCT_Out[0:5],每个输出信号对应一组输出控制寄存器 OUT[0:5]_SET 和 OUT[0:5]_CLR,分别设置输出信号的置位和清零。
          

4.4.2   SCT 状态值更新

      事件触发时可以产生对当前 SCT 状态的更新,进行状态变换。
      SCT 状态寄存器 STATE 记录当前的 SCT 状态值,SCT 事件控制寄存器 EV[0:7]_CTRL 设置事件触发时对状态值的更新方式。
         

4.4.3   SCT 中断产生

      设置 SCT 事件中断使能寄存器 EVEN,可以产生事件触发中断。
         

4.4.4   SCT 计数器捕获

      事件触发时可以产生对 SCT计数器的捕获功能,设置 SCT 捕获控制寄存器 CAPCTRL[0:7]。
         

4.4.4   SCT 计数器控制

      事件触发时可以控制计数器的计数方向、计数清零、 启动、停止或者禁能。
         

      如果要对计数器进行清零或者反向控制,可以根据事件编号设置LIMIT寄存器对应的位。
         

五、SCT 实例分析

5.1 要求

      要求:输出两路占空比分别为 50% 和 20% 频率为 10KHZ 的 PWM 波形。

 

5.2 配置

      SCT 输出设置:SCT OUT2 信号连接到 GPIO P0_28, SCT OUT4 信号连接到 GPIO P0_16,

       /* SCT_OUT2 connect to P0_28 */

          SWM_SetMovablePinSelect(SWM0, kSWM_SCT_OUT2, kSWM_PortPin_P0_28);

 

          /* SCT_OUT4 connect to P0_16 */

          SWM_SetMovablePinSelect(SWM0, kSWM_SCT_OUT4, kSWM_PortPin_P0_16);

 

      SCT 配置:

      /* Initialize SCTimer module */

      SCTIMER_Init(SCT0, &sctimerInfo);

      /* Configure first PWM with frequency 10000HZ from first output */

      pwmParam.output           = kSCTIMER_Out_4;

      pwmParam.level            = kSCTIMER_HighTrue;

      pwmParam.dutyCyclePercent = 50;

      SCTIMER_SetupPwm(SCT0, &pwmParam, kSCTIMER_EdgeAlignedPwm,10000U,sctimerClock,&event)

      /* Configure second PWM with different duty cycle but same frequency as before */

      pwmParam.output           = kSCTIMER_Out_2;

      pwmParam.level            = kSCTIMER_HighTrue;

      pwmParam.dutyCyclePercent = 20;

      SCTIMER_SetupPwm(SCT0,&pwmParam,kSCTIMER_EdgeAlignedPwm,10000U,sctimerClock,&event)

      /* Start the timer */

      SCTIMER_StartTimer(SCT0, kSCTIMER_Counter_L);

5.3 运行波形图

      黄色探头为 SCT_OUT4 在 P0_16 上的信号

      蓝色探头为 SCT_OUT2 在 P0_28 上的信号

         

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论