智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2921|回复: 4
打印 上一主题 下一主题

DMA测试程序总不行,求大神指导吖。

[复制链接]

3

主题

42

帖子

0

精华

高级会员

Rank: 4

积分
593
威望
284
贡献
117
兑换币
110
注册时间
2012-2-3
在线时间
96 小时
毕业学校
中国计量学院
跳转到指定楼层
1#
发表于 2013-5-19 08:34:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
20贡献
满满的都是泪,直接上主要程序
打算用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中断
}

最佳答案

查看完整内容

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

53

主题

641

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5159

优秀会员奖章活跃会员奖章论坛骨干奖章论坛元老奖章在线王奖章

威望
2314
贡献
1085
兑换币
996
注册时间
2012-8-8
在线时间
880 小时
毕业学校
dfzx
2#
发表于 2013-5-19 08:34:21 | 只看该作者
这个是我的测试程序你参考一下吧,,GPIO时钟都没反应???之前也是用DMA,后来因为种种原因现在觉得不是那么好用。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

3

主题

42

帖子

0

精华

高级会员

Rank: 4

积分
593
威望
284
贡献
117
兑换币
110
注册时间
2012-2-3
在线时间
96 小时
毕业学校
中国计量学院
3#
 楼主| 发表于 2013-5-19 12:39:15 | 只看该作者
melon_1 发表于 2013-5-19 08:34
这个是我的测试程序你参考一下吧,,GPIO时钟都没反应???之前也是用DMA,后来因为种种原因现在觉得不是那 ...

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

使用道具 举报

53

主题

641

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5159

优秀会员奖章活跃会员奖章论坛骨干奖章论坛元老奖章在线王奖章

威望
2314
贡献
1085
兑换币
996
注册时间
2012-8-8
在线时间
880 小时
毕业学校
dfzx
4#
发表于 2013-5-19 13:29:17 | 只看该作者
Codcat 发表于 2013-5-19 12:39
大神膜拜下~ 之前用GPIO的时候忘了用申请DMA的触发模式了。。。用FTM做DMA触发源还是不能用,估计也是模式 ...

现在可以了么???
回复

使用道具 举报

3

主题

42

帖子

0

精华

高级会员

Rank: 4

积分
593
威望
284
贡献
117
兑换币
110
注册时间
2012-2-3
在线时间
96 小时
毕业学校
中国计量学院
5#
 楼主| 发表于 2013-5-19 19:43:22 | 只看该作者
melon_1 发表于 2013-5-19 13:29
现在可以了么???

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-27 16:09 , Processed in 0.050382 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表