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**** 2534260 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/577141/ccs-msp432p401r-adc14----trying-to-trigger-autoscan-with-timer

部件号:MSP432P401R

工具/软件:Code Composer Studio

是否可以定期触发ADC在自动扫描模式下采样? 我希望ADC的设置能够定期读取传感器阵列,但不能连续读取。 我尝试组合驱动程序库示例 
"adc14_multiple_channel_no_repeer"和"adc14_single conversion _repeer_timera_source",使用我认为可以工作的两个部分。 我现在拥有的代码仅对序列进行转换
一次,再也不会进入ISR。 我的项目将要求传感器阵列以15 - 25 Hz的速率进行采样。

如果有人能查看我的代码并给我一些见解,我将不胜感激。

/*
--------------------------------------------
* MSP432驱动程序库- v3_21_00_05
*----------------------------------
*
**-版权所有-,BSD,BSD
*版权所有(c) 2016,Texas Instruments Incorporated
*保留所有权利。
*
**
允许以源代码和二进制格式重新发布和使用,无论是否进行*修改,只要
满足以下条件*:
*
****重新发布源代码必须保留上述版权
*声明,此条件列表和以下免责声明。
*
***以二进制格式重新分发时,必须在

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

未经事先书面许可,不得使用德州仪器(TI)公司的名称或*其贡献者的名称来支持或促销由本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*,

不提供任何明示或暗示的担保,包括但不限于*对适销性和特定*用途适用性的暗示担保。 在任何情况下,版权所有者或
*贡献者均不对任何直接,间接,附带,特殊,
*示范, 或后果性损害(包括但不限于
*购买替代商品或服务;使用,数据或利润损失;
(*或业务中断),但根据任何责任理论
,*无论是合同,严格责任还是侵权行为(包括疏忽或
*其他),均因使用本软件而导致*
,即使已被告知此类损害的可能性。
-/copyright--*//*******************************************************************************************************

* MSP432 ADC14 -无重复的多通道采样
*
*说明:在此代码示例中,
用户A DriverLib API演示了能够扫描多个* ADC通道的功能。 转换
*内存寄存器ADC_MEM0 - ADC_MEM7被配置
为分别从A0-A7读取转换*结果。 转换已启用,然后使用
软件切换*切换采样。 未启用重复模式,且仅*执行一次采样
(预期用户暂停调试器以观察
*结果)。 采集完最终样本后
,将触发* ADC_MEM7的中断,结果将存储在结果缓冲区中。
*
** MSP432P401
* -----------
* /|\\| |
* || |
* --|RST WFP 5.5 |<--- A0 (模拟输入)
* | WFP 5.4 |<--- A1 (模拟输入)
* | WFP 5.3 |<-- A2 (模拟输入)
* | WFP 5.2 |<-- A3 (模拟输入)
* | WFP 5.1 |<-- A4 (模拟输入)
* | WFP 5.0 |<-- A5 (模拟输入)
* | WFP 4.7 |<-- A6 (模拟输入)
* | WFP 4.6 |<-- A7 (模拟输入)
* | |
* | |
*
*作者:Timothy Logan
****************************************************************************** /*
DriverLib包括*/
#include "driverlib.h"

/* Standard包括*/
#include <stdint.h>
#include <stdbool.h>
#include <string.h>

static uint16_t resultsBuffer[8];

/* Timer_a Continuous Mode Configuration parameter */
const {_a_UpModeConfig upModeConfig = Timer

Timer_A_CLOCKSOURCE_ACLK, // ACLK时钟源
Timer_a_CLOCKSOURCE_diver_1, // ACLK/1 = 32kHz
1.6384万,
Timer_a_TAIE_INTERRUST_DISABLE, //禁用计时器ISR
Timer_a_CCIE_CCR0_interrupT_disable,//禁用CCR0
Timer_a_DO清除 //清除计数
器};/*

Timer_A比较配置参数*/
const Timer_a_CompareModeConfig compareConfig ={

Timer_a_CAPTURECOMPare_register_1, //使用CCR1
TIMER_A_CAPTURECOMPARE_INTERRUCE_DISABLE,//禁用CCR中断
Timer_a_OUTPUTMODE_SET_RESET, //切换输出,但是
1.6384万 // 1.6万句点
};

int main(void){

/*正在停止WDT */
MAP_WDT_A_HoldTimer();
MAP_Interrupt_enableSleepOnIsrExit();

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

/*设置时钟
* MCLK = MCLK = 3MHz
* ACLK = REFO = 32kHz */
MAP_CS_INITClockSignal (CS_ACLK,CS_REFOCLK_SELECT,CS_CLock_diver_1);

/*将参考电压设置为2.5 并启用参考*/
MAP_REF_A_setReferenceVoltage (REF_A_VREF2_5V);
MAP_REF_A_enableReferenceVoltage();

/*初始化ADC (MCLK/1/1)*/
MAP_ADC14_enableModule();
MAP_ADC14_INITModule (ADC_CLOCKSOURCE_MCLK,ADC_PREDIVIDER_1,ADC_DIVIDER_1,
0);

/*为模拟输入配置GPIO */
MAP_GPIO设置外围模块功能输入引脚(GPIO_PORT_P5,
GPIO _PIN5 | GPIO _PIN4 | GPIO _PIN3 | GPIO _PIN2 | GPIO _PIN1
| GPIO_PIN0,GPIO三级模块功能);
MAP_GPIO设置外围模块功能输入引脚(GPIO_PORT_P4,
GPIO_PIN7 | GPIO _PIN6,GPIO _Tertiary_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);
//------------------

/*在连续模式下配置Timer_A,来源为ACLK */
MAP_Timer_a_configureUpMode(Timer_A0_base,&upModeConfig);

/*在CCR1中将Timer_A0配置为在1.6万 (0.5s)*/时触发
MAP_Timer_a_initCompare(timer_A0_base,&compareConfig);

/*将样本触发器配置为来自Timer_A0并进行设置
*在触发后自动迭代*/
MAP_ADC14_setSampleHoldTrigger (ADC_TRIGG_SOURCE1,FALSE);
MAP_ADC14_enableSampleTimer(ADC_MANUAL_ITED);

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

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

/*启动计时器*/
MAP_Timer_a_startCounter (TIMER_A0_BASE,TIMER_A_UP_MODE);

/*进入睡眠状态*/
同时(1)
{
MAP_PCM_GotoLPM0();
}
}/*


只要转换完成并放置在
* ADC_MEM7中,就会激发此中断。 这表示转换结束,结果数组
被*抓取并放置在resultsBuffer*/
void ADC14_IRQHandler(void)
{
UINT64_t状态;

状态= MAP_ADC14_getEnabledInterruptStatus();
MAP_ADC14_clearInterruptFlag (状态);

IF (状态和ADC_INT7)
{
MAP_ADC14_getMultiSequenceResult (结果缓冲区);
}

}