主题中讨论的其他部件: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);
}