请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:TMS320F2.8379万D 工具/软件:TI C/C++编译器
您好,
我正在尝试使用f2.8379万D板上的DMA。 我尝试通过转换结束时生成的EOC0触发DMA CH5中断。 我确实在连续模式下运行ADC:
AdcbRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//
我在DMA中断例程中有一个check变量,我看到它正在递增,但是我看不到DMA要写入的变量有什么变化。 我也不确定如何配置突发和传输参数,这里的数据表让我困惑。
我将非常感谢你们的支持。 我的代码在此处:
//###################################################################
//
//文件:adc_so_ePWM_cpu01.c
////
标题:ADC通过ePWM触发F2837xD。
////
! \addtogroup cpu01_example_list
//! <h1>ADC ePWM触发(ADC_SOC_ePWM)</h1>//
!
//! 此示例设置ePWM以定期触发ADC。
//!
//! 程序运行后,内存将包含:\n
//! -\b AdcaResults \b:
来自//的一系列模数转换样本。 针脚A0。 样本之间的时间根据周期
//! ePWM计时器。
//
//###########################################################################
//$TI发布:F2837xD支持库V210 $//
发布日期:星期二11月1日14:46:15 CDT 2016 $//
$/$版权:版权所有(C) 2013-2016 Texas2016 Texas Instruments Incorporated -//
http://www.ti.com/ 保留所有权利$//#########################################################################################
//
//包含的文件
//
#include "F28x_Project.h"
#define burst (FIFO_LVL-1)//突发大小应小于8#define
传输 0 //[(MEM_BUFFER_SIZE /FIFS_LVL)-1]
////
函数原型
//
void ConfigureADC (void);
void ConfigureEPWM (void);
void SetupADCEpwm (UINT16通道);
__interrupt void adcb1_ISR (void);
__interrupt void local_D_D_D_INTCH5_void (ISR);
void dma_init(void);
//__interrupt void local_D_INTCH6_ISR(void);
//
定义
//
#define results_buffer_size 256
////
Globals
//
UINT16 AdcbResults[results_buffer_size];
UINT16 resultsIndex;
volatile UINT16 bufferFull;
volatile U16 interes; UDM16
//接收数据缓冲
区UINT16检查;
void main (void)
{////
步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例功能可在F2837xD_sysctrl.c文件中找到。
//
InitSysCtrl();////
步骤2. 初始化GPIO:
//此示例函数可在F2837xD_GPIO文件中找到,
//说明了如何将GPIO设置为其默认状态。
//
InitGpio();//跳过此示例
////
步骤3。 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
//
dint;
////
将PIE控制寄存器初始化为其默认状态。
//默认状态是禁用所有PIE中断,
并清除标志//。
//此函数位于F2837xD_PIECTRL.c文件中。
//
InitPieCtrl();////
禁用CPU中断并清除所有CPU中断标志:
//
IER = 0x0000;
IFR = 0x0000;
////
使用指向shell Interrupt
//服务例程(ISR)的指针初始化PIE矢量表。
//这将填充整个表,即使在此
示例中未使用中断//。 这对于调试非常有用。
// shell ISR例程位于F2837xD_DefaultIsr.C.中
//此函数位于F2837xD_PieVect.C.中
//
InitPieVectorTable();
//
//确保DMA连接到外设帧2网桥(EALLOW保护)
//
EALLOW;
CpuSysRegs.SECMSEL.bit.pf2SEL = 1;
EDIS;
////
映射ISR功能
//
EALLOW;
// PieVectorTable.ADCB1_INT =&adcb1_ISR;// ADCB中断1的函数
PieVectorTable.DMA_CH5_INT=&LOCALE_D_INTCH5_ISR;
EDIS;
//
//配置ADC并将其加电
//
ConfigureADC();////
配置ePWM
//
ConfigureEPWM();////
在通道0
//上为ePWM触发的转换设置ADC
dma_init(); //为SPI配置设置DMA
SetupADCEpwm (5);
////
启用全局中断和较高优先级的实时调试事件:
//
PieCtrlRegs.PIECTRL.bit.ENPIE =1;//启用PIE块
PieCtrlRegs.PIEIER7.bit.INTx5 =1;//启用PIE组7, INT 1 (DMA通道1)
IER || M_INT7; //启用CPU INT6
// IER |= M_INT1;//启用组1中断
EINT;//启用全局中断INTM
ERTM;//启用全局实时中断DBGM
////
初始化结果缓冲区
//
for (resultsIndex = 0;resultsIndex < results_buffer_size;resultsIndex++)
{
AdcbResults[resultsIndex]=0;
}
结果索引=0;
bufferFull =0;////
启用PIE中断
////
PieCtrlRegs.PIEIER1.bit.INTx2 =1;////
同步ePWM
//
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;//PWM同步
EDIS;
StartDMACH5(); //为
(;;){
}}////
配置ADC启动DMA -写入ADC配置并为二者打开ADC电源
// ADC A和ADC B
//
void配置ADC (void){
EALLOW;
//
//写入配置
//
AdcbRegs.ADCCTL2.bit.prcale =6;//将ADCCLK除法器设置为/4
AdcSetMode (ADC_ADCB,ADC_Resolution _12位,ADC_SIGNALMODE_SINGLE);
//
//将脉冲位置设置为延迟
//
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
//
//打开ADC的电源
//
ADcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
//
//延迟1毫秒,以使ADC有时间开机
//
DELAY _US (1000);
EDIS;
}////
ConfigureEPWM -配置ePWM SOC并比较值
//
void ConfigureEPWM (void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0b01;
GpioCtrlRegs.GPAGMUX1.bit.GPIO0 = 0b00;
EDIS;
EALLOW;
//假定ePWM时钟已启用
EPwm1Regs.ETSEL.bit.SOCAEN =1;//禁用组上的SOC
EPwm1Regs.ETsel.bit.SOCASEL = 0b001;//在加电计数时选择SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在第一个事件上生成脉冲
EPwm1Regs.CMPA.bit.CMPA = 2500; //设置比较值
EPwm1Regs.TBPRD = 5000; //设置期间
EPwm1Regs.TBCTL.bit.CTRMODE = 0b10; //向上-向下
EPwm1Regs.AQCTLA.bit.ZRO = 0b10; //
EPwm1Regs.AQCTLA.bit.PRD = 0b01; //
EPwm1Regs.AQCTLA.bit.CAU = 0b01; //
EPwm1Regs.AQCTLA.bit.CAD = 0b10; //
EDIS;
}////
SetupADCEpwm -设置ADC ePWM采集窗口
//
void SetupADCEpwm (UINT16通道)
{
UINT16 acqps;
//
//根据分辨率确定最小采集窗口(在SYSCLKS中)
//
IF (ADC_Resolution _12位== AdcbRegs.ADCCTL2.bit.Resolution)
{
acqps =14;//75ns
}
ELSE //分辨率为16位
{
acqps =63;//320ns
}
//
//选择要转换的通道和转换结束标志
//
EALLOW;
AdcbRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps;//样例窗口为100个SYSCLK周期
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C上的触发器
ADcbRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// EOC1结束将设置INT1标志
AdcbRegs.ADCINTSEL1N2.bit.INT1E =1;//启用INT1标志
AdcbRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//
AdcbRegs.ADCINTFLGCLL.bit.ADCINT1 =1;//确保INT1标志已清除
eDIS;
}
void dma_init()
{
//
//初始化DMA
//
DMAInitialize();
DMADest =&RDATA;
//
DMACH5AddrConfig(DMADest,&AdcbResultRegs.ADCRESULT0);
DMACH5BurstConfig (1,0,1);
DMACH5TransferConfig (0,0,1);
DMACH5ModeConfig (6,PERINT_ENABLE,OneShot_disable,CONT_DISABLE,
SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,十六位,
chint_end,chint_enable);
}////
local_d_INTCH5_ISR - DMA通道5 ISR
//
__interrupt void local_d_INTCH5_ISR(void)
{
EALLOW;//需要在ISR内执行EALLOW!!!
DmaRegs.CH5.control.bit.TRANSFERSTS = 1;
DmaRegs.CH5.control.bit.run = 1;
PieCtrlRegs.PIEACK.ALL = PIEACK_group7;// ACK接收更多中断
//来自此饼图组
EDIS;
检查++;
return;
}////
文件结束
//