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.

[参考译文] MSP430F6736A:看门狗复位后、ADC 不工作

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1347224/msp430f6736a-adc-not-work-after-reset-the-watchdog-reset

器件型号:MSP430F6736A

当 ADC 被中断但无法正常工作时、我试图将看门狗复位、但 ADC 在复位后仍然不工作

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

    您是想了解 SD24还是 ADC10? ADC10不能通过 PUC (包括看门狗)进行复位、因此它会继续执行所做的工作[参考(例如)用户指南(SLAU208Q)表27-3;注意所有符号"-(0)"、意思是"在 POR 上复位、而不是 PUC 上复位"]。 相比之下、SD24被一个 PUC 复位后出现。

    如果 ADC10ENC 仍被设置、那么很多位将无法改变。 可能最好的策略是在 ADC 初始化函数中执行一个重置序列,先停止后启动。

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

    谢谢 Bruce! 我现在有一个问题:我的问题是关于 ADC10:我现在使用的功能包括,ADC24、ADC10、eUSCI;Timer_A 和 SPI,我的控制器似乎每月出现两次问题,关于 ADC10不只是运行。 当我传递命令触发看门狗时,它不起作用(现在我知道"ADC10不是由 PUC (包括看门狗)复位")所以我想 konw 这一问题的原因可能是什么,你说"也许最好的策略是执行一个复位序列--先停止后启动-- 说明 ADC 初始化函数中的   方法"、它是如何工作的、您能给我更详细的方法吗?谢谢!

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

    许多年前我遇到这种情况时(在 F2系列上)、我记得我使用了一个相当钝的复位序列、类似"ADC10CTL0=0;ADC10CTL1=0;ADC10CTL0=0;"。 目标是清除(至少) ADC10ENC、ADC10CONSEQ、ADC10MSC 和 ADC10ON。  

    更一般地说、我习惯了将外设寄存器初始化为已知值("="而不是"|=")、而不是依赖于用户指南中的复位值。

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

    谢谢 Bruce!  我可以通过以下方式重现问题:

    #pragma vector=DMA_VECTOR
    __interrupt void DMA0_ISR (void) {
      switch (__even_in_range(DMAIV,16))
      {
          case  0:
            break; //No interrupt
          case  2: //DMA0IFG
          {
            //128 conversions complete
            //Disable Conversions without pre-empting any conversions taking place.
            ADC10_A_disableConversions(ADC10_A_BASE,ADC10_A_PREEMPTCONVERSION);   //  ADC10_A_COMPLETECONVERSION
            AdConvFinshFlag = 1;
          }break;
          default: 
            break;
      }
    }

    而且 、当我运行仿真时、我通过在中断中设置两个断点并 逐步运行来执行此操作、ADC10问题 肯定会出现;我尝试使用您的方法复位 ADC10,它也不起作用:

    if(ADC10_A_isBusy(ADC10_A_BASE) == ADC10_A_BUSY)
          {
            ADC10_A_disable(ADC10_A_BASE);  // close adc10A
            HWREG16(ADC10_A_BASE + OFS_ADC10CTL0) &= ~(ADC10ENC);
            // Force reset ADC10 register
            HWREG16(ADC10CTL0) = 0;
            HWREG16(ADC10CTL1) = 0;
            HWREG16(ADC10CTL2) = 0;
            HWREG8(ADC10MCTL0) = 0;
            HWREG16(DMACTL0) = 0;
            HWREG16(DMA0CTL) = 0;
            
            InitAdc();
            g_AdcFinshTimeout = g_TickMS;
            PrintfLog("Adc Init",0);
          }

    我试着查看 ADC10的寄存器数据、发现在复位代码被执行后、ADC10ON 位不能被复位:

    因此、 我想知道我是否在做正确的事情、以及是否有其他方法强制 ADC10ON 位关闭;谢谢!

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

    1)事实证明还有一个步骤;序列实际上:

      ADC10CTL1 = 0;
      ADC10CTL0 = 0;
      ADC10CTL1 = 0;
      ADC10CTL0 = 0;

    2) 2)给 CTL1的附加(初始)写入显然是为了写入 CONSEQ=0。 这是在 F2器件上、我刚刚注意到、在 F5系列 ADC10中、当 ENC=1时 CONSEQ 不可写入、但它在 F2中。 F5用户指南[(SLAU208Q)第 27.2.7.6节、项目符号4 ]中的说明与 F2系列 UG [(SLAU144K)第 22.2.6.6节中的相应部分中的说明相同、因此我不确定其中的说明。

    3) 3)我没有您的设备、因此您可能需要进行实验。

    4) 4)未经请求:我不确定您应该对 ADC10BUSY 进行这种调节、因为 ADC 可能会暂时空闲(在样本之间)、但仍然有效。 我建议您始终执行重置序列、因为它(假定)很少见、不会花费太多。

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

    感谢您的耐心! 布鲁斯! 我 ;按您的方式处理模拟故障、当 ADC 不工作时、复位序列也不能复位 ADC10 μ s。如果 ADC 不工作、除了 POR 或 RST 下拉电阻、有其他方法可以复位 ADC? 当我使用复位序列时、ADC10ON 位仍然打开。 这就是它无法再次初始化的原因吗? 还有一个问题:如果我使用单个通道重复转换、我想在这次转换后切换通道。 以下操作是否正确:

    void SetAdChannelNo(uint8_t AdNo)
    {
      AdConvFinshFlag = 0;
      AdValueType = AdNo;
      AdCurChannel = AdNo;
          
      HWREG16(ADC10_A_BASE + OFS_ADC10CTL0) &= ~(ADC10ENC);
      
      while((HWREG16(ADC10_A_BASE + OFS_ADC10CTL1) & ADC10BUSY));
      
      ADC10_A_enable(ADC10_A_BASE);  // open adc10A
      ADC10_A_configureMemory(ADC10_A_BASE,AdCurChannel,ADC10_A_VREFPOS_AVCC,ADC10_A_VREFNEG_AVSS);
    
      ADC10_A_startConversion(ADC10_A_BASE,ADC10_A_REPEATED_SINGLECHANNEL);  
      
    }
    

    谢谢!

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

    2) 2)根据 UG Sec、切换信道的顺序看起来正确  27.2.7.6。但我没有带有 ADC10的 F5/F6器件、因此您必须尝试一下、看看。

    1) 1)如果 ADC10ON 不清除、这意味着当您尝试清除 ADC10ENC 时、它(或者至少之前)仍然处于开启状态。 UG 似乎没有意思、但 ADC10ENC 有可能一直保持打开状态、直到 ADC10 (最终)停止。 在设定 ADC10ON=0前、也许你需要打开 ADC10BUSY (或者也许是 ADC10ENC)。

    我刚刚注意到 ADC10_A_disableConversions (假设为)将设置 CONSEQ=0、即使此时 ENC=1、这种限制[UG 表27-4]也是无效的。 也就是说、后续的"如果"测试看起来可疑(始终是真的?) 那么、该函数可能是偶然发生的。

    [编辑:"不工作"的症状是什么? 我已经假设您在 ADC 处于激活状态时设置 ADC10SC (在 PUC 后)会遇到勘误表 ADC42 [参考勘误表(SLAZ646S) p 6];但这也许是有所不同的吗?]

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

    谢谢 Bruce!  我在开始下一次转换前确定了繁忙状态;但是、 仍然可能是 ADC 不工作(在 DMA 中断中设置断点时、我有意中断了 ADC 时序、目的是模拟 ADC 故障;无法触发 ADC 相关的 DMA 中断);当确定 ADC 不工作时、我注意到繁忙状态为 始终置位;我等待了十多分钟、但仍被置位;而使用复位序列时、并不会复位 ADC。 现在我想知道当 ADC 不工作时如何通过软件复位 ADC?

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

    我不知道有什么(带外)机制可复位 ADC10。 我认为唯一的方法是"去初始化"它。 这意味着(A)设置 CONSEQ=0 [可能吗?] (b)设置 ENC=0 (c)确保 BUSY=0 (或 ENC=0)(d)清除所有其余字段。

    我不确定 DMA ISR 中的断点会如何触发(模拟) ADC 挂起。 如果你停止 DMA、我认为 ADC 将继续运行(丢弃样本)。 也就是说、上面的存储器显示屏似乎显示为您在使用 ssel=MCLK、它肯定会在一个断点处停止。

    或者您是否观察到挂起发生在调用您上面发布的 switch 通道函数后? 看门狗复位。