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.

[参考译文] TM4C1294NCPDT:TimerA DMA 传输疯狂-或者我的?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/595297/tm4c1294ncpdt-timera-dma-transfer-insanity---or-mine

器件型号:TM4C1294NCPDT
主题中讨论的其他器件:TM4C123

也许我必须创建一个 LaunchPad 软件来展示这一点、但下面是一个尝试词:

-在 TCCP 管脚中接收到一个 PWM 信号
-信号的周期大约为1ms,它是非停止的
-定时器 A0被配置为在两个边沿上捕捉信号。 DMAEventSet 已正确配置为 CAPEVENT

TimerConfigure (TIMER0_BASE、(TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP));
//TimerPrescaleSet (TIMER0_BASE、TIMER_A、ENC_PRcaler);
TimerPrescaleSet (TIMER0_BASE、TIMER_A、预分频);
TimerLoadSet (TIMER0_BASE、TIMER_A、0);//为0xFFFF
TimerControlEvent (TIMER0_BASE、TIMER_A、TIMER_EVENT_BULE_edges);
TimerDMAEventSet (TIMER0_BASE、TIMER_DMA_CAPEVENT_A);
TimerIntEnable (TIMER0_BASE、TIMER_TINA_DMA | TIMER_TINA_TIMEOUT);
IntPrioritySet (INT_TIMER0A、0); //可能的最高中断
IntEnable (INT_TIMER0A);

请注意、这里有一个将超时作为中断源的尝试-这不会发生-但这还不是马上讨论的内容、我会回来讨论。

当我想测量 PWM 时、我配置 DMA 通道:

uDMAChannelAssign (UDMA_CH18_TIMER0A);
uDMAChannelAttributeDisable (UDMA_CH18_TIMER0A、UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIORY | UDMA_ATTR_REQMASK);
uDMAChannelControlSet (((UDMA_CH18_TIMER0A|UDMA_PRI_SELECT)、(UDMA_SIZE 32|UDMA_SRC_INC_None|UDMA_DST_INC_32|UDMA_ARB_1));
uDMAChannelTransferSet (((UDMA_CH18_TIMER0A|UDMA_PRI_SELECT)、UDMA_MODE_BASIC、(void *)(TIMER0_BASE + 0x048)、编码脉冲、4);
uDMAChannelEnable (UDMA_CH18_TIMER0A); //启用此特定通道
HWREG (TIMER0_BASE + TIMER_O_TAV)= 0; //将计时器计数器归零
ROM_TimerEnable (TIMER0_BASE、TIMER_A); //启用 timer0以便捕获信号

这足以使内部齿轮运行- 4个边沿时刻应通过 DMA 从固定的 TMER0 TAR 寄存器传输到递增的数组编码脉冲。

它按预期工作、但我经常会得到奇怪的序列、例如:

2 350 396、2 397 921、54 350、101 754

显然、计时器计数器会翻转。 这在这个系统上是不可能的、信号一直在运行、并且应该记录前4个脉冲。 如果我将超时负载添加到较小的值(在这种特殊配置中,即37*2^16),我将获得反映实际信号的理想连续值。 正确的序列如下所示:

1 084 102、1 131 633、1 212 768、1 260 302

不过、上面的序列显示4个记录的值是 DMA 传输的延迟值! 如果信号为~1ms、则在 TAV 加载为零且 TimerEnable 置位后、第一次事件必须在不到120000次点击的时间内发生。

我的配置或勘误表中是否存在我缺失的 DMA 错误?

此致

布鲁诺

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

    [引用用户="Bruno Saraiva"]转移精神错乱-或我的?

    你“诱使”我们“太远”让我们这样做——如果“精神错乱”可以用出现的人(频率)来衡量——你的设施——“医疗白色”——武装“约束”和“护送”你离开—然后“是”“精神错乱”(可能)是你的。    (确实-著名的海报/学生路易斯、"尖叫!")

    "更好的"表现为"疯狂"(或至少-巨大的不一致性)是"ROM 函数"(ROM TimerEnable())的单一、无法解释的外观-而所有其他函数是(内容)在闪存中。

    现在您特别注意到: (如下所示)

    [引用 user="Bruno Saraiva"]在将 TAV 加载为零并设置 TimerEnable 后,第一次事件必须在不到120000次点击的情况下发生

    作为与许多 ARM MCU 合作的公司/我不能忘记您的"调用 ROM"(此处)是否是故意的、并且提供(可能)更具确定性的行为/响应是合理的。    进一步思考-即使"计时器启用的开始证明是"可变"-它是"时间差"-是您请求的4个连续信号到达之间的差异-而不是它们与计时器启用的"偏移"。   (布鲁诺、这是正确的理解吗?)   在任何情况下- ROM 函数的(单独)包含似乎异常-因此可疑。

    第二个注意事项-您经常评论(并在此处撰写)这些 MCU 中包含大量计时器的情况。   然而-计时器 A0已获得应用程序的"专有且完全有效"!   这是明智的-尤其是您注意到的"问题"吗?   是否可以采用(而不是) 至少另一个计时器、或采用"简化并减轻每个计时器上的负载"的计时器数量、从而提供"更深刻的"路径?

    我们注意到,"走同样的(失败的)道路"是"精神错乱"的一个迹象。   "交叉关联"(即比较多个计时器提供的严格组织的数据)的功能-每个计时器都具有特定的有限功能 - 在这里提供(仅通过 使用多个计时器)-似乎值得考虑...    (也许(甚至)恢复健全...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、Bruno、但我错过了一些东西。 为什么计时器无法翻转? 给定第一个值时、最大值和增量翻转看起来是不可避免的、您的检查似乎确认了这一点。

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

    [引用 user="Robert Adsett72"]为什么计时器无法翻转?

    实际上、120、000 (1ms)计时器计数将"过流/翻转" 16位 Timer0A。    但是-布鲁诺海报已将"8位预分频器"添加到了该组合中。   (W/out 提到其值)  因此-我计算出"翻转"至(可能)延伸至140ms。   (假设预分频器设置为最大值... 16、777、216/120、000、其中16百万为2^24 (定时器和预分频器的最大值)、120为系统时钟)  、通过快速分频-最小预分频负载"10"需要将回滚延长至5ms (即120K -> 1ms、600K the->5ms)。   这5ms 提供了(实质性)安全系数(在适应4个信号边沿时)-我认为。

    现在-在输入信号@ 1ms 周期内-并且如果他已经(完全/正确)将他的24位定时器归零-他不能(或者不应该)超流定时器。   

    同样、不知道预分频器的设置、我相信我们预测"回滚"的能力是不确定的。

    分频器设置/管理似乎不正确-或者-定时器"自由运行"(不是0)-有时-  4个输入信号边沿发生在太接近"Timer-MAX value"的位置-从而发生翻转...

    我相信(两者) Timer0A 及其预分频器(必须)在每个(新)"数据捕获/定时器启用"之前为零。    预分频器的任何"归零"都不会显示在 B 的代码中。   (请注意、我在本文中的大部分内容都是基于我对 TM4C123手册的审阅、目前只有一本手册可用。)    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    布鲁诺确实为第一个帖子的延期提供了价值。 与报告结果匹配的值。 因此,我对这一说法的好奇心是不可能的。

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

    我找不到任何显式预分频设置-对我来说、这对滚动周期有很大影响。

    我发现以下内容:

    //TimerPrescaleSet (TIMER0_BASE、TIMER_A、ENC_PRcaler);

    TimerPrescaleSet (TIMER0_BASE、TIMER_A、预分频); // 我找不到变量"prescale"的值!

    然后进一步往下写文章,他写道:“如果我将超时加载添加到较小的值(在这种特殊配置中,为37*2^16...)”    这表明"37"是他加载到预分频器的值。  (因为计时器本身保持16位)。  这将产生"2、424、832"的最终计时器值、从而产生20ms 的翻转。   我找不到任何理由来说明如何选择(大)值。

    观察 Bruno 的"好"数字:"1 084 102 [1] 1 131 633 [2] 1 212 768 [3] 1 260 302 [4]"、并回顾任何两个(相同)边沿都是"3个读数分开" (即"H-L-H-L")、我们发现:

    边沿[3]-边沿[1]= 128、666计时器计数(产生1.07mS); 边沿[4]-边沿[2]= 128、699计时器计数(产生1.07mS)。   与 Bruno 的1ms 输入信号报告非常一致。

    我在他的帖子中找不到"滚动价值"。   为了实现这种翻转的"神圣"、Bruno 的 "失败顺序"(如下所示)是计时器捕获:

    2 350 396 [1[2  397 921 [2]  54 350 [3] 101 754 [4]

    我已自由强调措施"3"(上文)-这可能是"滚动"受害者。   从正确的读数(高于)开始、我们期望测量值[3]为~128K 计时器计数大于测量值[1]。   (将其置于/大约2、479、000处)  这表示(在这种情况下!) 发生在2、397、922 (比测量值大1)和(可能为128、000 - 54350 = 73、650超过测量值的计时器计数[2]之间。    (即~2、471、571)  (也许)   这是否符合您的想法流程、Robert?   但我不能接受“布鲁诺提供了此类延期价值”。

    再看(并思考):Bruno 的失败序列-"定时器计数器(曾经)是如何上升到如此高的?"   (它也在"良好的顺序"中上升到很高的位置!)   这必须意味着计时器/预分频器组合在每次新的4输入信号测量之前"不会被清零"因此在20ms 的翻转设置时/大约会发生翻转!   使用(适当的)定时器/预分频器"清除"-任何此类翻转(仅在此时)都将"不太可能"。

    我们可能会注意到、翻转是"轻松检测到的"、如果我们可以"接受"输入 PWM 信号保持其占空比和频率的期望、那么我在这里采用的数学运算使 MCU 可以避免(同时)计时器和预分频 器复位、前提是这些操作 破坏性和/或不必要...

    当然、通过完全加载预分频器(即255)、此类翻转的频率可以减少6倍以上!   (即255/37)    

    我认为问题已经确定、并提出了2个解决方案...   (正确复位定时器/预分频器组合-或将预分频器设置扩展至最大值。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我相信您引述的滚动内容为2、424、832。 然而、再次来看这一点、我认为 Bruno 的投诉不是延期、而是巨大的起始价值、除了您的初始价值问题之外、我还有几个问题。

    首先、这似乎是一个带有预分频器的16位定时器。 但根据我的经验、预分频器被 n 个器件除以、而不是扩展器、那么预分频器实际上只是用作扩展吗?

    其次、该计时器看起来是作为32位值读取的、那么其他16位是什么? 定时器是否设置为当你将32位定时器拆分为两个16位定时器时、它们会将预分频器移动到最高顺序?

    实际上、我认为预分频器的唯一工作方式是倒计时配置、否则我不认为有简单的重新加载触发器(或者重新加载被反转以变为计数到满)

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

    [引用 user="Robert Adsett72"]根据我的经验,预分频器除以 n 个设备而不是扩展器,因此预分频器实际上只是用作扩展吗?

    我的体验与您的体验重叠-这是我的 MCU 手册中的一个引用:"具有8位预分频器的16位输入边沿计数或时间捕获模式"-现在这并不是特别说明-但图表(下面)是!

    边沿时间从底部显示第2个-预分频器被列为一个"扩展器"包含高序8位。   因此、定时器包含低16位-预分频器包含高8位。   一些定时器-包括 Bruno 选择的定时器-"CAN & DO "可容纳32位-然后预分频器扩展到包括高16位!   如果 Timer 被强制进入"宽定时器模式"-翻转电势将大大减少。   话虽如此-我认为最好在启用定时器/预分频器组合之前清除该组合。

    您已经询问了"定时器读取"- Timer_0A 的低16位是唯一有效的位-当配置为宽定时器时、完整的32位就会起作用。   是-当该计时器可以(通过程序) "从32位拆分为2个16位计时器时。   但是预分频器不是最高顺序-它驻留在一个单独的(预分频器)寄存器中。   预分频器与定时器的"独立性"是我认为这两者都需要单独"清除"的原因。   (Fire/I 不使用129x -因此这都是我的4C123体验和手动阅读的结果。)

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

    CB1和 Robert 的美好一天

    你提供了一套美丽的周末想法! 非常感谢。 事实上,我猜我的标题是正确的!

    尝试在一条消息中返回所有注意事项:

    1) 1) ROM_CALLS:这只是一个"意外"。 我们倾向于在开发过程中保留闪存调用、然后当一切正常时、用 ROM_调用(或实际上用 MAP_调用)替换它们。 在我发布之前的原始代码有很多 MAP_S、但有一个杂散 ROM_Entry、我将它们擦除以粘贴到消息中、因为我更喜欢在这里编写时保持"纯" Tivaware。

    2)大量计时器:发动机的其余部分使用其他计时器-包括用于控制 PWM 信号超时的计时器、在硬件未连接或发生故障时触发。 有关详情、请参阅下文。 但 DMA 的使用将事件时间的自动捕获限制在一个来源、因此使用其他计时器作为参考/比较时、调试起来有点困难。 顺便说一下、我成功地使用了由同一时间捕获事件触发的两个 DMA 源、但这是以两个 DMA 通道为代价的-这两个通道仅在其中一个引脚上可用。 因此、在这个特定的电路板中、我只使用 DMA 来复制定时器事件、并在捕获#4后"运行"来读取 GPIO 值。 如果有人知道如何在同一配置中启用第二个 DMA 源/目标集、欢迎使用它!

    3) 3)延期不是不可避免的、也不是预期的。 ENC_预 分频器设置为十进制的37。 "过多的数字"是为了尝试在20ms 后获得超时(计算得当、CB1!)。 在 启用定时器之前、通过 HWREG (TIMER0_BASE + TIMER_O_TAV)= 0、在每个捕获周期之前将 timer0A 自由运行值归零。 然后、又出现了另一个问题:使用所提供的设置、是否真的无法获得每个捕获事件(几乎)发生的 DMA 传输和定时器超时?

    4)哪些价值观很重要? 是的、我担心事件之间经过的时间、而不是计时器启动的值。 是的、它们完全是 H-L-H-L (或 L-H-L-H)计数。

    5) 5)翻转在哪里? CB1在他的帖子上标记为红色的地方。 "错误"序列的值[3]和[4]。 预分频器设为37、因此定时器在变为零前一直运行到2424832。 让我们再次看看数字:
    2 350 396 [1]   2 397 921 [2]   54 350  [3]  101 754 [4]

    如果我们将该预分频添加到悬停的值、我们将得到
    2 350 396 [1]、2 397 921 [2]、2 479 182 [3]、2 526 586 [4]
    其中经历的时间[3]-[1]和[4]-[2]均为~128700、符合预期。

    6) 6)考虑到所有因素、似乎故障并未归零计时器计数器和预分频器... 实际上、我没有将预分频器归零、而是自由运行计数器。 有趣的是、数据表中的某个位置有条目表示计时器启动时两个器件都自动归零、这是不正确的-我将通过此类文本来确认我的陈述、如果是、将其发布回此处。

    7) Robert、留着的帖子似乎已经澄清了您的问题、但实际上、这里的预分频器的作用类似于扩展器。 当发生两件事情时、自由计数器从零一直到"主"定时器负载:预分频器递增、自由计数器变为零、继续计数。 只有当预分频器达到其自身负载时才需要超时。

    8) 8)将定时器读作32位值:实际上、就是这样! TAR 寄存器包含一个"32位"值、此值由8个 MSB 零组成、另外8个位带有预分频器计数、然后16个位带有"主"自由运行定时器。 我在几周前才学过这一点、结果有点令人惊讶:MCU 的完整描述(比如16位)是误导性的。 它实际上具有16个24位计时器! 我现在更喜欢说、因为如果您读取计数寄存器(前提是您先配置了预分频器的某个值)、您会得到24位的已计数点击... 市场营销/销售人员在其销售活动中"浪费8位"!

    我现在要做一些测试、然后返回这里。 刚刚在数据表的寄存器14 (GPTMTAPR)描述中发现了另一个冲突信息:它说位31-8是 RO、位7-0是 RW... 接地时、我如何只写入寄存器的低7位?? 我可能能够写入完整的寄存器、我想尽管我们在其中写入了值、RO 位仍将保持为0 -但是、将它们称为 RO 是"有趣的"...

    希望现在没有忘记任何反馈。

    再次感谢、很快就会再来!

    布鲁诺

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

    嗯、我还有一些新消息...

    翻转实际上是由于预分频器计数器没有归零。 每个捕获周期后的抽头的连续寄存器可视化显示计数器一直上升到存储在 TAPR 中的0x25加载值。

    尽管 TAV 寄存器同时具有预分频器(位23-16)和定时器计数器(位15-0)、但向 TAV 写入0不会使预分频器计数器归零(足够公平、实际计数器寄存器位于其他地方、称为抽头...)

    但是、寄存器抽头寄存器是只读的、对其进行写入不会导致任何变化。 换句话说、这似乎是一个死端、无法对预分频器进行零。 德州仪器

    我可以轻松地解决我的问题、只需将预分频器加载到0xFF、并检查捕获的测量值是否翻转... 但是、我仍然想看看我是否在这里遗漏了一些东西!

    至于帖子问题的"一句回复"、获胜者是:

    [报价 USER="CB1_MOBILE "]我相信(两者) Timer0A 及其预分频器(必须)都为零-在每个(新)"数据捕获/计时器启用"之前。[/QUERPLET]

    此致

    布鲁诺

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

    您好 Bruno、感谢您努力(真正)阅读罗伯特·莫伊(Robert et Moi)的(少数)帖子。

    昨晚有点晚-但我发现了这家酒店:
    "在16位输入边沿计数、输入边沿计时和 PWM 模式中、15:0位包含计数器的值23:16位包含预分频器的值、该值计数的高8位。 位31:24始终读为0。"   这是针对寄存器"GPTMTAR"。    布鲁诺-正如您今天发现并报告的-您的第一个帖子(此处)。

    作为"要求将预分频器归零"的"标识符"-是否证明有必要进行一些"绿色流动"?    (我公司库存的"低螺纹 T 恤衫"(和评估板)... (现在)"阻挡太阳!")

    根据您的精度要求、您还需要考虑一个问题、我怀疑"四个这样的边沿时间捕获"比"远"。   实际上、4次捕获会快速发生、但异常脉冲宽度/脉冲会(不适当)影响您的精度。    如您所知-此处的"权衡"是"数据采集频率与此类采集的精度(平均值计算)之间的关系。"    只有您知道每个...的(适当)重量

    整洁的帖子-您可能希望(稍微)安静地说、"Luis 的报告"。    (我的小队,“先见他”。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您离开对话,我们很可能会做一些事情,让自己保持娱乐:)

    Robert
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这种"娱乐"确实增强了技术重点、而不是淡化技术重点。 (即所有工作和无播放...)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Bruno Saraiva">但我仍然想看看 我是否在这里遗漏了一些东西!... 德州仪器 ?[/quot]

    虽然远离"允许的供应商状态"(非常远)、但可能会通过计时器寄存器"GPTMTAPR"来"填充"缺少的内容?   (这是 Timer_A 预分频器寄存器)

    该寄存器的低8位为 R/W -因此(应该)启用"常规且正确"预分频器清除。

    遗憾的是、供应商代码示例看起来"太基本"-很少达到"深入探讨"状态!    (您(和这里的其他人)可能会成长为-然后需要!)

    当风暴云出现时、"仅供供应商"可能不会(始终)证明"最佳/唯一端口"(正如您建议的、通过"朋友"请求)?   (闪电...)

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

    [引用 USER="CB1_MOBILE "]该寄存器的低8位为 R/W -因此(应该)启用"常规且正确"的预分频器清除。

    CB1、

    这是个棘手的问题:GPTM-TAPR 不是预分频器计数器、而是预分频器"限制器"或 LOAD。 定时器/预分频器计数一直到 TAILR/TAPR 和 RILLLUs。

    保存当前预分频器值的寄存器为 TAP、偏移量为0x5C。 这是一个周期前需要调零点的东西。 这样的人是 RO。 除非 TI 证明我错了、否则无法清除预分频器计数器。

    这是所需的命令:

    HWREG (TIMER3_base + TIMER_O_TAPs)= 0; //#define TIMER_O_TAPs 0x05C

    并向计时器管理添加了注释:显然没有用于此操作的 Tivaware 函数(因为它是 RO 寄存器)、但应该有一个用于读取/写入计时器空闲计数器的 Tivaware 函数、该计数器不存在。 我经常使用以下 DRM:

    HWREG (TIMER3_base + TIMER_O_TAV)= 0; //#define TIMER_O_TAV 0x050

    为了添加一些 salt、Tivaware 文档并未明确指出、当您使用 TimerValueGet 读取定时器值时、您实际上正在读取 TAR (函数标头和一些 UG 文本错误地暗示该函数返回定时器的当前值、 但事实并非总是如此)。

    此致

    布鲁诺

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

    您好 CB1、

    你确实得到了一个点赞的流程,但对于绿色,我宁愿在包含真正原因的帖子上标记它(尽管显然无法解决)。

    至于精度、这篇文章只是"图片"。 影片比以下内容要长得多:

    -传感器是连续测量的(~100Hz),极端值会被丢弃,因为不可靠,而且在这之后,仍会应用移动平均值。 值得一提的是、不可靠的捕获值的速率非常接近于零...

    谢谢!

    布鲁诺

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

    Bruno -我是否可以问您是否(真的)尝试"清除"GPTM-TAPR -然后注意到结果?    

    根据过去使用"预 ARM " MCU 的经验、预分频器不会用作"递增/递减"计数器、而只是用作"计时器分频器"。   但在这里-在您选择的"边沿计时器"模式下运行-它们(预分频器)现在似乎 只表现为"计时器扩展器"-如果它们不容易被"清除"- MCU 的"边沿计时器"功能已经受到影响。

    MCU 手册提供:"在输入边沿计数、输入 边沿时间和 PWM 模式下、预分频器始终作为定时器扩展运行、而不管计数 方向如何。"   供应商的技术写作人员不知道(或过于匆忙)(适当)详细说明(完全)操作结果和含义-由(有点隐秘)"计时器扩展"标签强加...

    您之前过、读出(某处)"清除(两者都清除)定时器和预分频器"的能力。   我认为"GPTM 复位条件"中描述了这一点-下面是(几乎) "真实副本:"  (即、我已经编辑了、以便(仅)展示这些计时器/预分频器对这个帖子很有用。)

    GPTM 复位条件
    GPTM 模块复位后、该模块处于非活动状态、所有控制 寄存器清零并处于默认状态。   计数器 Timer A 和 Timer B 连同 它们相应的寄存器被初始化为所有的1:

    定时器寄存器被初始化为全为1:

    GPTM Timer A 间隔装载寄存器(GPTMTAILR)

    GPTM Timer A 值寄存器(GPTMTAV)

    预分频计数器被初始化为所有0:

    GPTM Timer A 预分频寄存器(GPTMTAPR)             注意:R/W

    GPTM Timer A 预分频快照(GPTMTAPS)   注意:RO (只读) Ratz!

    GPTM Timer A 预分频值寄存器(GPTMTAPV)        注:RO (只读) Ratz!

    @ GPTM 复位的使用会出现、"非常残酷"、即使它(确实)清除了预分频器、也会造成巨大的成本/工作量。

    使用定时器的32位模式- "吞咽"Timer0_B -同时不消除翻转可能性-将它们推向未来...   "翻转测试"必须在数据读取时(每一次)执行、这会增加代码大小和数据采集的执行时间。   (两者似乎都不重要、但缺少"预分频清晰"、尤其是(甚至)其"未提及"仍然是明智之举...)

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

    [报价 USER="CB1_MOBILE "]我是否可以询问您是否(真的)尝试"清除"GPTM - TACPR -然后记下了结果?[/QUERP]

    我相信我有。 TAPR 是设置为十进制37的值、它设置了预分频器的最大计数。 我尝试了一组组合、但这个组合没有出现在我的笔记上-不过、对于我在这里看到的所有组合、将 TACR 设置为零、然后在我再次启动计时器之前返回到37、没有将 TAPS 设置为0。

    如前所述、该程序现在正以受信任的设置正常运行、而现在"截然不同"的设置可用于快速测试。 当我有时间进行测试时、我可能会返回到执行测试-在这种情况下、我计划使用一个在端口中生成 PWM 的裸 Launchpad、并将信号连接到 TCCP 引脚以测量一个简单且已知的信号。

    [引用 user="CB1_mobile "]由(有点加密)"计时器扩展名"标签强加...[/quot]

    大多数情况下、Timers 指令上的所有术语都是加密的。 Writer 在章节、寄存器和注释之间不保持一致。 计数器、电流、负载、扩展、值、 预分频器、true、divider、会产生冲突和混乱。 我想这是他们的问题、我已经知道了(大部分)真正的行为、但我已经不知道了... 本来可以节省宝贵的时间、但是... 我觉得这里的供应商都知道这一点、并且"当然决定发布"明年"的最终版本!

    CB1_mobile 说:
    此时会出现"Beyond 残酷"

    这种 GPTM 重置的用法

    我坚信这将清除预分频器计数-实际上这是残酷的。 当然、我不想每秒做400次...

    最后、我将使用全8位的预分频器、因此我有一个24位计时器。 如果我最终需要检查24位的翻转、32位的翻转也是如此、因此它不会产生影响-我可以承受额外的2个加载/比较周期... 如果我没有这样做,"荒谬的价值"保护仍然会抓住它----代价是一个被驳回的读取周期。 总之、所有选择的优缺点...

    这里唯一的酸味是我们的官方研究员仍然没有任何投入! 除此之外、这篇文章成为了一篇对未来受害者的好计时研究、对吧?

    谢谢

    布鲁诺

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

    [引用 user="Bruno Saraiva"]如果我最终需要检查24位的翻转、这与32位的翻转相同、因此它不会产生影响

    这应该是您在任何情况下采取的预防措施。 否?

    Robert

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

    [引用用户="Robert Adsett"]

    Bruno Saraiva
    如果我最终需要检查24位的翻转、32位的翻转也是如此、因此它不会产生影响

    这应该是您在任何情况下采取的预防措施。 否?

    [/报价]

    它也是减法后的简单屏蔽操作。 在 C 语言中很容易,你应该尝试用梯形逻辑来处理它:)

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    真够!
    优点是、当计时器仅使用24位时、不会有混淆处理信号的"左"位的风险。 现在不是想思考的、但我认为如果控制32位翻转不是那么简单...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Bruno Saraiva"]现在不想思考

    )

    [引用用户="Bruno Saraiva"]我认为如果控制32位翻转的话,它不是那么简单...

    没错、它更简单。

    只要您有32位数据类型、编译器就会自动处理它。 从技术上讲、它必须是无符号的、但我从未见过有符号会导致问题。 在像 Cortex 这样的情况下、32位是由硬件负责处理的本机大小。 您甚至不需要掩码。

    Robert