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.

[参考译文] MSP432P401R:不含重复的多通道采样仅返回前两个值

Guru**** 2602075 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/648858/msp432p401r-multiple-channel-sample-without-repeat-only-returns-the-first-two-values

器件型号:MSP432P401R

您好、

我正在尝试使用 不重复的多通道采样示例。 但我在运行 MAP_ADC14_getMultiSequenceResult (resultsBuffer);函数时遇到一些问题。  

它仅更改 resultsBuffer 中的前两个值。 我正在使用资源浏览器中的确切示例。  所以我不明白为什么它不起作用。 下面是我使用的示例代码:

/* DriverLib 包括*/
#include 

/*标准包括*/
#include 

#include 

静态 uint16_t resultsBuffer[8];

int main (void)
{
/*停止 WDT */
MAP_WDT_A_HOLDTimer();
MAP_Interrupt_enableSlepOnIsrExit();

/*零填充缓冲器*/
memset (resultsBuffer、0x00、8);

//![简单 REF 示例]
/*将基准电压设置为2.5并启用基准*/
MAP_REF_A_setReferenceVoltage (REF_A_VREF2_5V);
map_REF_A_enableReferenceVoltage();
//![简单 REF 示例]

/*初始化 ADC (MCLK/1/1)*/
MAP_ADC14_enableModule();
MAP_ADC14_initModule (ADC_CLOCKSOURCE_MCLK、ADC_PREDIVIDER_1、ADC_DIVIDER_4、
0);

/*在*/中为模拟配置 GPIO
MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P5、
GPIO_PIN5 | GPIO_PIN4 | GPIO_PIN3 | GPIO_PIN2 | GPIO_PIN1
| GPIO_PIN0、GPIO_TICE_MODULE_FUNCTION);
MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P4、
GPIO_PIN7 | GPIO_PIN6、GPIO_Terti_MODULE_FUNCTION);


/*配置 ADC 存储器(ADC_MEM0 - ADC_MEM7 (A0 - A7)、无需重复)
*具有内部2.5V 基准*
MAP_ADC14_configureMultiSequenceMode (ADC_MEM0、ADC_MEM7、false);
MAP_ADC14_configureConversionMemory (ADC_MEM0、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A0、false);
MAP_ADC14_configureConversionMemory (ADC_MEM1、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A1、false);
MAP_ADC14_configureConversionMemory (ADC_MEM2、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A2、false);
MAP_ADC14_configureConversionMemory (ADC_MEM3、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A3、false);
MAP_ADC14_configureConversionMemory (ADC_MEM4、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A4、false);
MAP_ADC14_configureConversionMemory (ADC_MEM5、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A5、false);
MAP_ADC14_configureConversionMemory (ADC_MEM6、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A6、false);
MAP_ADC14_configureConversionMemory (ADC_MEM7、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A7、false);

/*在通道7 (序列结束)上进行转换时启用中断
*已完成并启用转换*/
MAP_ADC14_enableInterrupt (ADC_INT7);

/*启用中断*/
MAP_Interrupt_enableInterrupt (INT_ADC14);
MAP_Interrupt_enableMaster();

/*将采样计时器设置为自动单步执行序列
*转换。
*
MAP_ADC14_enableSampleTimer (ADC_AUTOMATE_DIOTIVation);

/*触发样本开始*/
MAP_ADC14_enableConversion();
MAP_ADC14_toggleConversionTrigger ();

/*正在休眠*/
while (1)
{
MAP_PCM_gotoLPM0 ();
}
}

//每当转换完成并放置在
* ADC_MEM7中时,就会触发此中断。 这表示转换结束、结果数组
被*抓取并放置在 resultsBuffer */
void ADC14_IRQHandler (void)
{中
uint64_t status;

STATUS = MAP_ADC14_getEncableInterruptStatus();
MAP_ADC14_clearInterruptFlag (status);

if (status & ADC_INT7)
{
MAP_ADC14_getMultiSequenceResult (resultsBuffer);
}

}

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

    仅为清楚起见:此调用会填充所有8个数组元素、但在后续运行结果中、Buffer[2]->[7]始终相同(对于 ADC 而言是不可能的)。

    如果用户认为 CCS 提供的 driverlib.c 与 ROM 中的 driverlib.c 匹配、则 ADC14_getMultiSequenceResult 中会出现一个增量错误。

    它会创建一个指向 ADC14MEM0的指针作为 uint32_t *、但会针对每个项目将该指针递增0x04。 因此、它将填充 ADC14MEM4中的 Result Buffer[1]、ADC14MEM8中的 resultBuffer[2]等。 由于 ADC14MEM8及以上版本未被 ADC 存储、它们不会从运行变为运行(但它们通常为非零、从而完成了幻想)。

    权变措施似乎是不使用此函数并自行复制结果。 您可以将 ADC14MEM0-7视为数组(此函数确实如此)、只需将连续的32位字复制到 resultBuffer[]的16位字。

    为了让每个人都有一个旅行、CCS 告诉我的是[ROM] driverlib.c 中的内容(我删除了一些空格)。

    void ADC14_getMultiSequenceResult (uint16_t* res)
    {
    uint32_t *startAddr、*curAddr;
    uint32_t ii;
    startAddr =(uint32_t*)_ctlRegs[(ADC14->rCTL1.r 和 ADC14CSTARTADD_M) >>16];
    curAddr = startAddr;
    对于(ii = 0;ii < 32;i++)
    {
    Res[i]=*(((uint16_t*) curAddr)+ 0x40);
    IF (BITBAND_peri ((* curAddr)、ADC14EOS_OFS))
    中断;
    if (curAddr =_ctlRegs[31])
    curAddr =(uint32_t*)_ctlRegs[0];
    其他
    curAddr += 0x04; //<-------------------- 递增16
    }
    } 

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

    Thijs 和 Bruce、

    我可以确认这是一个错误、我将尽快提交一个 TT 以解决此问题。  

    下面是 ISR 的工作解决方法。  

    /*只要一个转换完成并被放置在
    * ADC_MEM7中、这个中断就会被触发。 这表示转换结束、结果数组
    被*抓取并放置在 resultsBuffer */
    void ADC14_IRQHandler (void)
    {中
    uint64_t status;
    
    STATUS = MAP_ADC14_getEncableInterruptStatus();
    MAP_ADC14_clearInterruptFlag (status);
    
    if (status & ADC_INT7)
    {
    // MAP_ADC14_getMultiSequenceResult (resultsBuffer);
    resultsBuffer[0]= MAP_ADC14_getResult (ADC_MEM0);
    resultsBuffer[1]= MAP_ADC14_getResult (ADC_MEM1);
    resultsBuffer[2]= MAP_ADC14_getResult (ADC_MEM2);
    resultsBuffer[3]= MAP_ADC14_getResult (ADC_MEM3);
    resultsBuffer[4]= MAP_ADC14_getResult (ADC_MEM4);
    resultsBuffer[5]= MAP_ADC14_getResult (ADC_MEM5);
    resultsBuffer[6]= MAP_ADC14_getResult (ADC_MEM6);
    resultsBuffer[7]= MAP_ADC14_getResult (ADC_MEM7);
    
    }
    
    } 

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

    Bruce、您好!

    感谢您的快速响应。 我  已经重写了驱动程序库代码,现在它工作正常,谢谢:)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    或者您也可以这样做:)错误归档,这可能会在 Q1 SDK 发行版中修复(3月或3月左右,仅供参考)。 无论哪种方式、都很高兴您能继续前进!