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.

[参考译文] MSPM0G3507:ADC0的 IRQHandler

Guru**** 2392635 points
Other Parts Discussed in Thread: MSPM0G3507

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1515282/mspm0g3507-irqhandler-for-adc0

器件型号:MSPM0G3507

工具/软件:

Im 在新 MSPM0G3507中返回到该 ADC 代码、但我不确定是否需要

#include "ti/devices/msp/m0p/mspm0g350x.h"
#include "ti/driverlib/dl_adc12.h"
#include "ti/driverlib/dl_common.h" // For DL_Common_delayCycles function
#include "ti_msp_dl_config.h"
#include "IndexMacros.h"
#include "stdio.h"
uint16_t threshold = 1;//16384 / 2; // VCC/2 or 1.15V
int i=0;
int j=0;

int main (void)
{

  ADC0->ULLMEM.GPRCM.CLKCFG = 0xA9000000; // ULPCLK
  ADC0->ULLMEM.CLKFREQ = 7;               // 40-48 MHz
  ADC0->ULLMEM.CTL0 = 0x03010000;         // divide by 8
  ADC0->ULLMEM.CTL1 = 0x00000000;         // mode
  ADC0->ULLMEM.CTL2 = 0x00000000;         // MEMRES
  ADC0->ULLMEM.MEMCTL[0] = 3;             // channel 3 PA24 ADC1pin
  ADC0->ULLMEM.SCOMP0 = 0;                // 8 sample clocks
  ADC0->ULLMEM.CPU_INT.IMASK = 0;         // no interrupt

   ADC0->ULLMEM.CTL0 |= 0x00000001;             //  enable conversions
   ADC0->ULLMEM.CTL1 |= 0x00000100;             //  start ADC
   uint32_t volatile delay=ADC0->ULLMEM.STATUS; //  time to let ADC start

NVIC->IP[1] = 1<<4; // ADC0 is IRQ 4
NVIC->ISER[0] = 1<<4; 
NVIC->IP [1] = (NVIC->IP [1] & (~0xFF000000)) | (2<<6) ;  
__enable_irq();

  while(1)
  {
    //ADC0->CTL0 |= ADC0_CTL0_ENC | ADC0_CTL0_SC;
    printf("NoData\n");
    DL_Common_delayCycles(40000000); // 1/2 sec
    j++;
  }
         
}
void ADC0_IRQHandler(void) 
{
    uint16_t adcRaw = ADC0->ULLMEM.MEMRES[0];
    while((ADC0->ULLMEM.STATUS&0x01)==0x01)
    {
      if(adcRaw>0)
      {
      i=i+1;
      printf("ADC = %d \n", i);
      }
    }

}
处理程序请 TI 需要输入

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

    > ADC0->ULLMEM.CPU_INT.IMASK = 0;//无中断

    当 IMASK=0时、ADC 不会生成任何中断、因此在这种情况下不需要 ADC0_IRQHandler。

    但是,我在 main()中看不到任何检查是否完成的内容,我确实看到了 NVIC 的一些设置,这表明您打算获取完成中断。 如果启用一个或多个 IMASK 条件、则   需要 ADC0_IRQHandler。

    您是如何设想该计划将会运行的?

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

    我看到我问的好东西, Im 从我的 MSP432代码 Im semi new graden 和它的我的第五个 MC 的代码,我在注册级别工作,所以原谅我,如果我听起来不好。 在432中、我们使用了 ADC 的处理程序、如何操作呢? 下面是我的旧代码  

    #include "msp.h"
    uint16_t threshold = 16384 / 2; // VCC/2 or 1.15V
    void main(void)
    {
        WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; // stop watchdog timer
        // Enable ADC Pins
        P5->SEL0 |= BIT0;
        P5->SEL1 |= BIT0;
    
        // Enable on-board LED
        P2->DIR |= BIT2;     // Bit Set P2.2
        P2->OUT &= ~(BIT2);  // Bit Clear P2.2
        P2->SEL0 &= ~(BIT2); // Bit Clear SEL0 for P2.2
        P2->SEL1 &= ~(BIT2); // Bit Clear SEL1 for P2.2
        // Set-Up for ADC
        ADC14->CTL0 |= ADC14_CTL0_SHP | ADC14_CTL0_CONSEQ_0 | ADC14_CTL0_ON; //
        ADC14->MCTL[0] = ADC14_MCTLN_INCH_5;                                 // set ADC channel as A5 = P5.0
        ADC14->CTL1 |= ADC14_CTL1_RES__14BIT;                                // set resolution as a 14 bits resolution
        ADC14->IER0 |= ADC14_IER0_IE0;                                       // interrupt for mem 0
    
        // enable NVIC for ADC14
        NVIC->ISER[0] |= 1 << ((ADC14_IRQn)&31); // enable nvic
    
        // enable global interrupts
        __enable_irq();
    
        while (1)
        {
            __delay_cycles(1000000);                       // delay
            ADC14->CTL0 |= ADC14_CTL0_ENC | ADC14_CTL0_SC; // start conversion and enable conversion
        }
    }
    void ADC14_IRQHandler(void)
    {
        uint16_t adcRaw = ADC14->MEM[0]; // read adc data
    
        if (adcRaw > threshold) // Vcc/2 -> 3.04/2
        {
            P2->OUT = BIT2; // turn on BLUE led
        }
        else
        {
            P2->OUT &= ~(BIT2); // turn off LED
        }
    }
    

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

    您好、

    同意 Bruce 的观点。 代码中似乎不需要 ADC 中断例程、因为您没有在 IMASK = 0时启用 ADC 中断;

    此致、

    现金好

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

    我更新了代码、但我认为 NVIC 有问题、我做了单独的代码、是的、您都是正确的、我能够使 ADC 在没有中断的情况下正常工作、但现在 Im 正在尝试处理程序

    #include "ti/devices/msp/m0p/mspm0g350x.h"
    #include "ti/driverlib/dl_adc12.h"
    #include "ti/driverlib/dl_common.h" // For DL_Common_delayCycles function
    #include "ti_msp_dl_config.h"
    #include "IndexMacros.h"
    #include "stdio.h"
    
    int counter=1;
    int main (void)
    {
    
      ADC0->ULLMEM.GPRCM.RSTCTL = 0xB1000003; // reset ADC0 pins
      ADC0->ULLMEM.GPRCM.PWREN = 0x26000001;  // activate ADC0 pins
      DL_Common_delayCycles(40000000); // 1/2 sec delay
    
      ADC0->ULLMEM.GPRCM.CLKCFG = 0xA9000000; // ULPCLK
      ADC0->ULLMEM.CLKFREQ = 7;               // 40-48 MHz
      ADC0->ULLMEM.CTL0 = 0x03010000;         // divide by 8
      ADC0->ULLMEM.CTL1 = 0x00000000;         // mode
      ADC0->ULLMEM.CTL2 = 0x00000000;         // MEMRES
      ADC0->ULLMEM.MEMCTL[0] = 3;             // channel 3 PA24 ADC0pin
      ADC0->ULLMEM.SCOMP0 = 0;                // 8 sample clocks
    
      ADC0->ULLMEM.CPU_INT.IMASK |= (1<<0);  // arm PA24 1<<24  
    
    
    
    NVIC->IP [1] = (NVIC->IP [1] & (~0x000000FF))|(2<<6); // ADC0 is IRQ 4
    NVIC->ISER[0] = 1<<4; 
    
    __enable_irq();
    
      while(1)
      {
      ADC0->ULLMEM.CTL0 |= 0x00000001;             //  enable conversions
      ADC0->ULLMEM.CTL1 |= 0x00000100;             //  start ADC
      }
             
    }
    void ADC0_IRQHandler(void) 
    {
        uint16_t adcRaw = ADC0->ULLMEM.MEMRES[0];
    
          if(adcRaw>1000)
          {
            printf("%d\n", counter);
            counter++;
            DL_Common_delayCycles(40000000); // 1/2 sec delay
          }
    }
    

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

    您好、

    我建议调用 API NVIC_EnableIRQ (ADC12_0_INST_INT_IRQN);而不是直接在 NVIC->ISER[0]上运行。

    此致、

    现金好

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

    不需要通过正常工作的中断代码

    #include "ti/devices/msp/m0p/mspm0g350x.h"
    #include "ti/driverlib/dl_common.h" // For DL_Common_delayCycles function
    #include "IndexMacros.h"
    #include "stdio.h"
    int x=0;
    int main(void)
    {
        GPIOA->GPRCM.RSTCTL = 0xB1000003;
        GPIOA->GPRCM.PWREN = 0x26000001;
        DL_Common_delayCycles(24);
    
        //LED
        IOMUX->SECCFG.PINCM[18] = 0x81; // PA8
        GPIOA->DOE31_0 |= (1 << 8);                   // set doe register to enable peripheral (1 means using mode 1 or GPIO)
    
        //SWITCH PA18
        IOMUX->SECCFG.PINCM[39] = 0x00050081;         // PA18 PULLDOWN : 0x0005 means pulldown
    
      // INTERRUPT
      GPIOA->POLARITY31_16 = 0x00000010; // rising
      GPIOA->CPU_INT.ICLR = 1<<18;  // clear bit 18
      GPIOA->CPU_INT.IMASK = 1<<18; // arm PA18 (1<<18)
      
      NVIC->IP[0] = (NVIC->IP[0]&(~0x0000FF00))|2<<6;  // set priority (bits 15,14) IRQ 0
      NVIC->ISER[0] = 1 << 1;            // Group0 interrupt
    
       __enable_irq();
    
        while (1)
        {     
          GPIOA->DOUT31_0 |= (1 << 8); // LED ON
          printf("%d\n",x);
            x++;
            DL_Common_delayCycles(40000000); // 1/2 sec
        }
    }
    void GROUP1_IRQHandler(void)
    { 
    if (GPIOA->CPU_INT.IIDX==19) // 
    {
        GPIOA->DOUT31_0 &= ~(1 << 8); // LED OFF
        printf("paused\n");
        DL_Common_delayCycles(40000000); // 1/2 sec
        GPIOA->CPU_INT.ICLR = (1<<18); // clear bit 18
    
    }
      
    }

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

    您好、

    那么、您的问题是否已解决?

    此致、

    现金好

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

    所以在这一点上,我检查和检查,到目前为止,我的设置是正确的根据 T.I TRM 和根据讲座幻灯片,但有些东西不正确  

    #include "ti/devices/msp/m0p/mspm0g350x.h"
    #include "ti/driverlib/dl_adc12.h"
    #include "ti/driverlib/dl_common.h" // For DL_Common_delayCycles function
    #include "ti_msp_dl_config.h"
    #include "IndexMacros.h"
    #include "stdio.h"
    
    int counter=0;
    int main (void)
    {
     
      ADC0->ULLMEM.GPRCM.RSTCTL = 0xB1000003; // reset ADC0 pins
      ADC0->ULLMEM.GPRCM.PWREN = 0x26000001;  // activate ADC0 pins
      DL_Common_delayCycles(40000000); // 1/2 sec delay
    
      ADC0->ULLMEM.GPRCM.CLKCFG = 0xA9000000; // ULPCLK
      ADC0->ULLMEM.CLKFREQ = 7;               // 40-48 MHz
      ADC0->ULLMEM.CTL0 = 0x03010000;         // divide by 8
      ADC0->ULLMEM.CTL1 = 0x00000000;         // mode
      ADC0->ULLMEM.CTL2 = 0x00000000;         // MEMRES
      ADC0->ULLMEM.MEMCTL[0] = 3;             // channel 3 PA24 ADC0pin
      ADC0->ULLMEM.SCOMP0 = 0;                // 8 sample clocks
      ADC0->ULLMEM.CPU_INT.ICLR = 1<<24;             // clear bit 24
      ADC0->ULLMEM.CPU_INT.IMASK = (1 << 24); // Enable MEM0 interrupt  
    
      NVIC->IP[1] = (NVIC->IP[1]&(~0x0000FF00))|(2<<7);  // set priority (bits 15,14) IRQ 4
      NVIC->ISER[0] = 1 << 4;            // ADC0 interrupt
    
      __enable_irq();
    
      while(1)
      {
      ADC0->ULLMEM.CTL0 |= 0x00000001;             //  enable conversions
      ADC0->ULLMEM.CTL1 |= 0x00000100;             //  start ADC
    
      }
        
    }
    void ADC0_IRQHandler(void) 
    {
      printf("ADC Interrupt Triggered!\n");
      ADC0->ULLMEM.CPU_INT.ICLR = (1 << 24);  //clear flag
    }
    

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

    您好、

    "你听我说。" 但我建议您首先在 SDK 中运行 ADC 演示代码、以检查在这种情况下硬件是否正常。 我还建议使用驱动程序库、而不是直接对寄存器进行操作。  

    此致、

    现金好

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

    什么是不对的? 你能描述你的症状吗?

    ------------------------

    > ADC0->ULLMEM.CPU_INT.IMASK =(1 << 24);//启用 MEM0中断

    根据 TRM (SLAU846B) 图12-12、这启用了您未使用的 MEMRES16。 请尝试:

    > ADC0->ULLMEM.CPU_INT.IMASK = ADC12_CPU_INT_IMASK_MEMRESIFG0_MASK;//启用 MEM0中断。

    ------------------------

    更一般的情况下:我建议您将(CMSIS)名称用于这些设置、以便不会因需要帮助的人而扰频通过 TRM。

    ------------------------

    更普遍的是:尽可能快地设置 SC 的策略是有点不寻常的。 我在 TRM (也没有勘误表)中找到任何内容、该内容禁止(重新)在 ADC 繁忙时启动 ADC、但我不确定这有什么影响。 我见过在这种情况下表现不佳的 ADC。 我建议您等待(可能在_WFI ()中) ADC 完成。

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

    __ WFI ():绝对不需要,但你是100%我需要  

     ADC0->ULLMEM.CPU_INT.IMASK =(1 << 8);//启用 MEM0中断  
    非常感谢您对 TRM 的关注我没有被告知有两个版本和您的帮助我一吨!