智能车制作

标题: DMA测试程序总不行,求大神指导吖。 [打印本页]

作者: Codcat    时间: 2013-5-19 08:34
标题: DMA测试程序总不行,求大神指导吖。
满满的都是泪,直接上主要程序
打算用FTM2的0通道作为时钟..话说就算GPIO的时钟貌似也没反应..

uint8 src_arr[100];//测试用源序列
uint8 dir_arr[100];//测试用目的序列
void DMA0_Init(void)
{
  SIM_SCGC6|=SIM_SCGC6_DMAMUX_MASK;//打开DMA多路复用器时钟
  SIM_SCGC7|=SIM_SCGC7_DMA_MASK;//打开DMA模块时钟
  DMAMUX_CHCFG0=DMAMUX_CHCFG_SOURCE(34);//DMA通道0对应34号DMA请求,对应FTM2_CH0 模块的请求
  DMA_TCD0_SADDR = (uint32)src_arr;
  DMA_TCD0_SOFF = 1;//每次传送源地址不变//加1
  DMA_TCD0_CITER_ELINKNO=DMA_CITER_ELINKNO_CITER(100);//当前主循环次数,采集点数
  DMA_TCD0_BITER_ELINKNO=DMA_BITER_ELINKNO_BITER(100);//起始主循环次数,采集点数
  DMA_TCD0_ATTR = DMA_ATTR_SSIZE(0) | DMA_ATTR_DSIZE(0);//源数据宽度8bit,目的数据宽度8bit
  DMA_TCD0_NBYTES_MLNO = DMA_NBYTES_MLNO_NBYTES(1);//每次读取一字节
  DMA_TCD0_SLAST = 0;//主循环结束后源地址0回写tcd
  DMA_TCD0_DLASTSGA = 0;
  DMA_TCD0_DADDR=(uint32)dir_arr;//设置目的地址,video数组第一个元素
  DMA_TCD0_DOFF=1;//每次写目的地址加1
  DMA_TCD0_CSR|=DMA_CSR_DREQ_MASK;//DMA通道0主循环结束后停止硬件请求
  DMA_TCD0_CSR|=DMA_CSR_INTMAJOR_MASK;//使能DMA0中断
  DMAMUX_CHCFG0|=DMAMUX_CHCFG_ENBL_MASK;//DMA通道0使能
}


void ftm2_init(void)  
{  
  PORTA_PCR10  =     PORT_PCR_MUX(0x03)|PORT_PCR_DSE_MASK;
  
  SIM_SCGC3   |=    SIM_SCGC3_FTM2_MASK;
  FTM2_C0SC   |=    FTM_CnSC_ELSB_MASK | FTM_CnSC_MSB_MASK | FTM_CnSC_DMA_MASK;//打开DMA请求
  FTM2_C0SC   &=    ~FTM_CnSC_ELSA_MASK;
  //系统时钟,32分频:100M/8/4=3M125K
  //固定进行4分频
  FTM2_SC     =     FTM_SC_CPWMS_MASK|FTM_SC_CLKS(0x01)|FTM_SC_PS(0x03);     
  //禁用写保护,使能FTM1
  FTM2_MODE   |=    FTM_MODE_WPDIS_MASK;  
  FTM2_MODE   &=    ~FTM_MODE_FTMEN_MASK;
  //掩盖通道0输出
  FTM2_OUTMASK  =   ~FTM_OUTMASK_CH0OM_MASK;
  
  FTM2_COMBINE  =   0;
  FTM2_OUTINIT  =   0;
  FTM2_EXTTRIG  =   0;
  FTM2_POL      =   0;
  
  FTM2_QDCTRL   &=  ~FTM_QDCTRL_QUADEN_MASK;
  
  FTM2_INVCTRL  =   0;
  FTM2_SWOCTRL  =   0;
  FTM2_PWMLOAD  =   0;
  
  FTM2_CNTIN    =   0;
  //当前设置为5ms,200hz
  FTM2_MOD      =   10500;
  //占空比50%
  //5050 right
  //left 3000
  FTM2_C0V      =   4000;
  FTM2_CNT      =   0;
}


void main(void)
{
  int i;
  for(i = 0;i < 100;i++)
    src_arr = i+1;
  //1 主程序使用的变量定义
  //2 关中断
  DisableInterrupts;   
  //3 模块初始化
//  init();
  //4 开中断
  ftm2_init();
  EnableInterrupts;
  DMA0_Init();
  DMA_ERQ|=DMA_ERQ_ERQ0_MASK;
  //主循环   
  while(1) ;
  //main_loop();
  //while(1);
}

//对应的是DMA0的中断位置,不过好像从来没进去
void DMA0_isr(void)
{
    DMA_INT|=DMA_INT_INT0_MASK;//清除通道0中断
}

作者: melon_1    时间: 2013-5-19 08:34
这个是我的测试程序你参考一下吧,,GPIO时钟都没反应???之前也是用DMA,后来因为种种原因现在觉得不是那么好用。。。

作者: Codcat    时间: 2013-5-19 12:39
melon_1 发表于 2013-5-19 08:34
这个是我的测试程序你参考一下吧,,GPIO时钟都没反应???之前也是用DMA,后来因为种种原因现在觉得不是那 ...

大神膜拜下~ 之前用GPIO的时候忘了用申请DMA的触发模式了。。。用FTM做DMA触发源还是不能用,估计也是模式配置有问题。不过已经不重要了。嗯,不求甚解。。

作者: melon_1    时间: 2013-5-19 13:29
Codcat 发表于 2013-5-19 12:39
大神膜拜下~ 之前用GPIO的时候忘了用申请DMA的触发模式了。。。用FTM做DMA触发源还是不能用,估计也是模式 ...

现在可以了么???

作者: Codcat    时间: 2013-5-19 19:43
melon_1 发表于 2013-5-19 13:29
现在可以了么???

嗯。可以了。感谢大神指导~





欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2