智能车制作

标题: 分享冷火单片机DMA采集摄像头与DTIM采集外部脉冲 [打印本页]

作者: 直立摄像头    时间: 2014-4-9 09:39
标题: 分享冷火单片机DMA采集摄像头与DTIM采集外部脉冲
  1. void DTIM3_Init()//配置DMA Timer
  2. {
  3.         MCF_INTC0_IMRL&=~MCF_INTC_IMRL_MASKALL;
  4.         MCF_INTC0_IMRL|=MCF_INTC_IMRL_INT_MASK22;//DTIM3
  5.        
  6.         MCF_INTC0_ICR22=MCF_INTC_ICR_IP(6)+MCF_INTC_ICR_IL(2);

  7.         MCF_DTIM_DTMR(3)=0;    //清空dtmr寄存器
  8.         MCF_DTIM_DTER(3)|=MCF_DTIM_DTER_REF;//DMA标志位清零
  9.         MCF_DTIM_DTMR(3)=MCF_DTIM_DTMR_CE_NONE
  10.                                         |MCF_DTIM_DTMR_PS(0)//系统时钟的1分频;
  11.                                         |MCF_DTIM_DTMR_OM
  12.                                         |MCF_DTIM_DTMR_CLK_DIV1 //使用系统时钟sysclk;
  13.                                         |MCF_DTIM_DTMR_ORRI//输出触发的使能
  14.                                         |MCF_DTIM_DTMR_FRR;//每次计数到后清零
  15.         MCF_DTIM_DTXMR(3)|=MCF_DTIM_DTXMR_DMAEN;   //DMA询问使能,中断无效
  16.        
  17. }
  18. void DMA_Init()
  19. {
  20.         MCF_GPIO_PTJPAR = 0x00;      // 配置PTJ为普通IO   
  21.         MCF_GPIO_DDRTJ = 0x00;    // 设置PTJ为输入

  22.         MCF_GPIO_PTCPAR |= MCF_GPIO_PTCPAR_DTIN3_DTIN3  ;
  23.         MCF_DMA_DSR(3) |= MCF_DMA_DSR_DONE;//清除中断标志位
  24.         MCF_SCM_MPR = MCF_SCM_MPR_MPR(0x05);//允许DMA在用户和特权模式下作为主设备
  25.         MCF_SCM_DMAREQC = MCF_SCM_DMAREQC_DMAC3(0x7);//DMA timer3 对应 DMA通道3;
  26.         MCF_DMA_SAR(3)=PTJ_ADDRESS;//源地址
  27.         //MCF_DMA_DAR(3)=(uint32)(&IMG[0][0]);
  28.         //MCF_DMA_BCR(3)=100;
  29.         MCF_DMA_DCR(3)=//MCF_DMA_DCR_INT
  30.                                 MCF_DMA_DCR_DSIZE(1)
  31.                                 |MCF_DMA_DCR_SSIZE(1)//byte
  32.                                 |MCF_DMA_DCR_DINC//目的地址自增
  33.                                 |MCF_DMA_DCR_D_REQ//EEXT bit is cleared when the BCR is exhausted.
  34.                                 |MCF_DMA_DCR_CS//周期窃取
  35.                                 |MCF_DMA_DCR_EEXT;

  36.         //interrupt enable       
  37.         MCF_INTC0_IMRL&=~MCF_INTC_IMRL_MASKALL;
  38.         MCF_INTC0_IMRL&=~MCF_INTC_IMRL_INT_MASK12;//cannel 3
  39.         MCF_INTC0_ICR12=MCF_INTC_ICR_IP(6)+MCF_INTC_ICR_IL(6);
  40.         DTIM3_Init();//配置DMA Timer,设置为PCLK触发
  41. }
  42. void DMA_start(uint8 line)
  43. {
  44.         MCF_DMA_DSR(3) |= MCF_DMA_DSR_DONE;//清除中断标志位
  45.         //MCF_DMA_SAR(3)=PTJ_ADDRESS;
  46.         MCF_DMA_DAR(3)=(uint32)(&IMG[line][0]);//目的地址
  47.         MCF_DMA_BCR(3)=100;//采集个数
  48.         MCF_DTIM_DTRR(3)=28;//调这个参数相当于调定时采集的延时,具体效果可以调这个参数,用上位机看图像效果,如果发现右边都是黑的,那就说明这个数值大了,如果发现仅采到图像的左边部分,那就说明这个数值小了
  49.         MCF_DTIM_DTMR(3)|=MCF_DTIM_DTMR_RST;
  50.         MCF_DMA_DCR(3)|= MCF_DMA_DCR_EEXT;       
  51.        
  52. }

  53. 上面这个是定时触发采集DMA的。
复制代码

这个是外部脉冲触发采集DMA的
  1. //外部脉冲连接到P4引脚,定时读取MCF_DTIM_DTCN(2),读取后可清零
  2. void DTIM2_Init()
  3. {
  4.         MCF_GPIO_PTCPAR |= MCF_GPIO_PTCPAR_DTIN2_DTIN2;
  5.         MCF_DTIM_DTMR(2)=0;
  6.         MCF_DTIM_DTMR(2)|=MCF_DTIM_DTMR_CE_NONE //不进行捕捉
  7.                                         |MCF_DTIM_DTMR_CLK_DTIN //外部时钟源
  8.                                         |MCF_DTIM_DTMR_FRR;//触发事件之后计数值清零
  9.         MCF_DTIM_DTRR(2)=0xFFFFFFFF;//计数器基准值,32位,可以计到0xFFFFFFFF                               
  10.         MCF_DTIM_DTMR(2)|=MCF_DTIM_DTMR_RST;       
  11. }
  12.        
复制代码
这个是采集脉冲的,这样使用冷火单片机的电磁组跟摄像头组的同学们就能实现GPT+DTIM测速了


作者: 直立摄像头    时间: 2014-4-9 09:42

  1. void DTIM3_Init()//频率80M,配置DMA Timer
  2. {
  3. /********************PCLK触发DMA**********************************/

  4.         MCF_INTC0_IMRL&=~MCF_INTC_IMRL_MASKALL;
  5.         MCF_INTC0_IMRL|=MCF_INTC_IMRL_INT_MASK22;//DTIM3
  6.        
  7.         MCF_INTC0_ICR22=MCF_INTC_ICR_IP(7)+MCF_INTC_ICR_IL(2);
  8.         //MCF_DTIM0_DTMR&=~MCF_DTIM_DTMR_RST;
  9.         MCF_DTIM_DTMR(3)=0;    //清空dtmr寄存器
  10.         MCF_DTIM_DTER(3)|=MCF_DTIM_DTER_CAP;//输入捕捉
  11.         MCF_DTIM_DTER(3)|=MCF_DTIM_DTER_REF;//
  12.         MCF_DTIM_DTMR(3)|=MCF_DTIM_DTMR_CE_RISE;//捕捉上升沿
  13.                                         //|MCF_DTIM_DTMR_CLK_DIV1//使用系统时钟sysclk;
  14.                                         //|MCF_DTIM_DTMR_ORRI//达到基准值,触发DMA或中断
  15.                                         //|MCF_DTIM_DTMR_FRR;//每次计数到后清零
  16.         MCF_DTIM_DTXMR(3)|=MCF_DTIM_DTXMR_DMAEN;//DMA询问使能,中断无效
  17.         MCF_DTIM_DTRR(3)=0xFFFFFFFF;//计数器基准值
  18.         //MCF_DTIM_DTMR(3) |= MCF_DTIM_DTMR_PS(0x5);
  19.         //MCF_DTIM_DTMR(3)|=MCF_DTIM_DTMR_RST;
  20. }
  21. void DMA_Init()
  22. {
  23.         MCF_GPIO_PTJPAR = 0x00;      // 配置PTJ为普通IO   
  24.         MCF_GPIO_DDRTJ = 0x00;    // 设置PTJ为输入

  25.         MCF_GPIO_PTCPAR |= MCF_GPIO_PTCPAR_DTIN3_DTIN3  ;  //输入捕捉
  26.         MCF_DMA_DSR(3) |= MCF_DMA_DSR_DONE;//清除中断标志位
  27.         MCF_SCM_MPR = MCF_SCM_MPR_MPR(0x05);//允许DMA在用户和特权模式下作为主设备
  28.         MCF_SCM_DMAREQC = MCF_SCM_DMAREQC_DMAC3(0x7);//DMA timer3 对应 DMA通道3;
  29.         MCF_DMA_SAR(3)=PTJ_ADDRESS;//源地址
  30.         //MCF_DMA_DAR(3)=(uint32)(&IMG[0][0]);//目的地址
  31.         //MCF_DMA_BCR(3)=100;
  32.         MCF_DMA_DCR(3)=//MCF_DMA_DCR_INT
  33.                                 MCF_DMA_DCR_DSIZE(1)
  34.                                 |MCF_DMA_DCR_SSIZE(1)//byte
  35.                                 |MCF_DMA_DCR_DINC//目的地址自增
  36.                                 |MCF_DMA_DCR_D_REQ//EEXT bit is cleared when the BCR is exhausted.
  37.                                 |MCF_DMA_DCR_CS//周期窃取
  38.                                 |MCF_DMA_DCR_EEXT;

  39.         //interrupt enable       
  40.         MCF_INTC0_IMRL&=~MCF_INTC_IMRL_MASKALL;
  41.         MCF_INTC0_IMRL&=~MCF_INTC_IMRL_INT_MASK12;//cannel 3
  42.         MCF_INTC0_ICR12=MCF_INTC_ICR_IP(6)+MCF_INTC_ICR_IL(6);
  43.         DTIM3_Init();//配置DMA Timer,设置为PCLK触发
  44. }
  45. //每次进行中断后调用这个函数,传入参数为数组第line_counter行的的首地址

  46. void DMA_start(uint8 line)
  47. {
  48. /********************PCLK触发DMA**********************************/       

  49.         MCF_DMA_DSR(3) |= MCF_DMA_DSR_DONE;//清除中断标志位
  50.         //MCF_DMA_SAR(3)=PTJ_ADDRESS;//在该函数中不必更改源地址了,因为一直都是相同的
  51.         MCF_DMA_DAR(3)=(uint32)(&IMG[line][0]);//目的地址
  52.         MCF_DMA_BCR(3)=100;//采集个数
  53.         MCF_DMA_DCR(3)|= MCF_DMA_DCR_EEXT;
  54.         MCF_DTIM_DTMR(3)|=MCF_DTIM_DTMR_RST;       
  55. }



复制代码

作者: 直立摄像头    时间: 2014-4-9 09:43
2楼是脉冲触发的,大家可以对比一下定时触发跟脉冲触发的程序
作者: 直立摄像头    时间: 2014-4-9 09:44
中断级别可以不配置,因为没有允许中断服务子程序,所以不会进入中断
作者: 雷克斯丶LUX    时间: 2014-4-10 17:11
我拿回去试试哈
作者: 雷克斯丶LUX    时间: 2014-4-10 17:24
你用的冷火哪一种单片机啊,是MCF52255吗
作者: 直立摄像头    时间: 2014-4-10 17:45
雷克斯丶LUX 发表于 2014-4-10 17:24
你用的冷火哪一种单片机啊,是MCF52255吗



作者: 小豪no1    时间: 2014-4-10 18:32
能加个好友吗我扣扣2861539354
作者: 春暖花开谎的我    时间: 2014-4-11 14:26
大神,你的测速成功了吗

作者: 雷克斯丶LUX    时间: 2014-4-11 17:26
有用MCF52255采集摄像头的吗,QQ448182268加好友
作者: 直立摄像头    时间: 2014-4-11 19:29
春暖花开谎的我 发表于 2014-4-11 14:26
大神,你的测速成功了吗

这些代码都是成功的

作者: 春暖花开谎的我    时间: 2014-4-11 20:14
大神你那个测速的是用的参考比较模式么?外部的编码器脉冲和0xffffff比较么?这编码器应该没那么多脉冲吧,还是我理解错了呢,还有就是dma测速还需不需要触发中断或DMA呢,我用的您的程序,结果speed=MCF_DTIM_DTCN(2);一直为0
作者: 直立摄像头    时间: 2014-4-11 21:29
春暖花开谎的我 发表于 2014-4-11 20:14
大神你那个测速的是用的参考比较模式么?外部的编码器脉冲和0xffffff比较么?这编码器应该没那么多脉冲吧, ...

外部脉冲连接到P4引脚,定时读取MCF_DTIM_DTCN(2),这样子不行?你先确定是有没有外部脉冲先?不如你搞个PWM接到P4引脚试一下。程序是没问题的。


作者: 小豪no1    时间: 2014-4-11 22:19
你那个pclk是摄像头的吗
作者: 直立摄像头    时间: 2014-4-11 23:22
小豪no1 发表于 2014-4-11 22:19
你那个pclk是摄像头的吗



作者: 996095163    时间: 2014-4-11 23:24
我也是啊!
作者: 直立摄像头    时间: 2014-4-11 23:25
这些代码都是成功的,如果你们没调出来,请检查相应的硬件,确定硬件没问题的话,可以对照着手册去看寄存器的配置。
作者: 雷克斯丶LUX    时间: 2014-4-12 08:30
大神能加个好友吗448182268
作者: 雷克斯丶LUX    时间: 2014-4-12 08:33
就是传输不了,我另外创了一个数组,然后进行传值没反应
作者: 小豪no1    时间: 2014-4-12 12:51
你用的什么摄像头啊,dma用什么模式传输啊?
作者: 直立摄像头    时间: 2014-4-12 14:34
小豪no1 发表于 2014-4-12 12:51
你用的什么摄像头啊,dma用什么模式传输啊?

看清楚点,上面有两个模式的

作者: 春暖花开谎的我    时间: 2014-4-12 20:12
大神我的那个DTIN测速稍微测试了一下,能测速,现在要改开发板,两个都用DTIN测速,我还要给摄像头PCLK弄个DTIN,加起来一共用了三个DTIN,我想问下会不会有影响呢,我知道测速方法还有GPT3,我还没看呢,大神给个建议呗
作者: 直立摄像头    时间: 2014-4-12 20:25
春暖花开谎的我 发表于 2014-4-12 20:12
大神我的那个DTIN测速稍微测试了一下,能测速,现在要改开发板,两个都用DTIN测速,我还要给摄像头PCLK弄个 ...

那你就去看DTIM的其它引脚有没有被你其它地方用到?用GPT也行


作者: ぉ曙光。    时间: 2014-4-12 20:26
大神,我用的你出来这个图是怎么回事呀[img]file:///C:\Users\Administrator\AppData\Roaming\Tencent\Users\994327432\QQ\WinTemp\RichOle\@]G$J4)0CYXG[D(]CZ{ME}L.jpg[/img]
作者: 春暖花开谎的我    时间: 2014-4-12 21:14
嗯,其他地方没用到DTIN,只是听说DMA会不会占总线什么的,我不太懂
作者: 直立摄像头    时间: 2014-4-12 21:35
春暖花开谎的我 发表于 2014-4-12 21:14
嗯,其他地方没用到DTIN,只是听说DMA会不会占总线什么的,我不太懂

不懂就看手册吧

作者: 春暖花开谎的我    时间: 2014-4-12 21:36
恩恩,谢谢大神
作者: Seventh    时间: 2014-4-14 21:22
ぉ曙光。 发表于 2014-4-12 20:26
大神,我用的你出来这个图是怎么回事呀

请教,用定时器触发,摄像头的pclk要不要接到dtim的引脚上面?
作者: 雷克斯丶LUX    时间: 2014-4-18 21:30
帅哥在吗QQ能帮下忙吗
作者: 庄炎荣    时间: 2014-4-18 23:14
直立摄像头 发表于 2014-4-11 23:22

可以用PWM去代替这个PCLK吗
作者: 把球给我。。    时间: 2014-4-23 23:29
直立摄像头 发表于 2014-4-9 09:42

你这个好像没有设置DMA传输完成触发DMA中断啊,好使吗??


作者: 把球给我。。    时间: 2014-4-23 23:35
直立摄像头 发表于 2014-4-9 09:42

[attach]58912[/attach][attach]58912[/attach]
作者: 直立摄像头    时间: 2014-4-24 18:20
把球给我。。 发表于 2014-4-23 23:35

不用进中断,这是硬件上的搬运

作者: 把球给我。。    时间: 2014-4-25 19:29
不怎么懂,能加个QQ吗?请教请教
作者: 把球给我。。    时间: 2014-4-25 20:02
91373122
作者: 把球给我。。    时间: 2014-4-25 20:03
919373122
作者: tonystark    时间: 2014-4-26 20:32
直立摄像头 发表于 2014-4-9 09:42

[attach]59034[/attach]
这三个报错啊大神,是啥原因呢?

作者: 直立摄像头    时间: 2014-4-26 21:58
tonystark 发表于 2014-4-26 20:32
这三个报错啊大神,是啥原因呢?

查字典

作者: tonystark    时间: 2014-4-27 09:01
直立摄像头 发表于 2014-4-26 21:58
查字典

就是不明白,第一个error。呢个源地址是哪来的?

作者: 直立摄像头    时间: 2014-4-27 09:57
#define PTJ_ADDRESS         0x40100036
作者: tonystark    时间: 2014-4-28 22:55
直立摄像头 发表于 2014-4-9 09:43
2楼是脉冲触发的,大家可以对比一下定时触发跟脉冲触发的程序

大神,摄像头图像DMA采集,用的是定时触发还是脉冲触发?
作者: 直立摄像头    时间: 2014-4-29 09:28
tonystark 发表于 2014-4-28 22:55
大神,摄像头图像DMA采集,用的是定时触发还是脉冲触发?

数字摄像头都可以,模拟一般用定时
作者: 把球给我。。    时间: 2014-5-1 21:01
大神,dma的外部接口是对应P口的0.2.4.6吗
作者: tonystark    时间: 2014-5-11 10:37
把球给我。。 发表于 2014-5-1 21:01
大神,dma的外部接口是对应P口的0.2.4.6吗



作者: 把球给我。。    时间: 2014-5-11 16:16
在PCLK触发dma中设置dtim和DMA中断是干嘛的呀?可以不用吗
作者: 灬爱    时间: 2014-5-11 16:22

作者: 春暖花开谎的我    时间: 2014-5-12 17:08
主频80M,7620.还需要写SCCB吗?我用脉冲触发采到的一片黑
作者: 幕水欣留芳    时间: 2014-5-16 20:16
直立摄像头 发表于 2014-4-11 21:29
外部脉冲连接到P4引脚,定时读取MCF_DTIM_DTCN(2),这样子不行?你先确定是有没有外部脉冲先?不如你搞个PW ...

嗯嗯,确实没问题哦,我试了,成功了,用的PIT定时中断,但现在我想用GPT怎么弄

作者: absentyk    时间: 2014-5-22 16:31
直立摄像头 发表于 2014-4-9 09:43
2楼是脉冲触发的,大家可以对比一下定时触发跟脉冲触发的程序

正需要用DTIM和GPT测速,可是在初始化DTIM时出现错误
#include "MCF52255.h"
#include "MCF52255_DTIM.h"
void DTIM_init(void)
{
MCF_GPIO_PTCPAR|=MCF_GPIO_PTCPAR_DTIN2_DTIN2;
MCF_DTIM_DTMR(2)=0x00;
MCF_DTIM_DTMR(2)=MCF_DTIM_DTMR_CE_NONE//不捕捉
     |MCF_DTIM_DTMR_CLK_DTIN//外部输入
     |MCF_DTIM_DTMR_FRR;//达到预设值计数器复位     
MCF_DTIM_DTRR(2)=0xFFFFFFFF;//预设一个大值
MCF_DTIM_DTMR(2)=MCF_DTIM_DTMR_RST;//复位
}
主程序
void main(void)
{
int i=0,j=0,k=0;
    IO_init();
    key_init();        
    OLCD_init();
    ADC_init();
PWM_init();
DTIM_init();
}
编译后出错Error:function has no prototype
main.c line314 DTIM_init();


这是什么原因造成的?


作者: 直立摄像头    时间: 2014-5-22 17:08
absentyk 发表于 2014-5-22 16:31
正需要用DTIM和GPT测速,可是在初始化DTIM时出现错误
#include "MCF52255.h"
#include "MCF52255_DTIM. ...

没声明函数

作者: absentyk    时间: 2014-5-22 17:14
直立摄像头 发表于 2014-5-22 17:08
没声明函数

能具说详细点吗?我是新手,C上有很多不懂的
作者: absentyk    时间: 2014-5-22 17:29
absentyk 发表于 2014-5-22 17:14
能具说详细点吗?我是新手,C上有很多不懂的

好了,知道了,就是声明,但是有一个疑问,为什么其他模块的初始化都没有声明也可以调用呢?
作者: 槲落槐苍    时间: 2014-6-6 21:10
楼主,我想用单片的PWM做外部触发脉冲,DMA是怎么设置触发端口是哪个的?你说用外部触发源接P口,这是什么意思,程序里面哪里体现了P口的作用
作者: 金刀丸    时间: 2014-6-7 08:44
呦!周期窃取模式
作者: dingyongbin    时间: 2014-6-7 11:53
???
作者: woshisisi    时间: 2014-6-9 19:43
大神,能不能加个Q啊??382991208
作者: absentyk    时间: 2014-6-11 02:20
春暖花开谎的我 发表于 2014-4-12 20:12
大神我的那个DTIN测速稍微测试了一下,能测速,现在要改开发板,两个都用DTIN测速,我还要给摄像头PCLK弄个 ...

新手求教,我也想用DTIM测速,可是结果跟你开始一样,读取值一直为0,请问你是怎么解决的?
作者: absentyk    时间: 2014-6-11 03:41
春暖花开谎的我 发表于 2014-4-12 21:36
恩恩,谢谢大神

DTIM测速,求助,读取值一直为0啊
作者: 啊变变变    时间: 2014-6-11 09:14
春暖花开谎的我 发表于 2014-4-11 20:14
大神你那个测速的是用的参考比较模式么?外部的编码器脉冲和0xffffff比较么?这编码器应该没那么多脉冲吧, ...

测速使用输入捕捉即可
作者: 日月之迹    时间: 2014-6-11 18:38
1092734906可以加好友不~
作者: 冬天来了    时间: 2015-1-4 17:30
能加个qq吗?443026507求助
作者: 让“孟”飞起来    时间: 2015-6-6 17:25
直立摄像头 发表于 2014-4-11 21:29
外部脉冲连接到P4引脚,定时读取MCF_DTIM_DTCN(2),这样子不行?你先确定是有没有外部脉冲先?不如你搞个PW ...

p4引脚是哪个??





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