Thread 中讨论的其他器件:controlSUITE、 C2000WARE
我想利用 ADC 模块和 DMA 模块在没有 CPU 的情况下完成采样。我修改 C:\ti\controlSUITE\device_support\F2837xD\V210\F2837xD_examples_cpu1\dma_gsram_transfer 中的代码、并在其中添加 ADC 模块。 C:\ti\controlSUITE\device_support\F2837xD\V210\F2837xD_Examples_CPU1\ADC_SoC_Continuous\cpu01。我修改了电路板的通道。但无法正常工作,程序将以"
while (0==AdcaRegs.ADCINTFLG.bit.ADCINT1);"、但当我屏蔽"dma_inlt ()" fus.ADC 可以正常运行。dma 的配置是否与 ADC 的交叉连接冲突? 我无法理解。有人能帮我解决这个问题吗? 非常感谢您。
接下来是我稍微修改过的代码
//######################################################################################################################
//
//文件: dma_gsram_transfer_cpu01.c
//
//标题: DMA GSRAM 传输
//
//! addtogroup cpu01_example_list
//!
DMA GSRAM 传输(dma_gsram_transfer)
//!
//! 此示例使用一个 DMA 通道从中的缓冲区传输数据
//! RAMGS0到 RAMGS1中的缓冲区。 该示例设置 DMA 通道
//! PERINTFRC 位重复、直到16个突发传输(其中每个
//! 突发为8个16位字)已完成。 传输的时间
//! 完成后、它将触发 DMA 中断。
//!
//! b 监视\b 变量\n
//! -\b sdata -要发送的数据
//! -\b RDATA -接收到的数据
//!
//
//######################################################################################################################
//$TI 版本:F2837xD 支持库 V210 $
//$Release Date:Tue Nov1 14:46:15 CDT 2016 $
//版权所有:版权所有(C) 2013-2016 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//######################################################################################################################
//
//包含的文件
//
#include "F28x_Project.h"
//
// DMA 数据段
//
#pragma DATA_SECTION (sdata、 "ramgs0"); //将 TX 数据映射到存储器
#pragma DATA_SECTION (RDATA、 "ramgs1"); //将 RX 数据映射到存储器
//
//定义
//
#define BURST 7 //将7写入寄存器以获得8的突发大小
#define 传输 15 //[(MEM_buffer_size/(burst + 1))- 1]
#define results_buffer_size 1024
//
//全局
//
uint16 sdata[1024]; //发送数据缓冲区
uint16 RDATA[1024]; //接收数据缓冲区
uint16 AdcaResult2[1024];
//uint16 AdcaResult3[1024];
易失 性 uint16 * DMADest;
易失 性 uint16 * DMASSOURCE;
易失 性 uint16 完成;
//
//函数原型
void ConfigureADC (void);
void dma_init (void);
//Setup the ADC for continuous Conversions on channel 0
void SetupADCContinu模糊(void);
_interrupt void local_D_INTCH6_ISR (void);
//void dma_init (void);
void error();
//
//主函
//
void main (void)
{
uint16 结果索引;
//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2837xD_SYSCTRL.c 文件中。
//
InitSysCtrl();
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
InitGpio(); //针对此示例跳过
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2837xD_PIECTRL.c 文件中。
InitPieCtrl();
//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xD_PieVect.c 中找到
InitPieVectTable();
EALLOW; //这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.DMA_CH6_INT=&LOCAL_D_INTCH6_ISR;
EDIS; //这是禁止写入 EALLOW 受保护寄存器所必需的
//确保 DMA 连接到外设帧2桥接器(EALLOW 受保护)
//
ConfigureADC();
//Setup the ADC for continuous Conversions on channel 0
SetupADCContinuime();
dma_init (); //设置 DMA
StartDMACH6();
EALLOW;
CpuSysRegs.SECMSEL.bit.PF2SEL = 1;
EDIS;
for (resultsIndex=0;resultsIndex<1024;resultsIndex++)
{
AdcaResult2[resultsIndex]=0;
}
//
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //启用 PIE 块
PieCtrlRegs.PIEIER7.bit.INTx6 = 1; //启用 PIE 组7、INT 2 (DMA CH2)
IER = M_INT7; //启用 CPU INT6
EINT; //启用全局中断 INTM
ERTM; //启用全局 实时 中断 DBGM
//步骤5. 特定于用户的代码、启用中断:
//初始化数据缓冲区
//
//启用此示例所需的中断
//
resultsIndex=0;
操作
{
//启用 ADCINT 标志 若不配置这里,ADC采样后中断不会置位
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;
AdcaRegs.ADCINTFLGCLR.ALL = 0x000F;
//软件强制启动 SOC
AdcaRegs.ADCSOCFRC1.ALL = 0x000C;//启动软件启动 转换
//继续采样,直到结果缓冲区已满
while (resultsIndex < results_buffer_size)
{
//等待当前6个转换集完成
while (0 = AdcaRegs.ADCINTFlG.bit.ADCINT1);
//清除当前6次转换生成的 INT 标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
//保存当前6次转换的结果
//
AdcaResult2[resultsIndex]= AdcaResultRegs.ADCRESULT2;
结果索引++;
}
//禁用所有 ADCINT 标志以停止采样
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0;
asm (" ESTOP0");
} while (1);
}
//
// DMA 传输完成后,程序将在此处停止
//
//
//错误-将停止调试器的错误函数
//
空 错误(空)
{
asm (" ESTOP0"); //测试失败!!! 停下来!
适用于 (;);
}
//
// dma_init - TX 和 RX 通道的 DMA 设置。
//
void dma_init()
{
//
//有关以下函数的说明,请参阅 dma.c。
//
//
//初始化 DMA
//
DMAInitialize();
DMASSOURCE =(易失 性 UINT16 *)&AdcaResultRegs.ADCRESULT2;
DMADest =(易失 性 UINT16 *) RDATA;
//
//配置 DMA CH6
//
DMACH6AddrConfig (DMADest、DMASource);
DMACH6BurstConfig (突发、1、1);
DMACH6TransferConfig (传输、1、1);
DMACH6ModeConfig (DMA_ADCAINT1、PERINT_ENABLE、OneShot_disable、CONT_disable、
SYNC_DISABLE、SYNC_SRC、OVRFLOW_DISABLE、十六位、
Chint_end、CHINT_ENABLE);
}
//
// local_D_INTCH6_ISR - DMA 通道6 ISR
//
_interrupt void local_D_INTCH6_ISR (void)
{
uint16 i;
EALLOW; //需要在 ISR 内执行 EALLOW!!!
DmaRegs.ch6.control.bit.halt = 1;
PieCtrlRegs.PIEACK.all = PIEACK_group7; // ACK 以接收更多中断
//来自此 PIE 组
EDIS;
for (i = 0;i < 1024;i++)
{
//
//检查数据完整性
//
if (RDATA[i]!= i)
{
error();
}
}
DONE = 1; //测试完成。
返回;
}
//
//文件结束
//
//写入 ADC 配置并为 ADC A 和 ADC B 加电
空 配置 ADC (空)
{
EALLOW;
//写入配置
AdcaRegs.ADCCTL2.bit.prescale = 15; //将 ADCCLK 分频器 配置ADC时钟,有系统时钟参考时钟为/4 μ s
AdcSetMode (ADC_ADCA、ADC_Resolution_16BIT、ADC_SIGNALMODE_differential);
//将脉冲位置设置为晚期
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;设置ADC中断产生时机在转换完成后 μ s
//为 ADC 加电
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;上电需要掩饰1ms左右等待上电完成 μ s
//延迟1ms 以允许 ADC 加电时间
DELAY_US (1000);
EDIS;
}
//设置 ADC 在一个通道上连续转换
void SetupADCContinu模糊(void)
{
uint16 acqps;
//根据分辨率确定最小采集窗口(在 SYSCLKS 中)
if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution){
acqps = 511; /2560ns
}
否则 { //分辨率为16位
acqps = 511; //320ns
}
EALLOW;
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2; /SOC 将在通道上进行转换
AdcaRegs.ADCSOC3CTL.bit.CHSEL = 3; /SOC 将在通道上进行转换
AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps; //采样窗口为 acqps + 1个 SYSCLK 周期
AdcaRegs.ADCSOC3CTL.bit.ACQPS = acqps; //采样窗口为 acqps + 1个 SYSCLK 周期
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 0; //禁用 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1;
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 2; // SOC5的末尾将设置 INT1标志 最后一个优先级的SOC即可,随时需要修改
// AdcaRegs.ADCINTFLGCLR.bit.ADCINT1=1;
//ADCINT1将触发 SOC
AdcaRegs.ADCINTSOCSEL1.bit.SOC2 = 1;
AdcaRegs.ADCINTSOCSEL1.bit.SOC3 = 1;
}