主题中讨论的其他器件:C2000WARE
工具/软件:Code Composer Studio
我想将 ADCIN0~ADCIN3配置为对电流进行采样、并使用 DMACH1将 ADCResult 移动到数据库。 我的问题如下所示、这让我困惑了几天。
我在 adcISR 中读取 ADCResult、但无法获取数据。
2. dmaISR 只输入一次。
有人有一个相对示例?
非常感谢。
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.
工具/软件:Code Composer Studio
我想将 ADCIN0~ADCIN3配置为对电流进行采样、并使用 DMACH1将 ADCResult 移动到数据库。 我的问题如下所示、这让我困惑了几天。
我在 adcISR 中读取 ADCResult、但无法获取数据。
2. dmaISR 只输入一次。
有人有一个相对示例?
非常感谢。
您好!
希望您已在 \C2000Ware_X_XX_XX_XX\driverlib\f2837xd\examples\cpu1\adc 中引用示例
或 ADC 示例、位于 \C2000Ware_X_XX_XX\device_support\f2837xd\examples\CPU1
谢谢、
Katta
是的、我参考了该示例。
C:\ti\C2000Ware_2_00_00_02_Software\device_support\f2837xd\examples\CPU1\ADC_SoC_Continuous_DMA
下面是我的 adTask 代码。 请帮助检查问题所在。
如果我注释四条红线代码、adcISR 只会触发一次、我可以获取 ADC 值。
但是、如果我取消注释这四条红线、adcISR 可以重新触发、数据为零、而 dmaISR 只会触发一次。
uint16结果[40];
#pragma CODE_SECTION (AdcResults、".TI.ramfunc");
void adca1ISR (void)
{
AdcaResult[0]= AdcaResultRegs.ADCRESULT0;
AdcaResult[1]= AdcaResultRegs.ADCRESULT1;
AdcaResult[2]= AdcaResultRegs.ADCRESULT2;
AdcaResult[3]=AdcaResultRegs.ADCRESULT3;
AdcaResults[4]= AdcaResultRegs.ADCRESULT4;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}
void dma1ISR (void)
{
EALLOW;
//清除任何杂散标志:
DmaRegs.ch1.control.bit.PERINTCLR = 1;//清除任何寄生中断标志
DmaRegs.CH1.control.bit.ERRCLR = 1;//清除任何伪同步错误标志
DmaRegs.CH1.control.bit.RUNSTS = 1;
EDIS;
PieCtrlRegs.PIEACX.ALL = PIEACK_group7;
}
空配置 ADC (空)
{
EALLOW;
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;//在传输完成后设置 ADC 中断
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
延迟(1000);
EDIS;
}
//设置 ADC 在一个通道上连续转换
void SetupADCContinu模糊(void)
{
uint16 acqps;
//根据分辨率确定最小采集窗口(在 SYSCLKS 中)
if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution){
acqps = 14;//75ns
}
否则{//分辨率为16位
acqps = 63;//320ns
}
EALLOW;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;/SOC 将在通道上转换
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1;//SOC 将在通道上转换
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2;/SOC 将在通道上进行转换
AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3;/SOC 将在通道上进行转换
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps + 1个 SYSCLK 周期
AdcaRegs.ADCSOC1CTL.bit.ACQPS = acqps;//采样窗口为 acqps + 1个 SYSCLK 周期
AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps;//采样窗口为 acqps + 1个 SYSCLK 周期
AdcaRegs.ADCSOC3CTL.bit.ACQPS = acqps;//采样窗口为 acqps + 1个 SYSCLK 周期
AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1;无论标志位是否被清零、只要一个 EOC 脉冲被生成、就会产生//ADCINT1脉冲
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 3;// SOC3结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
AdcaRegs.ADCINTSOCSEL1.bit.SOC0 = 1;
AdcaRegs.ADCINTSOCSEL1.bit.SOC1 = 1;
AdcaRegs.ADCINTSOCSEL1.bit.SOC2 = 1;
AdcaRegs.ADCINTSOCSEL1.bit.SOC3 = 1;
EDIS;
}
void adcTaskInit (void)
{
Hwi_Params HwiParams;
hwi_handle dma1Hwi;
ERROR_Block EB;
ERROR_INIT (&EB);
Hwi_Params_init (hwiParams);
Hwi_handle adcahwi;
adcaHwi = hwi_create (32、adca1ISR、&hwiParams、&EB);
if (adcahwi =空)
system_abort ("Hwi 创建失败");
dma1Hwi = hwi_create (80、dma1ISR、&hwiParams、&EB);
if (dma1Hwi =空)
system_abort ("Hwi 创建失败");
//配置 ADC 并为其加电
ConfigureADC();
//Setup the ADC for continuous Conversions on channel 0
SetupADCContinuime();
//初始化结果缓冲区
memset (AdcResults、0、40);
Hwi_enableInterrupt (32);
Hwi_enableInterrupt (80);
}
空 DMAInit (空)
{
DMAInitialize();
DMACH1AddrConfig (AdcaResults、&AdcaResultRegs.ADCRESULT0);
DMACH1BurstConfig (3、1、1);
DMACH1TransferConfig (9、-3、1);
DMACH1WrapConfig (100、1、100、1);
DMACH1ModeConfig (
DMA_ADCAINT1、
PERINT_ENABLE、
OneShot_disable、
CONT_DISABLE、
//CONT_ENABLE、
SYNC_DISABLE、
SYNC_SRC、
OVRFLOW_DISABLE、
//32位、
16位、
Chint_end、
Chint_enable
);
}
void adcTaskFxn (void)
{
adcTaskInit();
DMAInit();
StartDMACH1();
AdcaRegs.ADCSOCFRC1.ALL = 0x000F;
}
ADCRESULT 寄存器中的数据为零还是由于传输未触发而在 DMA 目标缓冲区中仅为零? 我正在尝试弄清楚哪个部分被破坏了- ADC 转换或 DMA 传输。 您能澄清一下吗? 如果注释掉所有 DMA 代码、ADC 是否按预期工作?
.TI.ramfunc 用于需要从 RAM 中执行的函数、因此将 AdcResults 放在那里有点奇怪。 我不确定这一定会成为一个问题、只要它位于 DMA 可访问的存储器区域中、但这是需要注意的问题。
惠特尼
ADC 和 DMA 似乎都异常。
首先、介绍 ADC。 我将 DMA 排除在任务之外。
条件1。 取消注释四条红线、adcaISR 周期输入、我将数据传输到 AdcaResults、数据值为零。 这是异常的。
void adca1ISR (void)
{
AdcaResult[0]= AdcaResultRegs.ADCRESULT0;
AdcaResult[1]= AdcaResultRegs.ADCRESULT1;
AdcaResult[2]= AdcaResultRegs.ADCRESULT2;
AdcaResult[3]=AdcaResultRegs.ADCRESULT3;
AdcaResults[4]= AdcaResultRegs.ADCRESULT4;
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}。
条件2。 注释 四条红线、adcaISR 只输入一次。 数据是正确的。 这似乎是第一次进行 ADC 转换。
好的、关于 DMA。
我在任务中包含 DMA、根据上述条件1、dmaISR 只进入一次、为什么 DMA 只进入三次触发一次? 请帮助检查 DMA 配置。
谢谢。
条件2是合理的。 由于禁用了再次触发 SOC 的功能、因此您不会再收到任何中断。 我在您的代码中看不到任何东西会解释为什么条件1会导致数据为零-除了触发源之外、所有设置都是相同的。
ADC_SoC_Continuous_DMA 示例是否适用于您的硬件?
惠特尼