This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TM4C123GH6PM:MHz 开关 GPIO

Guru**** 2478765 points
Other Parts Discussed in Thread: ENERGIA

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/693501/ccs-tm4c123gh6pm-mhz-switching-gpio

器件型号:TM4C123GH6PM
主题中讨论的其他器件:EnergiaTM4C123

工具/软件:Code Composer Studio

我正在尝试使用 TM4C123G Tiva LaunchPad 来驱动 CCD、目的是开发用于科学教育的开源光谱仪。  CCD 应输出一系列随光强度和曝光时间而变化的电压。  虽然 CCD 应该根据微控制器的信号序列提供输出、但我的输出没有随光或时间的变化、只是使用示波器测量的直流电压。 我怀疑这个问题可能是由于我的信号序列时序的不受控制的延迟引起的。 如果对这一问题有任何建议或见解,将不胜感激。  如果这是由于微控制器的物理限制造成的、那么这些信息也会很有用。
CCD 数据表显示、它需要一个运行频率介于0.8MHz 和2.4MHz 之间的时钟。  另外两个引脚(ICG 和 SH)必须在采集开始和结束时与时钟同步。  时序要求在以下位置进行了说明: tcd1304.wordpress.com/.../。   此处的图中显示了预期输出: tcd1304.wordpress.com/.../。   直到最近、我对 LaunchPad 进行编码的经验一直局限于 Energia IDE。 对于该项目、我学习使用 Code Composer Studio、主要通过在 Tiva 实验课程之后进行学习。  我最初尝试使用计时器中断来运行时钟(如实验2中所述)、但中断似乎会引入限制时钟速度的延迟。  我有一个使用两种交替方法的简化代码:StartSequence 方法和时钟方法。  最后、我需要在时钟方法期间整合 ADC 测量、但现在我只是尝试清理 LaunchPad 输出时序。 时钟方法只会切换 PF1引脚。  它最终将执行此操作数毫秒。 为了获得对称方波、我将时钟周期低电平期间的2个系统时钟周期延迟设置为高电平和低电平时间、每个时钟周期为~450ns (用示波器测量)。 StartSequence 方法在高电平和低电平状态之间切换 PF2和 PF3上的 ICG 和 SH 设置。  ICG 随着时钟变为高电平而变为低电平、然后200ns 后、SH 变为高电平。  三个时钟周期后、SH 返回低电平。  然后、在另外三个时钟周期后、ICG 返回高电平。  之后、StartSequence 方法结束、代码返回到时钟方法。
更改方法(即保留时钟以进入 StartSequence)会引入~150ns 的延迟。  如果不增加超过~350ns 的延迟、我也无法按顺序更改 ICG 和 SH 脉冲的状态。

我的系统控制时钟设置(如下所示)应该为我提供100MHz 或100ns 的周期。
   SysCtlClockSet (SYSCTL_SYSDIV_2|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);

感谢你的帮助。

插孔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的 TM4C123 'TOPS OUT'@ 80MHz -因此您的代码行必须将'SYSDIV_2'替换为'SYSDIV_2.5'。

    在采用具有"PWM 模式"的定时器时、会发生最高 GPIO 切换速率。 您可以同步多个计时器、这似乎值得调查...

    有一些 Cortex M4 MCU 以180MHz 及更高的频率运行(有助于您的工作)-但我认为、小型、经济实惠的"CPLD "(或小型 FPGA)可"最适合"您的任务。

    与往常一样、您对"商业上成功的器件如何发挥其魔力"的评论一定会提供很好的见解...   (除非他们采用了"一体、定制 IC"。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 CB1_MOBILE。 我将研究 PWM 问题。
    我尝试用 SYSDIV_2.5替换 SYSDIV_2。 代码不会使用此代码进行编译。 SYSDIV_2实际上会被2.5分频。 我想我可以做一些实验来找出答案。
    插孔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这证明了(最令人惊讶的)(和令人沮丧的)、除非我再次进行了幻觉-'SYSDIV_2.5'已经'long'个已知的合法参数值。    实现80MHz 的唯一方法!

    我的调查结果/事实 如下:

    、这是不好的- 80MHz 由于"没有小数 SYSDIV!"而漏出了这个列表    让"搜索" 通过"高级 MCU 手册"继续...

    “尤里卡”——但这是否可以——更复杂和/或困难?   (因为我在这里很长时间(但最近才逃脱)、我从未(过去)从事过这种(要求苛刻)不直接的行为!)

    您最好自己阅读/回顾 MCU 手册、这样您就可以更轻松地"开始时、更容易获得66.67MHz 的值。"   (从顶部的图表中)

    中央人民民主联盟的建议是,"获得优势"。 不是吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果我可以步入... 我认为问题只是使用的一个例子。 与 A _

    SYSCTL_SYSDIV_2.5未在 TivaWare 中定义、但 SYSCTL_SYSDIV_2_5为。

    请尝试使用 Jack、您会看到 CB1在他所介绍的内容中是准确的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这就是、从过去的 WA2/DL4中选择"数字-数字"。

    在撰写之前、您可能会注意到-我(认真)检查了。   

    我也检查了 sysctl.c 文件- AWOL -以及...   这不是很好-是吗?

    请注意,SYSDIV 的所有(预期)整数值...  已被识别!    这里有一些改变-这是我的信念...

     SYSCTL_SYSDIV_2_5 在 sysctl.h 中确实出现 - 但它的所有"整数兄弟"在更有可能的 、读者可访问/友好的场所中显示-这(再次)不是很好!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这更有意义(也会编译)。 感谢 Ralph 和 CB1。
    插孔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1、

    这是由 C 代码的一般工作方式造成的。 不能在独立变量名称中使用句点、因为它是结构的成员访问运算符。 因此、常见的编码做法是将变量中的任何点替换为像空格一样的下划线。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我意识到 Ralph -但在正常/习惯用户手册中没有(轻松)提及"SYSCTL_SYSDIV_2_5"-用户如何(任何)找到该参数。 您将注意到我确实(最终找到它)-但"搜索已用尽"-错过了'_5'。

    如上所述(此处所示)-在 T-Ware 下-"RL 用户指南" 和 "sysctl.c"(完全)避免提及2_5 - 这似乎是一种"重要"的监督-它不是吗?    我本来不打算再回来了,但是从(通常的、已公布的消息来源)那里了解到这张海报的斗争,以及缺乏真正(适当)的指导,感觉不得不提供帮助...

    还应注意的是、(很久以前) StellarisWare 9107中的'sysctl.c''half-Dividers'进行了"清晰的提及"、正如此复制/粘贴所示:

    //! 设置器件的时钟。
    //!
    //! \param ulConfig 是器件计时的所需配置。
    //!
    //! 此函数用于配置器件的时钟。 输入晶振
    //! 频率、要使用的振荡器、PLL 的使用和系统时钟
    //! 分频器都使用此功能进行配置。
    //!
    //! ulConfig 参数是多个不同值的逻辑 OR、
    //! 其中许多被分组成一组、只能在其中选择一个。
    //!
    //! 系统时钟分频器的选择值如下:
    //! b SYSCTL_SYSDIV_1、\b SYSCTL_SYSDIV_2、\b SYSCTL_SYSDIV_3、...
    //! b SYSCTL_SYSDIV_64。 仅从\b SYSCTL_SYSDIV_1到\b SYSCTL_SYSDIV_16
    //! 在 Sandstorm 级器件上有效。   半分频器、例如
    //! b SYSCTL_SYSDIV_2_5和\b SYSCTL_SYSDIV_3_5。 在 Tempest 上提供-、
    //! Firestorm 和 Blizzard 类器件。

    和- 过去展示的"半分频器"以及"始终有用/拯救外设驱动程序库(StellarisWare 9453):

    24.2.2.6 SysCtlClockSet
    设置器件的时钟。
    原型:
    无效
    SysCtlClockSet (无符号长整型 ulConfig)
    参数:
    ulConfig 是器件时钟所需的配置。
    描述:
    此函数用于配置器件的时钟。 输入晶体频率、振荡器
    PLL 和系统时钟分频器的使用都通过该函数进行配置。
    ulConfig 参数是多个不同值的逻辑 OR、其中许多值是分组的
    只能选择其中一个的设置。
    使用以下值之一选择系统时钟分频器:SYSCTL_SYSDIV_1、
    SYSCTL_SYSDIV_2、SYSCTL_SYSDIV_3、... SYSCTL_SYSDIV_64。 仅限
    SYSCTL_SYSDIV_1到 SYSCTL_SYSDIV_16在 Sandstorm 级器件上有效。
    半分频器、例如 SYSCTL_SYSDIV_2_5和 SYSCTL_SYSDIV_3_5。 是的
    适用于 Tempest-、Firestorm-和 Blizzard 类器件。

    不知怎么说-在向 T-Ware 迁移期间-提到这些"半分频器"-来自(这两个关键源)有... “离开了大楼!”    这很明显-不是很好!  (可能导致海报的困境!)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    PWM 建议很好、我有一些看起来会正常工作的代码。  由于其他人可能会认为这很有用(而且我通常不知道自己在做什么)、我将在下面提供我的代码、并将该帖子保留几天以供评论。 之后、我将把问题标记为已回答。
    注释: 我通过将系统时钟设置为80MHz、并将 PWM 时钟设置为40MHz、为 PD0上的 CCD 建立了1MHz 时钟。  为了使其与所需的 ICG 信号保持一致、它在 UP_DOWN 模式下运行、因此可以使用死区命令进行相移。  我选择对三个信号使用相同的 PWM 模块以保持同步、但使用了不同的发生器、以便可以对信号进行偏移。  虽然我合并了 PWMSyncTimeBase 和 PWMSyncUpdate 命令、但不清楚这些命令会对示波器布线产生任何影响。

       uint16_t 时钟时间= 40; //提供具有40MHz 系统时钟的1MHz 方波输出
       uint16_t integrationTime = 20; //每次集成的时钟特性
         integrationTime *= clockTime;
       uint16_t ICGTime = 5;          //每个 ICG 脉冲的时钟特性
         ICGTime *=时钟时间;
       uint16_t Shtime = 3;           //每个 SH 脉冲的时钟特性
         Shtime *=时钟时间;

       SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN); //对于80MHz 时钟
       SysCtlPWMClockSet (SYSCTL_PWMDIV_2);          // PWM 时钟频率为40MHz

       SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); //针对 PD0上的时钟的 PWM
       SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE); //针对 PE4上 ICG 的 PWM
       SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF); //针对 PF1上 SH 的 PWM
       SysCtlPeripheralEnable (SYSCTL_Periph_PWM1);  // PWM 测试、ICG

       GPIOPinTypePWM (GPIO_PORTD_base、GPIO_PIN_0); // PWM 引脚用于时钟
       GPIOPinTypePWM (GPIO_Porte _BASE、GPIO_PIN_4); //针对 ICG 的 PWM 引脚
       GPIOPinTypePWM (GPIO_PORTF_BASE、GPIO_PIN_1); //针对 SH 的 PWM 引脚

       GPIOPinConfigure (GPIO_PD0_M1PWM0);  // PD0上的时钟
       GPIOPinConfigure (GPIO_PE4_M1PWM2);  // PE4上的 ICG
       GPIOPinConfigure (GPIO_PF1_M1PWM5);  //在 PF1上 SH

    ////////////////////////////////  PD0上的时钟 ////////////////////////
       PWMGenConfigure (PWM1_base、PWM_GEN_0、PWM_GEN_MODE_UP_DOWN);//调整相位所需
       PWMGenPeriodSet (PWM1_base、PWM_GEN_0、时钟时间);    // 1MHz 时钟
       PWMPulseWidthSet (PWM1_base、PWM_OUT_0、时钟时间/2);   //方波、脉宽= 1/2周期

    //////////////////////////   PE4上的 ICG  ////////////////////////////////////////
       PWMGenConfigure (PWM1_base、PWM_GEN_1、PWM_GEN_MODE_DOWN);
       PWMGenPeriodSet (PWM1_base、PWM_GEN_1、integrationTime);  
       PWMPulseWidthSet (PWM1_base、PWM_OUT_2、50);   
       PWMOutputInvert (PWM1_base、PWM_OUT_2_BIT、TRUE); // ICG 反转

    ////////////////////////////////  PF1上的 SH  ////////////////////////////////////////////
       PWMGenConfigure (PWM1_base、PWM_GEN_2、PWM_GEN_MODE_DOWN);//| PWM_GEN_MODE_SYNC);// M0PWM6
       PWMGenPeriodSet (PWM1_base、PWM_GEN_2、integrationTime); //比时钟长5倍
       PWMPulseWidthSet (PWM1_base、PWM_OUT_5、30);   

       PWMGenEnable (PWM1_base、PWM_GEN_0);  
       PWMGenEnable (PWM1_base、PWM_GEN_1);
       PWMGenEnable (PWM1_base、PWM_GEN_2);
      
       PWMDeadBandEnable (PWM1_base、PWM_GEN_0、0、10);   // 40个时钟周期= 1us
       PWMSyncTimeBase (PWM1_base、PWM_GEN_0| PWM_GEN_1 | PWM_GEN_2);
       PWMSyncUpdate (PWM1_base、PWM_GEN_0| PWM_GEN_1 | PWM_GEN_2);

       PWMOutputState (PWM1_base、PWM_OUT_0_bit|PWM_OUT_2_BIT、true);  
       PWMOutputState (PWM1_base、PWM_OUT_5_BIT、true);

     while (1){