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:输入边沿计数器卡滞

Guru**** 2481835 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/700925/ccs-tm4c123gh6pm-input-edge-counter-stuck

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

工具/软件:Code Composer Studio

大家好  
我尝试使用 timer0作为输入边沿计数器,我执行了数据表中提到的所有步骤,但我完全没有响应。

这是我的代码

#include "tm4c123ghp6.h"
空 systemClockInit()

SYSCTL_RCC_R = 0x0;
SYSCTL_RCC_R |=(1<0);//启用主振荡器
SYSCTL_RCC_R &=~(3<<4);//将主振荡器配置为输入
SYSCTL_RCC_R |=(0x15<<6);// 16M OSC。
SYSCTL_RCC_R &=~(1<<11);//启用 PPL
SYSCTL_RCC_R |=(1<<20);//禁用 PWM 时钟分频

void enableBusAndClock()

SYSCTL_GPIOHBCTL_R = 0x3B;//为端口{A、B、D、E、F}启用 AHB
SYSCTL_RCGCGPIO_R = 0x3B;//启用端口{A、B、D、E、F}的时钟

void alterantivePinSet()

GPIO_PORTB_AHB_AFSEL_R = 0xF3;//为 B{0、1、4、5、6、7}计数器设置备用引脚
GPIO_PORTB_AHB_DIR_= 0xF3;
GPIO_PORTB_AHB_DEN_R = 0xF3;

GPIO_PORTD_AHB_AFSEL_R = 0x01;//为 D{0}PWM 设置备用引脚
GPIO_PORTD_AHB_DEN_R = 0x01;//启用数字功能
/

GPIO_PORTB_AHB_PCTL_R |=(7<0)|(7<4)|(7<16)|(7<20)|(7<24)|(7<28);//启用端口 B 引脚上的计数器功能

GPIO_PORTD_AHB_PCTL_R |=(5<0);//在 D{0}上启用 PWM 功能


空 timersConfiguration()

SYSCTL_RCGCTIME_R = 0x07;//启用计时器的时钟{0、1、2}

TIMER0_CTL_R &=~(1<0);//禁用定时器0
TIMER0_CFG_R = 0x4;//将模块0配置为计数器
TIMER0_TBMR_R =(0x03)|(1<<4);//将模块(0、B)配置为计数器和递增计数器
TIMER0_CTL_R &=~(3<<10)&~(3<2);//配置模块{A、B}正边沿
TIMER0_TBPMR_R = 0x0;//将 APMR 配置为254

TIMER0_TBIMATCHR_R = 0xFF;
TIMER0_TBPR_R = 0xFF;
TIMER0_TBILR = 0x0000FFFF;

TIMER0_CTL_R |=(1<0);//启用定时器0

int main (void){


systemClockInit();
enableBusAndClock();
alterantivePinSet();
timersConfiguration();

while (1)


 

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

    您好、Ahmed、

    我没有完全按照您的要求进行操作、但下面是一些简短的观察:

    -我看不到您的 counter.match 的任何中断 ISR。

    -是否已尝试将 Tivaware 用于您的外设配置? 这种方法更简单、更好。 如果您想使用 Tivaware、请参考下面的链接。。   

    希望这能有所帮助。

    BR、

    Pranav。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉,我没有提到,但我只想每200ms 读取一次 GPTMTAR 的值(计数的数量)(这将在以后使用 SysTick 完成),但正如我所说的,输入边沿计数器正在响应
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请参阅此常见问题解答中的技巧4。 e2e.ti.com/.../695568

    一般而言、我们不支持 DRM。 如果您有一个必须使用 DRM 的特殊要求、那么您可以参考 TivaWare API 如何实现 DRM 代码。

    使用寄存器浏览器窗口查看是否所有寄存器均已正确配置、并检查计数器是否正在计数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Ahmed Khudair"]我尝试使用 timer0作为输入边沿计数器,我执行了数据表中提到的所有步骤,但我完全没有响应

    当(实际上)将计时器用作"边沿计数器"时-通常会向该计时器的 I/O 引脚提供输入信号-是不是吗?    较早 到达的海报 似乎错过了这一(非常)真正的需求!

    您没有说明您提供了这个重要的输入信号...  尽管我对代码的快速扫描显示 PD0 (代码开始将其配置为候选 PWM 输出信号) "可能可疑"。    因此-如果我对您的意图的"重建"证明是正确的-您必须完成 PD0的配置以用作"数字发生器"-它驱动您的时间0 -设置为计数 (输入)信号边沿。    没有提到"信号生成和到所选定时器的路由"输入引脚-这是(当然)必需的。

    另请注意-如果您使用的是123 LPAD -您(与您之前的数百名一样)可能已被供应商的"重要"决策所影响-更改为"将 PD0连接到 PB6!"   (也称为 PD1至 PB7 -那些通过 0Ω Ω 电阻器(R9/10)连接的'邪恶对'最好被描述为'鼠疫- istors '。)   根据 PB6的订购方式-它可能会阻止 PDO 输出您所需的信号-用于练习 timer0。   通常、明智的做法是使用"非"PD0/PD1作为信号发生器-或删除和" tombstone"这些 Devil 器件-以便清楚地记录电路板的"修复"...   ("墓碑"-粘焊料(仅限) 1根铅-装置垂直-与坟墓场中一样)

    正如其他人所指出的那样-使用"DRM"(尤其是仅"有符号注释的"DRM)会为您的无电帮助者的任务增加大量时间/精力-这证明不是您的优势。

    在 有任何希望之前、您必须确保为定时器的输入引脚创建一个合适的脉冲输入信号(并且最常见的情况是-确认它是否存在)、以便看到定时器递增/递减...

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

    PD0用作控制 电机的 PWM (但并未提及 PWM 初始化,因为它运行良好 ),PB6用于计算来自光学编码器的脉冲数,编码器的信号在示波器上进行测试,   

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

    您提供的这两个(新)事实非常有用-也许应该已经包含在您的初始过帐中。   (请注意、我能够识别您使用(两者均为) PB6 (作为计时器输入)和 PD0 (作为 PWM 发生器-尽管其到电机的路由(当然)未知。)    尽管这两个"新事实"对正确诊断您的问题有帮助-但事实证明它们不足以解决问题。   

    如果您使用 TM4C42的 Launch Pad (LPAD)、则不确定(仍然)。      这很重要-正如我在初始帖子中所指出的-因为您的两个关键/关键(和自选) MCU 引脚(PD0和 PB6)通过0Ω Ω 电阻器短接在一起-在123 LPAD 上"不方便且意外"放置(尽管用户有抗议)!    (我不明白为什么您使用'AQ'S LPAD -仍然是一个"神秘"。   我强烈建议您选择 LPAD -如果是这样-在这2个引脚之间施加的"短接"(同样是 PD0和 PB6)-不能帮助您的工作!)

    您会注意到、"在示波器上测试编码器的信号"-而这是"好的"-忽略了此类"测试"的(必要)"运行条件"!    示波器是否连接到 PB6 -您的代码正在运行时-以及(仍可疑的'LPAD ')是否"将 PB6 (计时器输入)短路到 PD0!"   (您的 PWM 输出)

    未解释的是您选择检查的计时器寄存器-这导致您的报告“完全无响应”。   寄存器"GPTMTBR"似乎是"可能的候选项"。   (也可能是 GPTMTBV。)   我必须注意的是、您对 "Timer B"的使用(而不是简化的 Timer A)也没有解释...

    所有回复您的帮助者都注意到 使用 DRM 会增加复杂性-假设这种额外的努力/效率低下 是"强制"给您的。   您可以全面研究各个 MCU 寄存器"运行中"、同时采用效率显著提高(并大量示例)的 MCU API。    (API 存在的原因(非常)-使用 DRM 的用户(最常使用的)就在这里!)   "高级学习"的"承诺"(通过 DRM)-以某种方式(从不)实现了"痛苦/痛苦" (正如您所看到的)是 (远比)预期 的 DRM "标准!"

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

    您好 CB1、

     感谢您的指导。   当他的目的是使用 timer0_B 时、海报似乎不启用 timer0_B、而是启用 timer0_A 他已经为加载和匹配寄存器配置了 timer0_B、但 timer0_B 使能位位于位位置8、而不是位0。 CTL_R 的位0是启用 timer0_A。  

    TIMER0_CTL_R &=~(1<0);//禁用定时器0

    TIMER0_CFG_R = 0x4;//将模块0配置为计数器

    TIMER0_TBMR_R =(0x03)|(1<<4);//将模块(0、B)配置为计数器和递增计数器

    TIMER0_CTL_R &=~(3<<10)&~(3<2);//配置模块{A、B}正边沿

    TIMER0_TBPMR_R = 0x0;//将 APMR 配置为254

    TIMER0_TBIMATCHR_R = 0xFF;

    TIMER0_TBPR_R = 0xFF;

    TIMER0_TBILR = 0x0000FFFF;

    TIMER0_CTL_R |=(1<0);//启用定时器0

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

    您好、Charles、

    展位占空比(Automatica 的最后一天)呼叫-然而(由"123 LPAD"强制执行)海报的 PD0和(定时器输入) PB6上的"预期"短接必须收到"高电平且持续的注释!"   (即使问题----特别是----早已知道. 并被允许坚持!)

    PD0的"输出争用"与海报的电机编码器有可能"杀死"他的编码器!    (这尤其令人遗憾-这也是供应商 避免消除(非常)风险业务的结果: "推销 PD0-PB6和 PD1-PB7!")

    海报被多次要求确认、"使用 LPAD ..."

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1、
    我确认您的担忧。 在海报的预期定时器操作中、他选择与 PB7相对应的 timer0_B、PB7也通过0欧姆电阻器连接到 PD1。 但是、他目前没有将 PD1用于 PWM。 我同意最佳解决方案是断开两个0欧姆电阻器。 在上述情况下、海报应首先修复代码以启用/禁用正确的计时器。 如图所示、他正在启用 timer0_A、而他选择的计时器是 timer0_B、但该计时器仍处于禁用状态。