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:ADC+DMA示例代码

Guru**** 2594330 points
Other Parts Discussed in Thread: MSP432WARE

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/636913/ccs-msp432p401r-adc-dma-example-code

部件号:MSP432P401R
主题中讨论的其他部件:MSP432WARE

工具/软件:Code Composer Studio

 hii all,  

     在我的应用程序中,我正在对要 使用DMA的ADC进行2048个采样的平均处理。  因此,我尝试了一些代码,但 这些代码 无法正常工作。  现在我正在处理一个DMA缓冲区只更新一个的代码。因此,请帮助我解决此问题, 如果可能,请发送任何DMA代码而不使用diriverlib.h。

我的代码如下所示;

#include "msp.h"
#include <driverlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>

//缓冲器规格
#define sample_length 1024
int16_t data_array1[sample_length];
int16_t data_array2[sample_length];

//volatile arm_status状态;
#define SMCLK_FREQUENCY 4800万
#define sample_frequency 8000

/* DMA控制表*/
#ifdef ewarm
#pragma data_alignment=256
#否则
#pragma data_align(controlTable, 256)
#endif
UINT8_t controlTable[256];

volatile int switch_data = 0;
uINT32_t颜色= 0;

/* Timer_A PWM配置参数*/
Timer_a_PWMConfig pwmConfig =

Timer_A_CLOCKSOURCE_SMCLK,
Timer_a_CLOCKSOURCE_diver_1,
(SMCLK_FREQUENCY / SAMP_FREQUENCY),
Timer_a_CAPTURECOMPare_register_1,
Timer_a_OUTPUTMODE_SET_RESET,
(SMCLK_FREQUENCY / SAMP_FREQUENCY)/2
};

Void主(void)

/*停止WDT并禁用主中断*/
MAP_WDT_A_HoldTimer();
MAP_Interrupt_DisableMaster();
P1->DIR || 0xff;

/*将核心电压级别设置为VCORE1 */
MAP_PCM_setCoreVoltageLevel (PCM_VCORE1);

/*为闪存库0和1*/设置2个闪存等待状态
MAP_FlashCTL_setWaitState(FLASH_BANK0, 2);
MAP_FlashCTL_setWaitState(FLASH_Bank1,2);

/*初始化时钟系统*/
MAP_CS_setDCOCenteredFrequency (CS_DCO_Frequency_48);
MAP_CS_INITClockSignal (CS_MCLK, CS_DCOCLK_SELECT, CS_CLOCK分隔符_1);
MAP_CS_initClockSignal (CS_HSMCLK, CS_DCOCLK_SELECT, CS_CLock_diver_1 );
MAP_CS_initClockSignal (CS_SMCLK, CS_DCOCLK_SELECT, CS_CLock_diver_1 );
MAP_CS_INITClockSignal (CS_ACLK, CS_REFOCLK_SELECT, CS_CLock_diver_1 );

/*将Timer_A配置为具有大约500ms和的周期
* 10 % 的初始占空比(3200 tick)*
MAP_Timer_a_generatePWM (TIMER_A0_BASE,&pwmConfig);

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

MAP_ADC14_setSampleHoldTrigger (ADC_TRIGG_SOURCE1,FALSE);

/*配置GPIO (5.5 A0)*/
MAP_GPIO_setAsPeripheralModuleFunctionInputPin (GPIO端口P5,GPIO端口PIN5,GPIO第三模块功能);

/*配置ADC内存*/
MAP_ADC14_configureSingleSampleMode (ADC_MEM0,TRUE);
MAP_ADC14_configureConversionMemory (ADC_MEM0,ADC_VREFPOS_AVCC_VREFNEG_VSS,ADC_INPUT_A0,FALSE);

///*将ADC结果格式设置为带符号二进制*/
MAP_ADC14_setResultFormat(ADC_signed_binary);

/*配置DMA模块*/
MAP_DMA_enableModule();
MAP_DMA_setControlBase(controlTable);
MAP_DMA_赋 值通道(DMA_CH7_ADC14);
MAP_DMA_DisableChannelAttribute (DMA_CH7_ADC14,UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH _priority | UDMA_ATTR_REQMAK);

/*设置控制索引。 在这种情况下,我们将设置的源
* DMA传输至ADC14内存0
*和目的地
*目标数据数组。 */
MAP_DMA_setChannelControl (UDMA_PRI_SELECT | DMA_CH7_ADC14,UDMA_Size_16 | UDMA_SRC_INC_none | UDMA_DST_INC_16 | UDMA_ARB_1);
MAP_DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH7_ADC14,UDMA_MODE_BASIC,(void*)&ADC14->MEM[0],DATA_array1,SAMPLE_Length);

MAP_DMA_setChannelControl (UDMA_ALT_SELECT | DMA_CH7_ADC14,UDMA_Size_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
MAP_DMA_setChannelTransfer (UDMA_ALT_SELECT | DMA_CH7_ADC14,UDMA_MODE_PINGPong,(void*)&ADC14->MEM[0],DATA_array2,SAMPLE_Length);
P1->out ^= BIT0;
/*分配/启用中断*/
MAP_DMA_赋 值中断(DMA_INT1,7);
MAP_Interrupt_enableInterrupt (INT_DMA_INT1);
MAP_DMA_赋 值通道(DMA_CH7_ADC14);
MAP_DMA_clearInterruptFlag (7);
MAP_Interrupt_enableMaster();

/*现在DMA已启动并设置,启用通道。 ADC14
*硬件应接管并传输/接收所有字节*/
MAP_DMA_enableChannel(7);
MAP_ADC14_enableConversion();

同时(1)

MAP_ADC14_enableConversion();
MAP_PCM_GotoLPM0();
}
}


ADC14 MEM0 */的/*完成中断
void DMA_INT1_IRQHandler(void)

P1->out ^= BIT0;
MAP_DMA_clearInterruptFlag (7);
MAP_DMA_DisableInterrupt (INT_DMA_INT1);
}

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

    我建议从 E2E上的此线程开始,它显示了ADC和SPI同时使用的MSP432 DMA。 该代码提供了一个与您尝试执行的操作类似的示例。 (实际上,该示例使用了多个ADC信道,因此更适合用于教育目的)。

    编辑-使用上面的线程将帮助解决Evan帖子指出的许多问题,但使用黑色LaunchPad除外。

    -Bob

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

    首先要提出的几个问题。

    根据您的include路径,您似乎还没有使用SimpleLink MSP432 SDK。 MSP432Ware不再更新,但MSP432Ware包含的所有内容(驱动程序库,示例等)现在都包含在SimpleLink MSP432 SDK中,并且以季度发布的速度进行了积极更新。 以下文档第3节包含有关此信息和任何移植信息 的更多信息www.ti.com/.../slaa700a.pdf

    我还担心您可能会使用黑色的LaunchPad,因为您的等待状态设置为2。 这是否正确? 如果是这样,黑色LaunchPad包含我们不再支持的试验性'XMS'预发行硅。 我们的第一个建议是获得一个Red LaunchPad,它包含已发布的芯片,其中包含许多错误修复程序,可能会影响您所看到的任何困难。

    例如,在预发布的实验芯片和释放的芯片之间,我们将闪存增强为在48MHz的1等待状态下工作,而不是在2。

    总之,您有机会查看此代码示例吗? dev.ti.com/.../

    此演示软件演示了如何使用MSP-EXP432P401R LaunchPad开发套件检测亚声波,音频带和超声波频谱中的振动噪音。 有关详细信息,请参阅应用报告 www.ti.com/.../slaa735.pdf

    运行演示时,设备每5分钟对模拟通道A0,A1和A2进行一次采样。

    我也可能有一些内部代码,根据您的一些回答可能会有所帮助。 有关您所看到的错误的更多信息将有助于我们继续进行调试,但请确保您已更新/发布到市场芯片和我们当前的软件平台,以便开始。

    谢谢! 希望这对一些人有帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢bob

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,Evan,我正在使用黑色启动板,现在我要使用simplelink_msp432_sdk,那么,学习ADC+DMA代码的基本步骤是什么,请帮助我。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    太子

    我再次强调,除了SDK之外,还需要迁移到Red LaunchPad。 红色Launchpad包含生产级硅,而黑色LaunchPad包含试验性硅,自此,我们对已发布的硅进行了大量更改(如闪存等待状态的数量)。 您可以在以下位置获取新的Red MSP432 LaunchPad: http://www.ti.com/tool/msp-exp432p401r

    除此之外,我在上面向您指出的示例中,TRM/数据表中的文档以及有关e2e的问题是了解ADC和DMA的最佳方式。

    我还附上了一个与您正在使用的代码类似的代码示例,但此代码是为Red LaunchPad + SimpleLink MSP432 SDK编写的。

    见附件 :e2e.ti.com/.../adc14_5F00_single_5F00_conversion_5F00_repeat_5F00_timera_5F00_source_5F00_07.c