打印
[技术问题解答]

KL25 ADC+DMA配合

[复制链接]
楼主: ianhom
手机看帖
扫描二维码
随时随地手机跟帖
21
在Generated_Code目录里.

使用特权

评论回复
22
ianhom|  楼主 | 2015-1-26 11:07 | 只看该作者
huzi2099 发表于 2015-1-25 10:42
cw10.6专家模式...

看了代码受益匪浅,还有些地方有些不明白,望指点
void ISR_ADC_DMA(void) {
        DMA_DSR_BCR0 |= (DMA_DSR_BCR_DONE_MASK);
        DMA_DSR_BCR0 |=((ADC_BUFFER_SIZE*CHANNEL_NUM)*sizeof(uint16));
        DMA_DSR_BCR1 |= (DMA_DSR_BCR_DONE_MASK);
        DMA_DSR_BCR1 |=ADC_BUFFER_SIZE*CHANNEL_NUM;
        TimeBase_TPM2++;
}
这个中断会进入吗?我原本的设想是不进入中断。

使用特权

评论回复
23
huzi2099| | 2015-1-26 13:17 | 只看该作者
这段是测试的时候用过的,dma中断最后没有开所以不会来这个中断.

dma的指针是个循环,while1大循环里跟据dma的指针跟进分析数据和计算.

使用特权

评论回复
24
ianhom|  楼主 | 2015-1-26 14:54 | 只看该作者
本帖最后由 ianhom 于 2015-1-26 17:12 编辑
huzi2099 发表于 2015-1-26 13:17
这段是测试的时候用过的,dma中断最后没有开所以不会来这个中断.

dma的指针是个循环,while1大循环里跟据dma ...

感谢回复!我想问一下,当DSR_BCR计数清零以后,还会继续DMA转移吗?这个地方我没有搞明白。还有DMAMUX1通道开启了周期触发功能,但是没有PIT相关配置,请问这样配置的目的。早复为盼!

使用特权

评论回复
25
ianhom|  楼主 | 2015-1-26 17:21 | 只看该作者
ianhom 发表于 2015-1-26 14:54
感谢回复!我想问一下,当DSR_BCR计数清零以后,还会继续DMA转移吗?这个地方我没有搞明白。还有DMAMUX1通 ...


我尝试用图示的方式关闭中断,在BCR计数清零后就不在进行DMA转移,请问如何关闭中断并持续DMA转移呢?
开中断的效果是BCR计数会被重新装载,如何配置才能实现无中断下同样的效果呢。

使用特权

评论回复
26
Thefantasy| | 2015-1-26 20:46 | 只看该作者
首先初始化ADC,DMA,然后初始化PIT并使能PIT。
查询法等待PIT定时到,定时到之后启动ADC转换,等待ADC转换完成标志COCO标志完成,如果初始化是通过ADC触发DMA,并且DMA设置好源地址为ADC数据结果寄存器,一旦ADC的COCO标志完成,DMA就会自动实现数据存储到特定位置。
然后你再等待下一次的定时到,启动ADC转换...

使用特权

评论回复
27
ianhom|  楼主 | 2015-1-26 21:09 | 只看该作者
Thefantasy 发表于 2015-1-26 20:46
首先初始化ADC,DMA,然后初始化PIT并使能PIT。
查询法等待PIT定时到,定时到之后启动ADC转换,等待ADC转换 ...

感谢回复!问题在于DMA的BCR计数减为零后,如何在没有代码干预,也没有中断的操作下重新给BCR赋值,让DMA转移无限继续下去

使用特权

评论回复
28
huzi2099| | 2015-1-26 23:14 | 只看该作者
其实这个已经无所谓了,dma转换一轮周期时间已经很长了,所以开销很小的.
你可以增加被链接通道数据表的长度...
上面的回复可能是有问题,自己也记不清了,对不住哈.

使用特权

评论回复
29
hotmanzzg| | 2015-1-27 12:37 | 只看该作者
huzi2099 发表于 2015-1-25 22:23
在Generated_Code目录里.

你好, 用的是什么集成开发环境啊?

使用特权

评论回复
30
huzi2099| | 2015-1-28 09:02 | 只看该作者
hotmanzzg 发表于 2015-1-27 12:37
你好, 用的是什么集成开发环境啊?

Codewarrior 10.6

使用特权

评论回复
31
ianhom|  楼主 | 2015-1-29 22:25 | 只看该作者
在大家的指点下完成了TPM+ADC+DMA的配置,TPM触发ADC工作,ADC转换完成后触发DMA转移数据,在DMA转移计数归零后进入一次中断重载DMA的BCR计数,使循环继续下去。如果有高人能让那个中断都不用进入,跪求指点!!

使用了DMA的循环缓冲区,用了512字节,所以用自己写了个函数实现申请地址512对齐的变量。可能有些细节没有考虑清楚。AD数据会通过DMA0通道循环存放在循环缓冲区中,DMA1通道用于切换AD通道,用这个方法极大降低了进入中断的次数(没算错的话是52万次ADC中断变成了只有1次的DMA中断)。

只做了IAR的工程,KEIL的工程不知道为什么malloc不能用,同样请大神指点!!

工程适用于KL25Z FRDM 的 FREEDOM开发板,读取的8个AD通道依次为PTE20,PTE21,PTE22,PTE23,PTB0,PTB1,PTB2和芯片温度。使用串口助手输入1-8就可以读到相应通道的AD数值,十六进制和十进制的。

下图是串口输出的芯片温度AD值


时间比较紧,完成后没有细查,可能存在问题,欢迎大家指正!
TPM ADC DMA_IAR_Ian.rar (1.81 MB)
再次感谢 @huzi2099@FSL_TICS_ZJJ 的帮助!

使用特权

评论回复
32
huzi2099| | 2015-1-29 22:49 | 只看该作者
ianhom 发表于 2015-1-29 22:25
在大家的指点下完成了TPM+ADC+DMA的配置,TPM触发ADC工作,ADC转换完成后触发DMA转移数据,在DMA转移计数归 ...

好,有前途

使用特权

评论回复
33
lhaven| | 2015-3-20 22:32 | 只看该作者
感谢分享

使用特权

评论回复
34
pop_wu| | 2015-3-27 15:33 | 只看该作者
ianhom 发表于 2015-1-29 22:25
在大家的指点下完成了TPM+ADC+DMA的配置,TPM触发ADC工作,ADC转换完成后触发DMA转移数据,在DMA转移计数归 ...

请问一下楼主 我用的是kL26的开发板 寄存器是一样的 我把楼主的移植过去之后编译没有问题,但是连续运行32次之后就会出错 您能帮忙看一下吗

使用特权

评论回复
35
pop_wu| | 2015-3-27 15:37 | 只看该作者
求教      

20150327153413.png (6.76 KB )

20150327153413.png

使用特权

评论回复
36
pop_wu| | 2015-3-27 15:39 | 只看该作者
还有请问一下楼主 配置管脚复用的初始化部分在哪里呢 找了很长时间没有看到  

使用特权

评论回复
37
pop_wu| | 2015-3-28 08:03 | 只看该作者
ianhom 发表于 2015-1-29 22:25
在大家的指点下完成了TPM+ADC+DMA的配置,TPM触发ADC工作,ADC转换完成后触发DMA转移数据,在DMA转移计数归 ...

请问一下楼主 您是在哪里配置的bcr=0之后触发dma1中断的呢

使用特权

评论回复
38
pop_wu| | 2015-3-28 08:57 | 只看该作者
楼主  我发现了 如果把dma1中断函数声明放在
#undef  VECTOR_017
#define VECTOR_017 DMA1_Irq
之前就正常了

使用特权

评论回复
39
pop_wu| | 2015-3-28 08:58 | 只看该作者
我看了官方的例程 也是先声明 然后映射到中断向量表

使用特权

评论回复
40
ianhom|  楼主 | 2015-4-9 12:34 | 只看该作者
pop_wu 发表于 2015-3-27 15:33
请问一下楼主 我用的是kL26的开发板 寄存器是一样的 我把楼主的移植过去之后编译没有问题,但是连续运行3 ...

blog.chinaunix.net/uid-29151369-id-4810152.html
这里有详细的说明,不知道能不能帮到你

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则