计算出的输出频率应该为84M/84/500=2Khz,实际输出为20hz。
求救,代码如下为寄存器版本
#include "DAC.h"
const uint32_t sinwave[100]={2000,2116,2233,2348,2462,2575,2685,2792,2896,2997,3093,3186,3273,3356,3433,3505,3571,3630,3683,3730,3769,3802,3828,3846,3857,3861,3857,3846,3828,3802,3769,3730,3683,3630,3571,3505,3433,3356,3273,3186,3093,2997,2896,2792,2685,2575,2462,2348,2233,2116,2000,1883,1766,1651,1537,1424,1314,1207,1103,1002,906,813,726,643,566,494,428,369,316,269,230,197,171,153,142,139,142,153,171,197,230,269,316,369,428,494,566,643,726,813,906,1002,1103,1207,1314,1424,1537,1651,1766,1883
};
const uint32_t dertawave[100]={148,223,297,372,446,521,595,669,744,818,893,967,1042,1116,1191,1265,1339,1414,1488,1563,1637,1712,1786,1861,1935,2009,2084,2158,2233,2307,2382,2456,2530,2605,2679,2754,2828,2903,2977,3052,3126,3200,3275,3349,3424,3498,3573,3647,3722,3796, 3870,3796,3722,3647,3573,3498,3424,3349,3275,3200,3126,3052,2977,2903,2828,2754,2679,2605,2530,2456,2382,2307,2233,2158,2084,2009,1935,1861,1786,1712,1637,1563,1488,1414,1339,1265,1191,1116,1042,967,893,818,744,669,595,521,446,372,297,223
};
uint32_t finalwave[100];
int Idx;
void DAC_init(){
RCC->APB1ENR|=1<<29;
DAC->CR|=1<<1; //输出缓存不使能
DAC->CR|=1<<2; //DAC1通道触发 TEN位 置1才能配置下面的东西
DAC->CR&=~(7<<3);
DAC->CR|=4<<3; //定时器TIM2触发DAC1
DAC->CR|=0<<6; //不使用波形发生
DAC->CR|=0<<8; //屏蔽幅值设置
DAC->CR|=1<<12; //DAC1通道DMA使能
DAC->CR|=1<<0; //使能DAC1
//看数据手册可知在双通道模式下DAC2的DMA不需要开启也可以由DAC1的DMA顺带工作
DAC->CR|=1<<(1+16); //输出缓存不使能
DAC->CR|=1<<18; //DAC2通道触发 TEN位 置1才能配置下面的东西
DAC->CR&=~(7<<19);
DAC->CR|=4<<19; //定时器TIM2触发DAC2
DAC->CR|=0<<(6+16); //不使用波形发生
DAC->CR|=0<<(8+16); //屏蔽幅值设置
DAC->DHR12RD=0;
DAC->CR|=1<<16; //使能DAC2
///////////////////////////////////////
}
void DAC_TIM2_Init(u16 arr,u16 psc){
RCC->APB1ENR|=1<<0; //TIM2时钟使能
TIM2->ARR=arr; //重装载值
TIM2->PSC=psc; //输入时钟分频值
TIM2->CR2&=~(7<<4);
TIM2->CR2|=2<<4; //更新事件触发输出TRGO到DAC
TIM2->DIER|=1<<8; //允许更新DMA请求
TIM2->CR1|=1<<0; //TIM2使能
}
void DAC_GPIO_Init(){
RCC->AHB1ENR|=1<<0; //端口A时钟使能
GPIO_Set(
GPIOA, //GPIO端口
PIN4, //GPIO引脚
GPIO_MODE_AIN, //GPIO模拟输入
GPIO_OTYPE_PP, //GPIO推挽输出
GPIO_SPEED_100M, //端口速度100M
GPIO_PUPD_PU); //上拉
GPIO_Set(
GPIOA, //GPIO端口
PIN5, //GPIO引脚
GPIO_MODE_AIN, //GPIO模拟输入
GPIO_OTYPE_PP, //GPIO推挽输出
GPIO_SPEED_100M, //端口速度100M
GPIO_PUPD_PU); //上拉
}
void DAC_DMA_Init(){
RCC->AHB1ENR|=1<<21;
while (DMA1_Stream5->CR&0x01);
DMA1->HIFCR=0;
DMA1->LIFCR=0;
DMA1_Stream5->NDTR=100; //传输数据量大小
DMA1_Stream5->M0AR=(u32)finalwave; //数据存储器地址
DMA1_Stream5->PAR=(u32)&(DAC->DHR12RD); //外设地址:DAC存储器地址
DMA1_Stream5->CR=0;
DMA1_Stream5->CR&=~(3<<13);
DMA1_Stream5->CR&=~(3<<11);
DMA1_Stream5->CR&=~(1<<9);
DMA1_Stream5->CR&=~(3<<16);
DMA1_Stream5->CR&=~(3<<6);
DMA1_Stream5->CR|=1<<6; //数据传输方向:存储器到外设
DMA1_Stream5->CR|=1<<8; //设置循环模式
DMA1_Stream5->CR|=0<<9; //外设地址指针不递增
DMA1_Stream5->CR|=1<<10; //存储器地址指针递增
DMA1_Stream5->CR|=2<<11; //外设数据大小32位(字)
DMA1_Stream5->CR|=2<<13; //存储器数据大小32位(字)
DMA1_Stream5->CR|=3<<16; //优先级设置高
DMA1_Stream5->CR|=7<<25; //选择通道7
DMA1_Stream5->CR|=1<<0; //DMA使能
for (Idx = 0; Idx < 100; Idx++)
{
finalwave[Idx] =(dertawave[Idx] << 16) + (sinwave[Idx]);//
}
}
void DAC_SINWAVE_Init(){
DAC_GPIO_Init();
DAC_DMA_Init();
DAC_TIM2_Init(500-1,84-1);
DAC_init();
}
|