|
#include "dac.h"
#define DAC_DHR12RD_Addr 0x40007420/*(u32)&(DAC->DHR12RD)*/
__IO u32 DAC_DoubleChannel_Value[DAC_Len];
void DACx_Init(uint16_t ARR,uint16_t PSC)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
DMA_InitTypeDef DMA_InitStructure;
/*-----------------------------------------------------------*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
/*-----------------------------------------------------------*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
//为了避免寄生干扰和额外的功耗,采用模拟输入的方式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*-----------------------------------------------------------*/
TIM_TimeBaseStructure.TIM_Period = ARR;
//arr:自动重装值。
TIM_TimeBaseStructure.TIM_Prescaler = PSC;
//psc:时钟预分频数
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//选择默认不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
//初始化TIM4
TIM_SelectOutputTrigger(TIM4,TIM_TRGOSource_Update);
//选择为TIM4事件更新
TIM_Cmd(TIM4,ENABLE);
//使能定时器4
/*-----------------------------------------------------------*/
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Addr;
// DAC数据寄存器地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DAC_DoubleChannel_Value;
// 内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
//从内存发送数据到外设
DMA_InitStructure.DMA_BufferSize = DAC_Len;
// 一个周期内的点数,即DMA传输数量
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
//外设地址不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
//内存地址自增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Word;
// 传输宽度32 bit 一个字
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
//DMA 传输模式-循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
//DMA 优先级-高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
//关闭内存到内存模式
DMA_Init(DMA2_Channel4, &DMA_InitStructure);
//DMA初始化函数
DMA_Cmd(DMA2_Channel4,ENABLE);
/*-----------------------------------------------------------*/
DAC_InitStructure.DAC_Trigger=DAC_Trigger_T4_TRGO;
// DAC触发方式tim4
DAC_InitStructure.DAC_WaveGeneration=DAC_WaveGeneration_None;
// 不采用波形发生模式
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
//输出缓冲不使能,若使能则小于0.5V的波形无法输出
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;
//选择不产生噪声
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
// DAC通道1初始化
DAC_Init(DAC_Channel_2, &DAC_InitStructure);
// DAC通道2初始化
DAC_Cmd(DAC_Channel_1,ENABLE);
//使能DAC通道1
DAC_Cmd(DAC_Channel_2,ENABLE);
//使能DAC通道2
// DAC_DMACmd(DAC_Channel_1,ENABLE);
// //打开DAC通道1的DMA使能
DAC_DMACmd(DAC_Channel_2,ENABLE);
//打开DAC通道2的DMA使能
/*-----------------------------------------------------------*/
}
#ifndef _dac_h_
#define _dac_h_
/************************************/
#include "stm32f10x.h"
#include "system.h"
#include "systick.h"
#include "usart.h"
/************************************/
extern __IO u32 DAC_DoubleChannel_Value[];
#define DAC_Len 10
#define WAVE_SINE 0
#define WAVE_RAMP 1
#define WAVE_SQUARE 2
#define WAVE_TRIANGLE 3
/************************************/
void DACx_Init(uint16_t ARR,uint16_t PSC);
void DAC_OutputU16Signal(u16 temp[],u8 Wave_Mode,u16 len,u16 vpp);
void DAC_OutputU32Signal(void);
/************************************/
#endif
#include "stm32f10x.h"
#include "systick.h"
#include "system.h"
#include "usart.h"
#include "led.h"
#include "dac.h"
u16 vpp_max=3300;
/************************************/
/************************************/
int main(void)
{
SysTick_Init(72);
//延时初始化
USARTx_Init(115200);
//串口初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//中断优先级分组
LED_Init();
DACx_Init(36-1,1-1);
DAC_OutputU32Signal();
LED1=1;
LED2=1;
while(1)
{
}
}
程序如上,理论上来说,我将u32的数据通过DMA传输到DHR12RD这个寄存器,即可以在三个周期内将u32数据存入DOR1和DOR2,从而产生双通道的波形。
但是我通过调试发现:
为什么DAC的寄存器会是这个样子呢?只有一个工作,而且用示波器测两个通道都没有波形
求大佬能解决,类目
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|