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:由 Timer_A 触发的 ADC14多次转换(CAN't 使 ISR 触发....)

Guru**** 2524550 points
Other Parts Discussed in Thread: ENERGIA

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/595404/msp432p401r-adc14-multiple-conversion-triggered-by-timer_a-can-t-get-the-isr-to-trigger

器件型号:MSP432P401R
主题中讨论的其他器件:Energia

大家好、

我原以为我已经完成了、但今天、我无法通过 TimerA 获得实际中断的多通道转换。  我忘记或不理解什么?

提前感谢您的任何想法!

Rob

以下是头文件:

/*
* adc14.h
*
*创建日期:2017年5月2日
* 作者:Frohro
*/

#ifndef ADC14_MULTI_H_
#define ADC14_MULTI_H_
//#include 
#include 

/*标准包括*/
#include 
#include 
#include 
#include 

#define SMCLK_FREQUENCY 48000000

#define SAMPLE_FREQUENCY 8000
#define SAMPLE_LENGTH 128

//void ADC14_IRQHandler (void);
// Timer_A 连续模式配置参数*/
const Timer_A_UpModeConfig upModeConfig =
{
TIMER_A_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
TIMER_A_CLOCKSOURCE_DEVIDER_1、 // SMCLK/1 = 48MHz
(SMCLK_FREQUENCY / SAMPLE_FREQUENCY)/4、//计数数量
//(/4是因为在 Energia 设置中 SMCLK 被4分频、这是串行类所需的)
timer_a_TAIE_interrupt_disable、 //禁用计时器 ISR
TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE,//禁用 CCR0
TIMER_A_DO 清除 //清除计数
器};

// Timer_A 比较配置参数*/
const Timer_A_CompareModeConfig compareConfig =
{
timer_A_CAPTUREACMPARE 寄存器_1、 //使用 CCR1
TIMER_A_CAPTURECMOLE_INTERRUPT_DISABLE、//禁用 CCR 中断
TIMER_A_OUTPUTMODE_SET_RESET、 //切换输出位
(SMCLK_frequisition/sample_frequency)
};


静态 uint16_t resultsBuffer[8];
extern uint16_t refRe[sample_length];
extern uint16_t refIM[sample_length];
extern uint16_t measRe[sample_length];
extern uint16_t measim[sample_length];


int adc14_main (void);
void startSampling (void);

#endif // ADC14Vna_H_*

这是主程序:

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

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

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

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

* MSP432 ADC14 -多通道无重复采样
*
说明:在此代码示例中、
用户 A 演示了能够扫描多个* ADC 通道的功能 DriverLib API。 转换
*内存寄存器 ADC_MEM0 - ADC_MEM3被配置为分别读取
A6、A12、A10、A8的转换*结果。 转换被启用、然后使用
一个软件切换来*切换采样。 重复模式未启用、仅采样
*发生一次(用户应暂停调试器以观察
*结果)。 在采集完最终样本后、
* ADC_MEM3的中断被触发、结果存储在 resultsBuffer 缓冲区中。
*
* MSP432P401
* ----------
* /|\| |
* || |
* -|RST P4.7 |<-- A6 (模拟输入、测量值、实际值)
* | P4.1 |<-- A12 (模拟输入、测量值、虚数)
* | P4.3 |<-- A10 (模拟输入、基准实数)
* | P4.5 |<-- A8 (模拟输入、基准虚数)
* | |
* | |
*
4.1、4.3、4.5、4.7是最终所需的引脚。
*
*作者:Timothy Logan
*这是 Rob Frohne 修改的、以在8kHz 采样率下执行多个 ADC。
秘书长的报告 /
#include "adc14_multi.h"

uint16_t refRe[sample_length];
uint16_t refIm[sample_length];
uint16_t measedonRe[sample_length];
uint16_t measIm[sample_length];
extern bool adc;
bool sendMeasurement = false;
int numerF requencestoMeasure、frequencyIndex;
float refSum、measSum;
botonool adc = false;

int main (void)
{
int i;
//停止 WDT
WDT_A_HOLDTimer();
interrupt_enableSlepOnIsrExit();
//Hwi_Params 参数;

//寄存器中断(设置 IRQ 矢量)
//Hwi_Params_init (&params);
//Hwi_create (INT_ADC14、ADC14_IRQHandler、&params、0);

//配置调试引脚作为调试输出...
///map_GPIO_setAsOutputPin (GPIO_PORT_P4、GPIO_PIN1);
MAP_GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);


//设置为 Vcore1
PCM_setCoreVoltageLevel (PCM_VCORE1);

//设置为使用 DCDC
PCM_setPowerState (PCM_AM_DCDC_VCORE1);

//初始化时钟系统
/*由于我们需要 Energia 时钟设置、这些注释被注释掉。 。
*相应调整计时器的数据结构。 时间
*转换之间的时间可能是这些转换的四倍
*参数、但这似乎是实现一切的最简单方法
*立即一起玩。 //
* CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 48);
CS_initClockSignal (CS_MCLK、CS_DCOCLK_SELECT、CS_Clock_divider);
CS_initClockSignal (CS_HSMCLK、CS_DCOCLK_select、CS_Clock_divider);
CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_Clock_divider _1);
CS_initClockSignal (CS_ACLK、CS_REFOCLK_select、CS_clock_divider);*/



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

//将基准电压设置为2.5并启用基准
Ref_A_setReferenceVoltage (REF_A_VREF2_5V);
Ref_a_enableReferenceVoltage();

//初始化 ADC (MCLK/1/1)
ADC14_enableModule();
ADC14_initModule (ADC_CLOCKSOURCE_MCLK、ADC_PREDIVIDER_1、ADC_DIVIDER_1、0);

//Configuring GPIO for Analog In
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P4、
GPIO_PIN1 | GPIO_PIN3 | GPIO_PIN5 | GPIO_PIN7、GPIO_TICE_MODULE_FUNCTION);


//配置 ADC 存储器(ADC_MEM0 - ADC_MEM3 (A6、A12、A10、A8)、不重复)
//具有内部2.5V 基准
ADC14_configureMultiSequenceMode (ADC_MEM0、ADC_MEM3、false);//无重复模式。
ADC14_configureConversionMemory (ADC_MEM0、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A6、ADC_NONDIFFERENTIAL_INPUTES);
ADC14_configureConversionMemory (ADC_MEM1、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A12、ADC_NONDIFFERENTIAL 输入);
ADC14_configureConversionMemory (ADC_MEM2、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A10、ADC_NONDIFFERENTIAL 输入);
ADC14_configureConversionMemory (ADC_MEM3、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A8、ADC_NONDIFFERENTIAL 输入);

//在通道3 (序列结束)上进行转换时启用中断
//完成并启用转换(我假设这意味着存储器不是模拟通道。)
ADC14_enableInterrupt (ADC_INT3);

ADC14_setSampleHoldTime (ADC_PULSE_WIDTH_4、ADC_PULSE_WIDTH_4);

//将 Timer_A 配置为连续模式,如上面的 upModeConfig 中的设置
Timer_A_configureUpMode (timer_A0_BASE、&upModeConfig);

//配置 CCR1中的 Timer_A0以按上述 compareConfig 中设置的那样触发
Timer_A_initCompare (timer_A0_BASE、&compareConfig);

//将样本触发器配置为来自 Timer_A0并进行设置
//在触发后自动迭代
ADC14_setSampleHoldTrigger (ADC_TRIGGER_SOURCE1、false);

//将采样计时器设置为自动单步执行序列
//转换。

ADC14_enableSampleTimer (ADC_AUTOMODIFY_DIOTIVation);

//map_ADC14_toggleConversionTrigger ();

//启用中断
INTERRUPT_enableInterrupt (INT_ADC14);
interrupt_enableMaster();

//启动计时器
Timer_A_startCounter (timer_A0_BASE、timer_A_up_mode);
ADC14_enableConversion();

对于(i=0;i 

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

    Rob、

      乍一 看我看不到任何明显的情况、除了计时器和 ADC 的时钟都高于最大允许频率。  如果 MCLK 大于25MHz 且定时器为24MHz、则 MCLK 的 ADC 时钟超出规格。  我附上了一个示例、我将使用它来与您所做的工作进行比较。

    Chris

    e2e.ti.com/.../7776.adc14_5F00_multiple_5F00_channel_5F00_no_5F00_repeat_5F00_timera_5F00_source_5F00_01.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Chris! 你是对的。 我尝试在.ino 文件中使用 Energia 串行端口、而将其用于 ADC14。 Energia 设置时钟的方式与使用 ADC14的方式不同、在将其更改为与 Energia 的串行例程兼容时、我中断了 ADC14例程。 如果可能、我真的希望在最短时间内从一个通道更改为下一个通道、因此测量值尽可能接近同步。 我需要对此进行更多研究。 感谢指针!

    Rob