大家好、
我正在对4个通道进行采样、采样率约为800kSample/s (每通道200k)。 我第一次尝试使用简单中断从通道中检索数据失败(使用一个通道时、数据检索看起来很好、使用4个通道时、数据看起来已损坏/转换一半)、因此我尝试使用 DMA 来解决它。 但是、在检查目的缓冲区时、它不会写入任何内容。 CodeComposerStudio 接口已正确配置为不阻止 IRQ、并且所有配置都按预期工作。 此外、我使用的是 reV-C launchpad、因此 本主题中描述的勘误表 不应影响我。 代码的相关部分如下:
#include "msp432.h"
#include "driverlib.h"
//突发频率= 50kHz
#define burst_Freq 50
//外部采样脉冲宽度= 1us (3 / SMCLK)
#define Ext_Pulse 宽度3
//开始 A/D 转换延迟= 1us (3 / SMCLK)
#define Start_ADC_DELAY 3
//要采集的样本数(2048足以支持300ms/s)
#define Num_for_results 2048
const uint16、{393 t} 530、668、 805、942、1079}、INS = 1353;// FS = 200kS/s 的增益步长(TL851数据表)
uint8_t NBP = 64;//突发脉冲数
uint16_t 索引、增益、脉冲;
uint16_t gainstep[8];
uint16_t nsamp、 ntick;
volatile uint16_t A0results[num_of_results]__attribute__((section (".noinit")));//大向量将永远使用
volatile uint16_t A1results[Num_of_results]__attribute__((section (".noinit"))));//将会使用 volatile uint16_t A1results[num_of_results]__attribute_(nature_ine_note_
);//结果初始化结果为 involature_ature_ine_note_("(notive_) :-)
volatile uint16_t A3results[num_of_results]__attribute__((section (".noinit"));
volatile uint16_t ADCresults[num_of_results][4]__attribute__(section (".noinit")));//一个数组来规则所有
这些结果;
* uint8 *操作 dma = t_acteakers。
//
#if defined (__TI_Compiler_version__)
#pragma DATA_ALIGN (MSP_EXP432P401RLP_DMAControlTable,1024)
#Elif defined (__IAR_SYSTEMS_ICC__)
#pragma DATA_ALIGNing=1024
#Elif defined (__GPCM__)
__attribute_attend_(__1000
)#tCONTROUT_FR4TS_REF_ENDCOL
(_MODULT_FOUNT);// tREFUNIT_ENDULT_CONTROUCE_CLUST_END1OND (1024)
//将内核电压电平设置为1.4V
MAP_FlashCtl_setWaitState (FLASH_BANK0、2);//为闪存组0
设置读取等待状态 MAP_FlashCtl_setWaitState (FLASH_Bank1、2);//为闪存组1设置读取等待状态
MAP_GPIO_setAsputalePort_PeripheraleQINJ_FOUNCn
、GPIO_ENTRUS_INTRUST_PUT_INTRUTPUT_INTRUTPUT_INTRUTPUT_INTRUTPUT_INTRUTPUT_INTRUTPUT_INTRUTPUT_INTRUTPUT_INTRUTPUT_INTRUTPUT_INTRUTPUT_INTRUTPUT_INTRUTPUT_INTRUTPUT_TO=
1、GPIOR_INTRUTPUT_INTRUTPUT_TO= 1、 // LFXT = 32.768kHz,HFXT = 48MHz
MAP_CS_startHFXT (false);//启动 HFXTCLK
MAP_CS_initClockSignal (CS_MCLK、CS_HFXTCLK_select、CS_clock_divider 1);// MCLK = 48MHz MAP_CS_initClockSignal (CS_clockpk
、CS_select、CS_clockpk
=任何调试时钟/ SMCLK_clockpet)***(必须连接到 CLK_clockpet) ***//
在 P4.4
中启用 HSMCLK }//系统初
始化 ADC14Init( GPIO_PORT_P4、GPIO_PIN4、GPIO_primary_module_function);//在 P4.4中启用 HSMCLK }//系统初始化 ADC14Init(){
//配置 GPIO MAP_GPIO_setAssumertionalp4
、GPIO_module_intran3和 GPIO_enu_intranu_inp4引脚|GPIO_module_intran3;GPIO_enu_enu_intranu_inp4外设
连接到 GPIO_emulationp4引脚! ***//
GPIO_setAsInputPinWithPullup 电阻器(GPIO_PORT_P4、GPIO_PIN5 /**/|GPIO_PIN4 | GPIO_PIN3 | GPIO_PIN2/**/);//启用上拉电阻
器//配置 ADC14,<20us 用于4次转换,即>200kS/s |GPIO_PIN2/|ADC0 =
ADC14;=
ADC0 = ADC0 = ADC14;ADC0 = ADC0 = ADC0 = ADC0 = ADC14;ADC0 = ADC0 = ADC0 = ADC14 + ADC0 = ADC0 = ADC0 = ADC14;ADC0 = ADC0 = ADC0 = ADC0 + ADC0 + ADC0
// ADC14_CTL0_SHS_5 = TA2.1;ADC14_CTL0_SHS_0 =软件
ADC14->CTL1 = ADC_14BIT;// 14位分辨率
ADC14->CTL0 |= ADC14_CTL0_CONSEQ_3 | ADC14_INCH = ADC14_CHINES0_ADC14_CHINES0_ADC14_ADC14_CHINES0_ADC14_ADC14_CHINES0_ADC14_ADC14_ADC14_CHINES0_ADC14_ADC14_CHINES0_ADC14_ADC14_ADC14_ADC14_CHINES0_ADC14_ADC14_ADC14_ADC14_CHINESC14_ADC14_ADC14_CHINESC14_CHINES0_ADC14_ADC14_AD
// ref+=AVcc,channel = A8
ADC14->MCTL[1]= ADC14_MCTLN_INCH_9;// ref+=AVcc,channel = A9
ADC14->MCTL[2]= ADC14_MCTLN_INCH_10;// ref+=AVcc,channel = A10 ADC14_>MCTLC14_EN=ADC14_INSE=ADC14_INSE_EN=ADC14=ADC14_INSEC
;// ADC14_ENCE_IN_INESC14=ADC11=ADC14_ENCE_IN_IN_ENSCR=ADC14_IN_IN_ENSCR=ADC14_IN_INCR_INESC14=ADC14=ADC14_IN_IN_ENSCR=ADC14_ENTR_ENTR_ENTR_ENTR_ENTR_IN_ENTR_
~ //从 ISR 退出时唤醒
//在 NVIC 模块
中启用 ADC 中断__disable_interrupt ();
NVIC->ISER[0]= 1 <<((INT_ADC14 - 16)& 31);//(SLAS826A 表6-12)
__ENABLE_INTERRUPT ();
}// ADC14Init
= ADC14= ADC14_EN0
(= ADC14_ADC14)| EN0 = ADC14= ADC14_ADC14 (void ~ADC14_ADC14= ADC14_ADC0);EN0 = ADC14_ADC14_ADC14= ADC0 = ADC14_ADC14 (ADC0 = ADC0 = ADC14_ADC14_ADC0
// ADC14Disable
// ADC14中断服务例程
void ADC14IsrHandler(){
if (ADC14->IFGR0 & ADC14_IFGR0_IFG3){
ADC14->CTL0 &=~ADC14_CTL0_ENC;// ADC14Disable ();//禁用采集序列(硬件触发所必需)
//P2->OUT =增益;
/**
缓冲数据的旧方法
**//
A0Results[index]= ADC14->MEM[0];//移动 A8结果,IFG 被清除
// A1Results[index]= ADC14->MEM[1];//移动 A9结果,IFG 被清除
//结果 A2E=ADC14>ADC14[index]=ADC14>ADC14]=ADC14>ME[1];//结果= ADC14>ADC14>ADC14>ADC14>ADC14[index = ADC14]/ ADC14>ADC14>ADC14>ADC14>ADC14]/ ADC14>ADC14[A3
//移动 A11结果,IFG 被清除
ADC14->CTL0 |= ADC14_CTL0_ENC;// ADC14Enable ();//启用下一个采集序列
// index++;//递增索引
// if (index =nsamp)
//{
// Timer_A0->CTL &&~TIMER_A_UP_MODE;// TimerA0Stop ();//停止计时器 A0
//dataReturn();
//}
// ADC14IsrHandler
void DMAInit()
{//
配置 DMA 模块*/
DMA_enableModule();
DMA_setControlBase (MSP_EXP432P401RLP_DMAControlTable);
DMA_assignChannel (DMA_CH7_ADC14);
DMA_disableChannelAttribute (DMA_CH7_ADC14、
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIOR|
UDMA_ATTR_REQMASK);
/*设置控制索引。 在本例中、我们将设置的源
* DMA 传输到 ADC14存储器0
*和目标到
*目的数据数组。 *
DMA_setChannelControl (UDMA_PRI_SELECT | DMA_CH7_ADC14、
UDMA_SIZE_16 |
UDMA_SRC_INC_32 |
UDMA_DST_INC_16 |
UDMA_ARB_1);
DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH7_ADC14、
UDMA_MODE_BASIC、(void*)&ADC14->MEM[0]、
&ADCResults[0][0]、4);
/*分配/启用中断*/
DMA_assignInterrupt (DMA_INT1、7);
//中断_enableInterrupt (INT_DMA_INT1);
//在 NVIC 模块中启用 DMA-1中断
_disable_interrupt ();
NVIC->ISER[0]= 1 <<(DMA_INT1 - 16)& 31);//(SLAS826A 表6-12)
_enable_interrupt ();
MAP_DMA_enableChannel (7);
}
void DMA_IRQHandler (void)
{
index++;//递增索引
DMA_setChannelTransfer (UDMA_PRI_select | DMA_CH7_ADC14、UDMA_MODE_BASIC、(void*)&ADC14->MEM[0]、&ADCresults[index]、[0];[0]
MAP_DMA_enableChannel (7);
if (index =nsamp)
{
Timer_A0->CTL &&~TIMER_A_UP_MODE;// TimerA0Stop ();//停止计时器 A0
//dataReturn();
}
}
int main(){
OurSystemInit();
SonarInit(200);// fs = 200kS/s
TimerA0Init();// fb = 50kHz
TimerA2Init();
ADC14Init();
UARTInit();
DMAInit();
ADC14Enable();
SonarBurst ();//开始采集
__SLEEP ();
}// main