#include"stm32f10x_lib.h"
#include"stm32f10x_flash.h"
#include"stm32f10x_usart.h"
#define DAC1_D0R1_Address ((u32)0x40012400+0x2c)
#define DAC2_DOR2_Address ((u32)0x40012400+0x30)
u32 DAC1_ConvertedValue[32];
u32 DAC2_ConvertedValue[32];
*
*/
/*********************************************************************
*函數名:void TIM6_Configuration(void)
*描述 :計時器配置
*輸入 :無
*輸出 :無
*調用 :內部調用
**********************************************************************/
void TIM6_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_DeInit(TIM6);
//根据音频采样率为44.1khz所以定时器设为2.26us触发DMA
//下一個更新事件裝入活動的自動重裝寄存器週期的值
TIM_TimeBaseStructure.TIM_Period = 1633;
//預分頻值 ,部位零時輸出始終需除以 TIM_Prescaler
TIM_TimeBaseStructure.TIM_Prescaler = 0;
//时钟分频
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//向上计数方式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//根據TimeBaseStructure中指定的参数初始化TIMx 的时间基数单位
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
//清除待處理標誌位
TIM_ITConfig(TIM6,TIM_IT_Update, ENABLE);
TIM_Cmd(TIM6, ENABLE);
}
/*
*/
/*********************************************************************
*函數名:GPIO_DAC_Init(void)
*描述 :DAC引腳配置
*輸入 :無
*輸出 :無
*調用 :內部調用
**********************************************************************/
void GPIO_DAC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//端口配置
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;
//模擬輸出
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
//50Hz
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
//初始化端口
GPIO_Init(GPIOA,&GPIO_InitStructure);
//將DAC端口初始化后設置為高電平
GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5);
}
/*
*/
/*********************************************************************
*函數名:DAC_All——Init
*描述 :DA轉換相關端口時鐘配置
*輸入 :無
*輸出 :無
*調用 :內部調用
**********************************************************************/
void DAC_All_Init(void)
{
//定義一個結構體
DAC_InitTypeDef DAC_InitType;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
//选择定时器6作外部触发源
DAC_InitType.DAC_Trigger = DAC_Trigger_T6_TRGO;
//無波形產生
DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;
//DAC輸出緩衝使能
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;
DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable;
// 初始化DAC1、DAC2
DAC_Init(DAC_Channel_1|DAC_Channel_2,&DAC_InitType);
//設置數據右對齊,轉換值設置為0
DAC_SetChannel1Data(DAC_Align_12b_R,0);
//設置數據右對齊,轉換值設置為0
DAC_SetChannel2Data(DAC_Align_12b_R,0);
DAC_Cmd(DAC_Channel_1|DAC_Channel_2,ENABLE);
//DAC的DMA傳輸
DAC_DMACmd(DAC_Channel_1,ENABLE);
DAC_DMACmd(DAC_Channel_2,ENABLE);
}
/*
*/
/*********************************************************************
*函數名:DMA_DAC_Init(void)
*描述 :配置DAC的DMA傳輸方式
*輸入 :無
*輸出 :無
*調用 :內部調用
**********************************************************************/
void DMA_DAC_Init(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
/* DMA通道配置*/
DMA_DeInit(DMA2_Channel3);
//DMA外設基DAC1地址
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC1_D0R1_Address;
//DMA内存基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&DAC1_ConvertedValue;
//外設作為數據傳輸的目的地
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
//定義DMA緩存的大小
DMA_InitStructure.DMA_BufferSize =32*16;
//外设寄存器地址固定
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
//内存地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
//設定外設的數據寬度為半字(16位)
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
//設定外設的數據寬度
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
//循环传输
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
//設置通道11的優先級為高
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
//申明非內存到內存傳輸
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel3, &DMA_InitStructure);
DMA_Cmd(DMA2_Channel3, ENABLE);
DAC_DMACmd(DAC_Channel_1, ENABLE);
/**************/
/* DMA通道配置*/
DMA_DeInit(DMA2_Channel4);
//DMA外設基DAC2地址
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC2_DOR2_Address;
//DMA内存基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&DAC2_ConvertedValue;
//外設作為數據傳輸的目的地
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
//定義DMA緩存的大小
DMA_InitStructure.DMA_BufferSize =32*16;
//外设寄存器地址固定
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
//内存地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
//設定外設的數據寬度為半字(16位)
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
//設定外設的數據寬度
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
//循环传输
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
//設置通道11的優先級為高
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
//申明非內存到內存傳輸
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel4, &DMA_InitStructure);
//使能DMA
/* Enable DMA channel1 */
DMA_Cmd(DMA2_Channel4, ENABLE);
DAC_DMACmd(DAC_Channel_2, ENABLE);
}
/*
*/
/*********************************************************************
*函數名:void DAC_DMA_TIM_Config(void)
*描述 :配置DAC的工作方式
*輸入 :無
*輸出 :無
*調用 :外部調用
**********************************************************************/
void DAC_DMA_TIM_Config(void)
{
RCC_Configuration();
TIM6_Configuration();
GPIO_DAC_Init();
DMA_DAC_Init();
DAC_All_Init();
}
主程序主要操作是在DAC2_ConvertedValue[32]数组中加入数据
,然后调用 DAC_DMA_TIM_Config()函数初始化DAC
只有开机时输出一个周期的波形,后续均没有波形,求大神指点啊 |