微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Cortex-M3学习日志(五)-- -- DAC实验

Cortex-M3学习日志(五)-- -- DAC实验

时间:11-21 来源:互联网 点击:

,可以大大节省系统资源。DMA模式又可以分为Single-Word DMA(单字节DMA)和Multi-Word DMA(多字节DMA)两种,其中所能达到的最大传输速率也只有16.6MB/s。DMA有两个技术特征,首先是直接传送,其次是块传送。

DMA工作过程

当进程要求设备输入数据时,CPU把准备存放输入数据的内存起始地址以及要传送的字节数分别送入DMA控制器中的内存地址寄存器和传送字节计数器。

发出数据传输要求的进行进入等待状态。此时正在执行的CPU指令被暂时挂起。进程调度程序调度其他进程占据CPU。

输入设备不断地窃取CPU工作周期,将数据缓冲寄存器中的数据源源不断地写入内存,直到所要求的字节全部传送完毕。

DMA控制器在传送完所有字节时,通过中断请求线发出中断信号。CPU在接收到中断信号后,转入中断处理程序进行后续处理。

中断处理结束后,CPU返回到被中断的进程中,或切换到新的进程上下文环境中,继续执行。

DMA与中断的区别

中断方式是在数据缓冲寄存器满之后发出中断,要求CPU进行中断处理,而DMA方式则是在所要求传送的数据块全部传送结束时要求CPU进行中断处理。这就大大减少了CPU进行中断处理的次数。

中断方式的数据传送是在中断处理时由CPU控制完成的,而DMA方式则是在DMA控制器的控制下,不经过CPU控制完成的。这就排除了CPU因并行设备过多而来不及处理以及因速度不匹配而造成数据丢失等现象。

在DMA方式中,由于I/O设备直接同内存发生成块的数据交换,因此I/O效率比较高。由于DMA技术可以提高I/O效率,因此在现代计算机系统中,得到了广泛的应用。许多输入输出设备的控制器,特别是块设备的控制器,都支持DMA方式。

通过上述分析可以看出,DMA控制器功能的强弱,是决定DMA效率的关键因素。DMA控制器需要为每次数据的传送做大量的工作,数据传送单位的增大意味着传送次数的减少。另外,DMA方式窃取了时钟周期,CPU处理效率降低了,要想尽量少地窃取时钟周期,就要设法提高DMA控制器的性能,这样可以较少地影响CPU出理效率。

好了,关于DAM的知识先总结到这,要想使用LPC1768的DAM功能,需要配置D/A转换控制寄存器DACCTRL与DAC转换计数寄存器DACCNTVAL。这次实验只是简单的学习怎样使用DAC,所以没有用到DAM。下面说一下实验电路,就是把DAC转换的电压通过放大器输出到Speaker,电压值不同,则Speaker的响度就不一样,如下图所示:

1-7 DAC实验电路图

关于LM386M已经是烂大街的芯片,关于它的应用网上有成大堆的资料可供参考,这里就不总结它的用法了,下面贴上这次实验的程序:

关于LM386M已经是烂大街的芯片,关于它的应用网上有成大堆的资料可供参考,这里就不总结它的用法了,下面贴上这次实验的程序:

一、dac.c程序源代码

#include"includes.h"

void DACInit( void )

{

PINCON -> PINSEL1 = 0x00200000;

}

void DacOut(unsigned int val)

{

DAC -> DACR = ((val < 16)/3300) | DAC_BIAS;

}

二、main.c程序部分源代码

void DacConver(unsigned int val)

{

unsigned int hi = 0;

unsigned int low = 0;

hi= val/1000;

low = val00/100;

DacVal[16]= (unsigned char)hi + 0x30;

DacVal[18]= (unsigned char)low + 0x30;

DacOut(val);

UARTSend(0,DacVal,25);

}

int main(void)

{

unsigned int i = 0;

SystemInit();

SysTick_Config(SystemFrequency/1000 - 1);

PortInit();

DACInit();

UARTInit(0,19200);

for(i=0;i<7;i++)

{

UARTSend(0,OpenString[i],50);

}

DacConver(2000);// 2.0v

DacConver(2500);// 2.5v

DacConver(3000);// 3.0v

DacConver(3300);// 3.0v

//LedOnMeg[4] = 4+0x30;

//UART0_SendString (KeyMeg);

while(1)

{

KeyScan();//按键扫描

KeyHandle(); //按键处理

LedHandle(); // Led处理程序

}

}

程序很简单,就是简单的测试,能从Speaker听到响声,同时我也把结果发送到了串口显示,下面是实验的结果:


1-8实验执行结果

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top