TA的每日心情 | 奋斗 2018-8-29 20:40 |
---|
签到天数: 1341 天 连续签到: 1 天 [LV.10]以坛为家III
|
本帖最后由 wangku001wei 于 2012-10-16 20:23 编辑
首先看原理图
该程序使用了一个clock,一个DMA,一个VDAC8,一个模拟端口
DMA组件使用硬件触发方式控制DMA传输 DMA传输方向 从RAM 到 外设
clock用于控制传输的快慢
由于一个DMA的 数据操作描述符最大可以支持127个字节,我们这次开辟的保存正选波的数组为100个字节大小
如果我们要使得输出波形的频率为1k,则clcok的频率应该为100*1k = 100k
clock的设置
DMA组件的设置
VDAC8组件的设置
输出引脚的设置
管教分配
由于使用的create1.0没有DMA配置向导用于自动生成DMA的代码 只好自己写相关的代码,create2.0程序就可以自动生成,只需要copy就行了
说明 TD,即 Transaction Descriptor,数据操作描述符
配置DMA的代码
#define DMA_BYTES_PER_BURST 1
#define DMA_REQUEST_PER_BURST 1
#define CYDEV_PERIPH_BASE CYDEV_CLKDIST_BASE
#define DMA_DST_BASE (CYDEV_PERIPH_BASE)
#define VDAC8_Data_PTR ( (reg8 *) VDAC8_viDAC8__D )
uint8 sinArray[100];
uint8 Configure_DMA(void)
{
reg8 * RegPointer;
RegPointer = (reg8 *)sinArray; // 获得数组地址
DMA_ADC_Chan = DMA_DmaInitialize(DMA_BYTES_PER_BURST, // 每次触发传输1个字节
DMA_REQUEST_PER_BURST, // 每次传输都必须有触发才能进行
HI16((uint32)RegPointer), // 源地址高16位
HI16(DMA_DST_BASE)); // 目标地址低16位
CyDmaTdSetConfiguration(DMA_ADC_TD,
100, // 总共传输100个字节
DMA_ADC_TD, // TD 链中下一个传输描述符的索引, 依然为本次的DMA_ADC_TD,表明循环进行
TD_INC_SRC_ADR); // 源地址每次递增
CyDmaTdSetAddress(DMA_ADC_TD,
LO16((uint32)RegPointer), // 源地址低16位
LO16((uint32)VDAC8_Data_PTR)); // 目标地址低16位
CyDmaChSetInitialTd(DMA_ADC_Chan, DMA_ADC_TD);
CyDmaChEnable(DMA_ADC_Chan, 1); // 参数1 表示 TD 完成后DMAC 将恢复 TD 的原始配置值。
}
主函数的代码很简单
uint8 sinArray[100] =
{
127,134,142,150,158,166,173,181,188,195,201,207,213,219,224,229,
234,238,241,245,247,250,251,252,253,253,253,252,251,250,247,245,
241,238,234,229,224,219,213,207,201,195,188,181,173,166,158,150,
142,134,126,119,111,103, 95, 87, 80, 72, 65, 58, 52, 46, 40, 34,
29, 24, 19, 15, 12, 8, 6, 3, 2, 1, 0, 0, 0, 1, 2, 3,
6, 8, 12, 15, 19, 24, 29, 34, 40, 46, 52, 58, 65, 72, 80, 87,
95,103,111,119
};
extern uint8 timerflag;
uint8 DMA_ADC_Chan;
uint8 DMA_ADC_TD;
uint8 Configure_DMA(void);
uint8 Start_DMA_ADC(void);
void main()
{
uint8 count = 0;
uint8 timercount = 0;
VDAC8_Start();
Configure_DMA();
CYGlobalIntEnable;
while(1);
}
对于create1.0 而言,需要额外注意的是,编译环境没有自动提供,CYDEV_PERIPH_BASE 和 VDAC8_Data_PTR 的定义
因此需要手工进行宏定义
#define CYDEV_PERIPH_BASE CYDEV_CLKDIST_BASE
#define VDAC8_Data_PTR ( (reg8 *) VDAC8_viDAC8__D )
而create2.0 就可以直接用这两宏定义
实际输出的波形
可以看出频率比用定时器中断控制的准确的多了
其实在调试的时候也出了很多麻烦的事情,比如说之前说的宏定义,死活不对,一怒之下直接在别的电脑上又装了个Create2.0 ,记得选择完全安装,然后板子就能识别USB驱动
仔细对比了之前从21ic的赛普拉斯论坛上下到的正弦波的例子查找不一致的地方
上传调试好的代码
Create1.0 的工程
myDMA-1.0.rar
(729.18 KB, 下载次数: 13)
|
|