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/TM4C129ENCPDT:ADC 中断间歇性工作

Guru**** 2440240 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/624137/ccs-tm4c129encpdt-adc-interrupt-working-intermittently

器件型号:TM4C129ENCPDT
主题中讨论的其他器件:TM4C123EK-TM4C1294XL

工具/软件:Code Composer Studio

我将 CryptoConnected Launchpad 与 TM4C129E、CCS Studio v6.2、TivaWare 中的 driverlib 搭配使用。

我正在尝试使用 ADC0、TIMER0 负责触发转换。

在以下代码中、Timer1每隔3秒中断一次、通常情况下、切换电路板上的 LED。 TIMER0被配置为在超时时触发 ADC0。

但是、它无法正常工作。 有时、中断会发生、它会达到我在 ISR 内部设置的断点、转换读数正常、并且它会一直工作、直到我关闭 CCS 或重新启动我的 PC。 但是、在大多数情况下、程序不起作用、它会停留在无限循环中等待中断、并且永远不会发生。 我已经查看了寄存器映射、在 NVIC 和计时器寄存器上一切似乎都正常。

我不知道问题在哪里。

/*
ISR
*/
void ISR_Timer1A (){
TimerIntClear (Timer1_base、timer_TINA_TIMEOUT);

if (led3s = 0){
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、GPIO_PIN_0);GPIOPIN_PIN_0 (GPIOPORTN_BASE
、GPIOP_PIN) GPIO_PIN_2);
led3s = 1;
}否则{
led3s = 0;
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、0);
GPIOPinWrite (GPIO_PORTN_BASE、 GPIO_PIN_2、0);
}

return;
}

void ISR_ADC0 (){
ADCIntClear (ADC0_BASE、3);
while (ADCBusy (ADC0_BASE));
ADCSequenceDataGet (ADC0_BASE、3、 bufferTemp);

IF (ledConv =0){
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、GPIO_PIN_1);
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_3、 GPIO_PIN_3);
ledConv = 1;
}否则{
ledConv = 0;
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0);
GPIOPinWrite (GPIO_PORTN_BASE、 GPIO_PIN_3、0);
}

返回;
}

//
*主循环
*

/ int main (void){
led3s = 0;
ledConv = 0;

SysCtlClockFreqSet ((SYSCTL_USE_OSC | SYSCTL_OSC_INT | SYSC_MAIN_OSC_DIS | SysCtlSysClockFreqSet)(SYSC_Periptl


);SysCtl_PowerOn_SysTHRESHO_0_SysT1_SysT1_SysTHREST_OPTL (SysT1_SysT1_SysT1_SysTHREST_OPTL)
SysCtlPeripheralPowerOn (SYSCTL_Periph_Timer1);
SysCtlPeripheralPowerOn (SYSCTL_Periph_ADC0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
SysCtlPeripheralEnable (SYSCTL_Periph_GPCtl);
while (!SysCtlPeriph_GPIOE)
GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_5);

SysPeripheralEnable (SYSCTL_Periph_ADC0);
while (!SYSCCTL_PERIPCtl_AD0_PeripheralEnable);while (SysCtl_SysCtl_Periptl)
ADCClockConfigSet (ADC0_BASE、(ADC_CClock_SRC_PIOSC | ADC_CClock_RATE_Half)、1);
ADCPhaseDelaySet (ADC0_BASE、ADC_PHASE_0);
ADCReferenceSet (ADC0_BASE、ADC_REF_INT);
ADCHardwareOversampleConfigure (ADC0_BASE、64);
ADCSequenceDisable (ADC0_BASE、 3);
ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_PROCESSOR、0);
ADCSequenceStepConfigure (ADC0_BASE、3、0、(ADC_CTL_IE | ADC_CTL_END | ADC_CTL_SHOLD_8 | ADC_CTL_CH8));

PeripheralEnable (SYSCTL_PERIPH_TIMER0);
while (!SysCtlPeripheralReady (SYSCL_CTL_CH_CH_0);PeripheralEnable (SYSCBLE_TIMER
0);Timer_TIMER 0 (SYSCTRL_TIMER 0)
TimerUpdateMode (TIMER0_BASE、TIMER_A、TIMER_UP_LOAD_IMMETRI);
TimerClockSourceSet (TIMER0_BASE、TIMER_CLOCK 系统);
TimerLoadSet (TIMER0_BASE、TIMER_A、1100);
TimerADCEventSet (TIMER0_BASE、TIMER_ADC_TIMEOUT_A);
TimerControlTrigger (TIMER0_BASE、TIMER_A、TRUE);
SysCtlPeripheralEnable (SYSCTL_Periph_Timer1);
while (!SysCtlPeripheralReady (SYSCTL_Periph_Timer1));
TimerConfigure (Timer1_base、timer_CFG_A_PERIODICY_UP);
TimerUpdateMode (Timer1_base、timer_A、timer_up_load_immediate);
TimerClockSourceSet (Timer1_base、timer_clock_system);
TimerLoadSet (Timer1_base、timer_A、48484848);

ADCIntRegister (ADC0_BASE、3、* ISR_ADC0);
ADCIntClear (ADC0_BASE、3);
ADCIntEnableEx (ADC0_BASE、ADC_INT_SS3);
IntEnable (INT_ADC0SS3);
ADCIntEnable (ADC0_BASE、3);
ADCSequenceEnable (ADC0_BASE、3);

TimerIntRegister (Timer1_base、timer_A、* ISR_Timer1A);
TimerIntEnable (Timer1_base、timer_TINA_TIMEOUT);

IntMasterEnable ();

TimerEnable (TIMER0_BASE、timer_A);
TimerEnable (Timer1_base、timer_A);

while (1){
}
返回0;
}

谢谢

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

    很抱歉耽误你的回答。

    今天、我将按照 Robert 的建议向程序添加中断。 但是、当我打开 CCS 时、我发誓、我刚刚运行了代码、该代码在没有任何修改的情况下运行、它不再工作。 我在终端中收到初始化消息、但没有转换值。 我回到第一个问题,ADC 工作时感觉:(现在地球上的问题是什么? 我的意思是、它在多个延迟和 ADC 引脚上运行得很完美、但正如星期六的工作情况一样、我刚刚关闭了 CCS。 今天打开了它、只需运行代码、(几乎)什么也不起作用。

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

    您能否重新共享您的 main.c 文件、以便我可以将其加载到您之前发送的项目中并尝试在我的末尾运行它?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此处为:

    e2e.ti.com/.../3644.main.c

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

    我怀疑您根据我对系统时钟管理的建议所做的更改无法正确保存、因为您与我共享的文件中仍然使用了错误的时钟设置。

    我使用了你在新文件中提供的每一行代码、包括新的33333 SysCtlDelay、并且这个示例没有问题。

    请查看这是否是设法恢复为非功能设置的时钟设置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当然、我意外地从另一个项目中发送了主文件。 很抱歉,我的错。  

    具有 PLL 时钟源的代码工作正常。 但是、另一个也不应该工作、因为电路板的 PIOSC 是16MHz 吗?

    我还想说的是、使用 ProcessorTrigger、使用 ADC 的中断触发器已经成功了。 我将尝试使用计时器。

    感谢大家的帮助、如果我的尝试成功、我将很快报告

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

    询问" MCU (过去的)如何运行-和执行-系统时钟是否已被"改编"、这是否"公平/恰当"?   "系统时钟"(始终为常)未找到 JTAG 的错误吗?  (导致可怕的、经常发生的锁定!)

    因此-验证"系统时钟"作为海报的"固化"、"无法实现预期的定时器中断"[证明)是不合适的。    (此供应商建议确实有效-但"绝不"保证"验证!")   海报(静止)报告(续)"无法实现预期的计时器中断"-他不能实现吗?

    [报价用户="Luiz Felipe K Evaristo"]我将很快报告"如果"我的尝试正常工作

    那么、如何在此处将(任何)帖子标记为"已验证"?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    否、重新配置系统时钟解决了 ADC 无法正常工作的问题、尚未讨论计时器中断。 但是、在我的第一个项目上修改 SystemClock 配置、现在它也可以处理计时器中断。

    我正在考虑我的问题是否得到解决、但有关 PIOSC 作为 MCU 的源时钟的问题仍然存在。 似乎 MCU 确实以16MHz 时钟频率 PROM PIOSC 运行、但某些外设不运行、例如 ADC。 调整项目的其他方面、可以按照我的目标、在120MHz 时运行 MCU、在16MHz 时运行外设。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我还要感谢你,帮助我解决这些问题(这恰好是"愚蠢"的事情)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Luiz、

    只要 ADC 最终获得一个16MHz 时钟输入、PIOSC 就不会被使用。

    我尝试在 LaunchPad 上使用您在文件中提供的以下设置:

    SysCtlClockFreqSet ((SYSCTL_OSC_INT | SYSCTL_USE_OSC)、16000000); 

    我能够让 ADC 与您提供的使用轮询方法的示例一起运行。

       在外设启用后、您可以尝试使用 while (!SysCtlPeripheralReady (Periph))吗? 我注意到这种情况不存在、这可能证明是非常有价值的。

    请注意、我不需要执行  while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0));检查以获得先前的结果、但考虑到您的情况的怪异、这仍然是一个很好的做法、并且可以获得积极的结果。

    我还认为最好澄清 CB1对以下问题的关注:如果 SYSCLK 更改证明可以解决问题、那么是否运行了任何代码、这是一个有效的问题... 之前的设置是否使用我在上面发布的代码? 如果是这样、那么代码至少应该在计时不会导致 JTAG 丢失和混淆的原则下运行。

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

    鉴于今天(较早时)的"攻击"-享受"适当交流"技术问题/理解的方式是多么令人耳目一新...

    同样、没有人对您的方向提出异议、但正如您所注意到的、海报的描述并不特别令人欣慰、"仍有很多"(仍然)"空中!" 当公司/我"为技术筹集资金"时、此类问题通常是"交易断路器"。 最好是"让用户"习惯处理硬事实、真实事实和持续事实"(您经常寻求)、他人可能会复制这些事实、从而证明(几乎总是)其有效性。 (现金登记册(仅限当时)发出令人愉悦(且通常是储蓄)的铃声!) 有些人可能会注意到、"注意细节"并不(完全)"油漆 CB1作为"坏家伙!"

    我 crüe 到我们的外部仓库-昨天是"在 Chi 的全天热记录"。 (今天再次高于90°F ...) (请参阅 CB1 "论坛上"和"移动仓库...")
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    在轮询示例中、使用 MCU 时钟 prom PIOSC 并通过 PIOSC 设置 ADC 时钟、同时 (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0)){} 也无法正常工作。

    是的、我最初使用 PIOSC 为 MCU 计时、也尝试使用25MHz 的 MOSC、对于某些代码和时间、它们确实工作正常、但很快就停止了。 PLL 的使用似乎更可靠、至少现在是如此。  

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

    您好、Luiz、

    您是否使用 SysCtlPeripheralReady API 直接*在之后*使用 SysCtlPeripheralEnable API? 如果是这样、如果它不起作用、这会令人不安、并指出其他一些潜在问题...

    同样、订单应为:

    //
    //必须启用 ADC0外设才能使用。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0)); 

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

    或更高


    // //必须启用 ADC0外设才能使用。 // SysCtlPeripheralEnable (SYSCTL_Periph_ADC0); while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0)){ }

    Robert

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

    是的、我确实复位了 ADC:  

    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
    SysCtlPeripheralReset (SYSCTL_Periph_ADC0);
    
    while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0)){
    
    }