本帖最后由 ianhom 于 2015-4-27 14:12 编辑
请问ADC配合DMA使用是,如何配置ADC触发DMA呢,比如周期触发AD采样,采样完成后触发DMA,然后结果存在特定位置。全程不进入定时器中断、AD中断和DMA中断
2015-04-27更新:
代码已经移植到KL16上,配置方式与KL25相同。
KL25和KL16的DMA循环buffer必须定义在特定的对齐地址上,例如1024个字节的循环buffer,则DMA的目的地址必须是1024字节对齐(0xXXXXX000,0xXXXXX400,0xXXXXX800,0xXXXXC00),为了获取对齐的地址,测试代码中通过malloc的方式计算到对齐地址再进行申请,这里需要注意的一点,我采用官方FRDM-KL25Z开发板例程,使用的是工程中自带的alloc.c中的malloc函数去实现的,该函数每次malloc返回的地址是递减,所以测试代码在官方例程中应该是没有问题的。如果对测试代码进行移植并使用的是C标准库中的malloc函数(返回地址是递增的),则测试代码中地址对齐的函数是无效的,有兴趣的朋友可以自行实现一下,比较简单。
还有一个比较简单的方式实现对齐地址的变量申请:
#pragma data_alignment = 1024 /* 下一行变量将定义在1024字节对齐的地址上 */
static unsigned char sg_aucAdData[1024] = {0}; /* sg_aucAdData为DMA循环buffer的地址 */
不过该方法有个问题,就是循环buffer将建立在内存的静态全局区,因为1024字节对齐,会造成对齐地址之前的内存被浪费掉(全局变量在编译时就确定了)。如果是为了快速验证KL平台上ADC+DMA,可采用此方法。
更有效申请特定内存地址的方法还在摸索中,求大神指导。
此贴已结,测试代码在31楼
|