新手入门
- 积分
- 30
- 金钱
- 30
- 注册时间
- 2015-4-8
- 在线时间
- 0 小时
|
5金钱
最近在做STM32产生正弦波要求频率可调100HZ-10KHZ,步长100HZ,开始的想法是用定时器中断时将正弦波码表数值直接给DAC,通过按键改变定时器初值来改变频率,程序完成以后发现精度很差。别人说用DMA进行数据传输会好很多,但我看了很多DMA资料,自己写了程序调试很久还是不行有很多疑惑,求大家帮助。
void DMA_init()
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);//开DMA2的时钟
DMA_StructInit( &DMA_InitStructure);//DMA结构初始化
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//从存储器读数据
DMA_InitStructure.DMA_BufferSize = 128;//缓存大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不递增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//内存地址递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//宽度为半字
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//宽度为半字
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;//优先级:非常高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//关闭内存到内存模式
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//循环发送模式
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1;//外设地址为DAC通道1数据寄存器
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&sin;//内存地址为输出波形数据数组
DMA_Init(DMA2_Channel3, &DMA_InitStructure);//初始化
DMA_Cmd(DMA2_Channel3, ENABLE); //使能DMA通道3
}
当这样将DMA初始化完成后,该怎么控制DMA每隔一段时间发送一个数据给DAC呢 这是最主要的疑惑 |
最佳答案
查看完整内容[请看2#楼]
http://www.openedv.com/forum.php?mod=viewthread&tid=274862&highlight=DAC
|