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/MSP432P401R:ADC14、多通道重复

Guru**** 2604225 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/651890/ccs-msp432p401r-adc14-multiple-channel-repeat

器件型号:MSP432P401R

工具/软件:Code Composer Studio

我想使用 MSP432 SDK 中提供的 DriverLib 同时读取多个 ADC 值。  

我编辑了 adc14_multiple_channel_no_repex.c 以重复相同的操作。

我在示例代码中更改的所有内容都是  

MAP_ADC14_configureMultiSequenceMode (ADC_MEM0、ADC_MEM7、false); 

 更改为

MAP_ADC14_configureMultiSequenceMode (ADC_MEM0、ADC_MEM7、TRUE); 

我认为这就是要对示例代码进行的所有更改。

我在下面添加了完整代码。


/*-版权所有-、BSD
*版权所有(c) 2017、德州仪器(TI)公司
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
*--/版权--*/

* MSP432 ADC14 -多通道无重复采样
*
说明:在此代码示例中、
用户 A 演示了能够扫描多个* ADC 通道的功能 DriverLib API。 转换
*内存寄存器 ADC_MEM0 - ADC_MEM7被配置为分别从
A0-A7读取转换*结果。 转换被启用、然后使用
一个软件切换来*切换采样。 重复模式未启用、仅采样
*发生一次(用户应暂停调试器以观察
*结果)。 在获取最终样本后
、* ADC_MEM7的中断被触发、结果存储在 resultsBuffer 缓冲区中。
*
* MSP432P401
* ----------
* /|\| |
* || |
* -|RST P5.5 |<-- A0 (模拟输入)
* | P5.4 |<-- A1 (模拟输入)
* | P5.3 |<-- A2 (模拟输入)
* | P5.2 |<-- A3 (模拟输入)
* | P5.1 |<-- A4 (模拟输入)
* | P5.0 |<-- A5 (模拟输入)
* | P4.7 |<-- A6 (模拟输入)
* | P4.6 |<-- A7 (模拟输入)
* | |
* | |
*
(小部分 /*
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_1、
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、TRUE);
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);
}

} 


这似乎是正确的、但 ADC 不会连续读取所有引脚、即使在给定输入下、P5.4等某些引脚甚至也不显示采样。

结果仅显示在 resultsBuffer[]的前两个索引中,而不显示在其它任何索引上。  

我有什么问题吗? 我不熟悉 MSP432。

谢谢你。

Viswanath。

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

    Viswanath、

    请参阅此线程、它被注意为 MAP_ADC14_getMultiSequenceResult 函数中的错误、应在下一个 SDK 中解析。

    e2e.ti.com/.../648858

    上述链接中也提供了建议的权变措施。