查看: 3003|回复: 11

[求助] SCT 的输入设置( LPC845MAX 开发板)

[复制链接]
  • TA的每日心情
    擦汗
    2021-3-24 09:39
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    12

    主题

    94

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    299
    最后登录
    2021-12-28
    发表于 2020-11-11 16:59:59 | 显示全部楼层 |阅读模式
    最近有一个应用觉得 SCT 很合适,特购买开发板一块用于评估 SCT 模块

    1. 将 CLKOUT 输出一个 100KHz 的信号到 P0_21 (示波器可测量到)
    2. 将 P0_20 作为 SCT_PIN0 并 路由到 SCT_INMUX 0
    3. 设置 SCT_OUT0 为测试输出(通过单纯 MATCH 两个数值设置输出电瓶)(示波器可测量到)
    4. 设置 SCT_OUT1 作为测试输出(捕捉 IN0 的下降沿设置0, 捕捉 IN0 的上升沿设置 1)(示波器无法测量到,改为MATCH事件触发后正常)
    5. 将 SCT_IN0 作为时钟也不行(不论是采样或异步模式),设置后,SCT就彻底不工作了
    想不到问题出在哪,特来求助各位大佬,
    -------------------------------------------------------------------------------------------------------------------------------------------
    SCT 部分的初始化如下:
    const sctimer_config_t SCT0_initConfig = {
      .enableCounterUnify = true,
      .clockMode = kSCTIMER_System_ClockMode,
      .clockSelect = kSCTIMER_Clock_On_Rise_Input_0,
      .enableBidirection_l = false,
      .enableBidirection_h = false,
      .prescale_l = 0U,
      .prescale_h = 0U,
      .outInitState = (uint8_t)(0),
      .inputsync = 1 << 0U
    };
    uint32_t SCT0_event[5];

    static void SCT0_init(void)
    {
      SCTIMER_Init(SCT0, &SCT0_initConfig);
      /* Initialization of state 0 */
      SCTIMER_CreateAndScheduleEvent(SCT0, kSCTIMER_MatchEventOnly, 1, kSCTIMER_Out_0, kSCTIMER_Counter_U, &SCT0_event[0]);
      SCTIMER_SetupOutputClearAction(SCT0, kSCTIMER_Out_0, SCT0_event[0]);

      SCTIMER_CreateAndScheduleEvent(SCT0, kSCTIMER_MatchEventOnly, 6, kSCTIMER_Out_0, kSCTIMER_Counter_U, &SCT0_event[1]);
      SCTIMER_SetupOutputSetAction(SCT0, kSCTIMER_Out_0, SCT0_event[1]);

      SCTIMER_CreateAndScheduleEvent(SCT0, kSCTIMER_MatchEventOnly, 16, kSCTIMER_Out_0, kSCTIMER_Counter_U, &SCT0_event[2]);
      SCTIMER_SetupCounterLimitAction(SCT0, kSCTIMER_Counter_U, SCT0_event[2]);

      SCTIMER_CreateAndScheduleEvent(SCT0, kSCTIMER_InputFallEvent, 0, kSCTIMER_Input_0, kSCTIMER_Counter_U, &SCT0_event[3]);
      SCTIMER_SetupOutputClearAction(SCT0, kSCTIMER_Out_1, SCT0_event[3]);

      SCTIMER_CreateAndScheduleEvent(SCT0, kSCTIMER_InputRiseEvent, 0, kSCTIMER_Input_0, kSCTIMER_Counter_U, &SCT0_event[4]);
      SCTIMER_SetupOutputSetAction(SCT0, kSCTIMER_Out_1, SCT0_event[4]);

      SCTIMER_StartTimer(SCT0, kSCTIMER_Counter_U);
    }

    IO 部分的初始化如下
    void BOARD_InitPins(void)
    {
        /* Enables clock for IOCON.: enable */
        CLOCK_EnableClock(kCLOCK_Iocon);
        /* Enables clock for switch matrix.: enable */
        CLOCK_EnableClock(kCLOCK_Swm);
        /* SCT_PIN0. Assign to pin using the switch matrix 0 */
        INPUTMUX_AttachSignal(INPUTMUX, 0U, kINPUTMUX_SctPin0ToSct0);

        const uint32_t DEBUG_UART_RX = (/* Selects pull-up function */
                                        IOCON_PIO_MODE_PULLUP |
                                        /* Enable hysteresis */
                                        IOCON_PIO_HYS_EN |
                                        /* Input not invert */
                                        IOCON_PIO_INV_DI |
                                        /* Disables Open-drain function */
                                        IOCON_PIO_OD_DI |
                                        /* Bypass input filter */
                                        IOCON_PIO_SMODE_BYPASS |
                                        /* IOCONCLKDIV0 */
                                        IOCON_PIO_CLKDIV0);
        /* PIO1 PIN16 (coords: 36) is configured as USART0, RXD. */
        IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_16, DEBUG_UART_RX);

        const uint32_t DEBUG_UART_TX = (/* Selects pull-up function */
                                        IOCON_PIO_MODE_PULLUP |
                                        /* Enable hysteresis */
                                        IOCON_PIO_HYS_EN |
                                        /* Input not invert */
                                        IOCON_PIO_INV_DI |
                                        /* Disables Open-drain function */
                                        IOCON_PIO_OD_DI |
                                        /* Bypass input filter */
                                        IOCON_PIO_SMODE_BYPASS |
                                        /* IOCONCLKDIV0 */
                                        IOCON_PIO_CLKDIV0);
        /* PIO1 PIN17 (coords: 37) is configured as USART0, TXD. */
        IOCON_PinMuxSet(IOCON, IOCON_INDEX_PIO1_17, DEBUG_UART_TX);

        /* USART0_TXD connect to P1_17 */
        SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P1_17);

        /* USART0_RXD connect to P1_16 */
        SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P1_16);

        /* CLKOUT connect to P0_21 */
        SWM_SetMovablePinSelect(SWM0, kSWM_CLKOUT, kSWM_PortPin_P0_21);

        /* SCT_PIN0 connect to P0_20 */
        SWM_SetMovablePinSelect(SWM0, kSWM_SCT_PIN0, kSWM_PortPin_P0_20);

        /* SCT_OUT0 connect to P1_21 */
        SWM_SetMovablePinSelect(SWM0, kSWM_SCT_OUT0, kSWM_PortPin_P1_21);

        /* SCT_OUT1 connect to P1_20 */
        SWM_SetMovablePinSelect(SWM0, kSWM_SCT_OUT1, kSWM_PortPin_P1_20);

        /* Disable clock for switch matrix. */
        CLOCK_DisableClock(kCLOCK_Swm);

    }

    最佳答案

    请问您想使用SCT实现什么功能?这里有一个SCT 的cookbook, 你可以先参看: https://www.nxp.com.cn/docs/en/application-note/AN11538.zip 彻底不工作? 你可以打断点和但不执行缩小不工作的范围,定位到底是哪里 ...
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-3-24 09:39
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    12

    主题

    94

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    299
    最后登录
    2021-12-28
     楼主| 发表于 2020-11-11 17:04:54 | 显示全部楼层
    补充一下: P0_20 和 P0_21 我用跳线短路了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20028
    最后登录
    2024-4-26
    发表于 2020-11-12 11:36:55 | 显示全部楼层
    请问您想使用SCT实现什么功能?这里有一个SCT 的cookbook, 你可以先参看:
    https://www.nxp.com.cn/docs/en/application-note/AN11538.zip

    彻底不工作?
    你可以打断点和但不执行缩小不工作的范围,定位到底是哪里出问题了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-3-24 09:39
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    12

    主题

    94

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    299
    最后登录
    2021-12-28
     楼主| 发表于 2020-11-12 12:46:53 | 显示全部楼层
    本帖最后由 tony2k20 于 2020-11-12 12:48 编辑

    非常感谢版主的回复, AN11538 我已经看了一下,因为 SCT 的机制是纯硬件的,软件都是设置寄存器的工作, SCT 在 system_clock 的模式下能够工作,并且 match 事件是可以工作的, 但是 input 事件就无法产生了, 在其他的 时钟模式下(把input作为时钟的一部分),SCT就不工作了,甚至在 异步 模式下, MCUXpresso IDE 在 debug 时, debug probe 都无法检测到 LPC845, 我用 ISP 模式把 FLASH 给清了以后, IDE 才又开始工作,感觉是 输入路由的问题, 但是 所有的 输入和输出 都是通过 config_tool 生成的
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-3-24 09:39
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    12

    主题

    94

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    299
    最后登录
    2021-12-28
     楼主| 发表于 2020-11-12 15:09:48 | 显示全部楼层
    做了一个测试:用 EV[3] 和 EV[4] 捕捉 SCT_IN4 (SCT_CLK) 并输出,能够正常输出。看来问题还是出在输入管脚的配置上
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-3-24 09:39
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    12

    主题

    94

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    299
    最后登录
    2021-12-28
     楼主| 发表于 2020-11-13 10:30:06 | 显示全部楼层
    终于定位到问题了,为了减少工作量,我使用IDE 中SDK的配置工具产生管脚MUX以及输入MUX的代码,为了方便修改,用独立的 MCUXpresso Config Tools 生成 SCT 的代码,然后把它COPY到现有工程中

    然后少了一项工作就是在main函数中 INPUTMUX_Init(INPUTMUX),将对应的时钟使能就可以正常工作了! -_-
    感觉 inputmux 应该是多路器加触发器的构造,不给时钟是无法正常设置或工作的....
    ---------------------------------------------------------------------------------------------------------------------------------------------------------
    说说此次评估过程的心得:
    SCT 几乎就是一个万能的时序发生器(LPC845支持的事件和状态以及IO如果再多一些就好了)


    加上 芯片本身 CLKOUT 可以输出同步时钟, SCT 可以基于 CLKOUT 输出任意的时序控制信号,例如使能,清零等信号,还可以采集信号特征
    优势在于,边沿的延时可控, 能够准确采集多种信号特征,最重要的是输出驱动信号时没有软件的开销
    通过 SCT 可以完成很多外设芯片的通讯协议


    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    20028
    最后登录
    2024-4-26
    发表于 2020-11-13 14:23:41 | 显示全部楼层
    tony2k20 发表于 2020-11-13 10:30
    终于定位到问题了,为了减少工作量,我使用IDE 中SDK的配置工具产生管脚MUX以及输入MUX的代码,为了方便修 ...

    感谢分享。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-7-5 15:45
  • 签到天数: 664 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5382
    最后登录
    2021-12-22
    发表于 2020-11-16 11:09:02 | 显示全部楼层
    本帖最后由 okwh 于 2020-11-17 10:00 编辑

    SCT 状态可配置的定时器, 换句话说 以设置配置硬件为主和状态机和计数器的联合使用,涉及时钟源,输入、输出+相关配置的寄存器, 编程要注意步骤:初始化,多事件捕获匹配、触发及其顺序、间隔、循环关系。调试有些复杂, 学习期间先把标准例子走通为好。
    SCT是我最欣赏NXP的芯片功能之一。

    顺便请教: 如何实现 步进计时的计数器,目前计数器基本上是等间隔计数触发等时间间隔中断, 如何实现以步进时间间隔中断呢? 比如实现 1 , 2, 3 ,4.....这样的时间间隔 产生中断....(虽然在中断中记录比较中断次数, 也算一种实现,只是.....)

    或者说 我希望 [size=18.6667px]计数值重载、进行下一个计数时段时,这个计数值可设为新数,而不仅仅是使用一个相同数。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    35

    主题

    356

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2574
    最后登录
    2023-6-23
    发表于 2020-11-17 18:14:42 | 显示全部楼层
    okwh 发表于 2020-11-16 11:09
    SCT 状态可配置的定时器, 换句话说 以设置配置硬件为主和状态机和计数器的联合使用,涉及时钟源,输入、输 ...

    每个MATCH寄存器都有一个Reload寄存器,只要写入这个Reload寄存器,就可以在下一个计数时段使用新的数值了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-7-5 15:45
  • 签到天数: 664 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5382
    最后登录
    2021-12-22
    发表于 2020-11-23 18:37:46 | 显示全部楼层
    本帖最后由 okwh 于 2020-11-23 18:39 编辑
    香水橙 发表于 2020-11-17 18:14
    每个MATCH寄存器都有一个Reload寄存器,只要写入这个Reload寄存器,就可以在下一个计数时段使用新的数值 ...

    只要写入这个Reload寄存器,

    我想要的是,每次reload时把那个数加1比如,
    就是说 那个reload 要在每次计数循环都要重写一个数, 这怎么做?

    通常,计数到达,产生中断,同时就reload已写好的数开始新循环。 我需要每次新循环前能有机会新写一个数再reload.
    就是产生个半周期时长不断步进的方波 !
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-26 13:36 , Processed in 0.157432 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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