小弟弄这个很久了,下面我是参考别人库函数版本写的寄存器版本的代码,我真的不知道哪里错了,求指教!!
#define DAC_DHR12R1 (uint32_t)&(DAC->DHR12R1) //DAC通道1输出寄存器地址
//正弦波单个周期的点数
#define POINT_NUM 32
/* 波形数据 ---------------------------------------------------------*/
const uint16_t Sine12bit[POINT_NUM] = {
2048 , 2460 , 2856 , 3218 , 3532 , 3786 , 3969 , 4072 ,
4093 , 4031 , 3887 , 3668 , 3382 , 3042 , 2661 , 2255 ,
1841 , 1435 , 1054 , 714 , 428 , 209 , 65 , 3 ,
24 , 127 , 310 , 564 , 878 , 1240 , 1636 , 2048
};
uint32_t DualSine12bit[POINT_NUM];
/*
备注:DAC的配置个人感觉是完全没有问题的
*/
static void DAC_Config(void)
{
RCC->APB2ENR |= (0x1 << 2); //开启GPIOA时钟
RCC->APB1ENR |= (0x1 << 29); //开启DAC时钟
GPIOA->CRL &= ~(0x3 << 18); //模拟模式 PA4
//GPIOA->CRL &= ~(0x3 << 22); //模拟模式 PA5
DAC->CR |= (0x1 << 0); //使能DAC通道1
DAC->CR |= (0x1 << 1); //关闭DAC通道1输出缓存
DAC->CR |= (0x1 << 2); //使能DAC通道1触发
DAC->CR &= ~(0x7 << 3); //TIM6 TRGO事件
DAC->CR &= ~(0x3 << 6); //关闭波形
DAC->CR |= (0x1 << 12); //使能DAC通道1DMA模式
// DAC->CR |= (0x1 << 16); //使能DAC通道2
// DAC->CR |= (0x1 << 17); //关闭DAC通道2输出缓存
// DAC->CR |= (0x1 << 18); //使能DAC通道2触发
// DAC->CR &= ~(0x7 << 19); //TIM6 TRGO事件
// DAC->CR &= ~(0x3 << 22); //关闭波形
// DAC->CR |= (0x1 << 28); //使能DAC通道2DMA模式
}
/*
备注:APB1的定时器为72M
*/
static void DAC_TIM_Config(void)
{
RCC->APB1ENR |= (0x1 << 4); //TIM6
TIM6->CR2 |= (0x2 << 4);
TIM6->DIER &= ~(0x1 << 0); //禁止更新中断
TIM6->PSC = 7200-1;
TIM6->ARR = 10000-1;
TIM6->CR1 |= (0x1 << 0); //使能计数器
}
static void DAC_DMA_Config(void)
{
RCC->AHBENR |= (0x1 << 1); //使能DMA2
delay_ms(5); //等待DMA时钟稳定
DMA2_Channel3->CPAR = DAC_DHR12R1;
DMA2_Channel3->CMAR = (uint32_t)&DualSine12bit;
DMA2_Channel3->CNDTR = 32;
DMA2_Channel3->CCR = 0;
DMA2_Channel3->CCR |=1<<4; //从存储器读
DMA2_Channel3->CCR |=0<<6; //外设地址非增量模式
DMA2_Channel3->CCR |=1<<7; //存储器增量模式
DMA2_Channel3->CCR |=1<<8; //外设数据宽度为16位
DMA2_Channel3->CCR |=1<<10; //存储器数据宽度16位
DMA2_Channel3->CCR |=1<<12; //最高优先级
DMA2_Channel3->CCR |=1<<13; //最高优先级
DMA2_Channel3->CCR &= ~(0x1 << 14); //非存储器到存储器模式
DMA2_Channel3->CCR |=1<<5; //循环发送模式
DMA2_Channel3->CCR |=1<<0; //开启DMA传输
}
void DAC_Mode_Init(void)
{
uint32_t Idx = 0;
DAC_Config();
DAC_TIM_Config();
/* 填充正弦波形数据,双通道右对齐*/
for (Idx = 0; Idx < POINT_NUM; Idx++)
{
DualSine12bit[Idx] = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]);
}
DAC_DMA_Config();
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>