自己慢慢看,,,,
[mw_shl_code=c,true]#ifndef __BSP_WAVEMAKER_H
#define __BSP_WAVEMAKER_H
#include "stm32f10x.h"
#define DAC_DHR12RD_Address 0x40007420
#define DAC_DHR8R1_Address 0x40007410
#define DAC_DHR12R1_Address 0x40007408
/* DMA 传输数据长度 */
enum
{
DMA_BufferSize_36 = 36,
DMA_BufferSize_50 = 50,
DMA_BufferSize_100 = 100,
};
/* 波形类型 */
enum
{
WT_RECT = 0, /* 矩形波 */
WT_SIN = 1, /* 正弦波 */
WT_TRIA = 2, /* 三角波 */
WT_SAW = 3, /* 锯齿波 */
WT_NOISE = 4, /* 噪声 */
};
/* 正弦波 */
typedef struct
{
uint32_t Frequency; //频率
uint16_t Amplitude; //幅值
}SIN_T;
/* 三角波 */
typedef struct
{
uint16_t Frequency; //频率
uint16_t Amplitude; //幅值
}TRIA_T;
/* 锯齿波 */
typedef struct
{
uint32_t Frequency; //频率
uint16_t Amplitude; //幅值
}SAW_T;
/* 矩形波 */
typedef struct
{
uint32_t Frequency; //频率
uint16_t Amplitude; //幅值
uint8_t DutyCycle; //占空比
}RECT_T;
/* 噪声 */
typedef struct
{
uint16_t Frequency; //频率
uint16_t Amplitude; //幅值
}NOISE_T;
extern SIN_T g_Sine;
extern RECT_T g_Rect;
extern SAW_T g_Saw;
extern NOISE_T g_Noise;
extern TRIA_T g_Tria;
void InitWaveMaker(void);
void SetupWaveType(uint8_t _ucType,uint32_t _ulFrequency,uint16_t _usAmplitude,
uint8_t _ucDutyCycle);
#endif[/mw_shl_code]
[mw_shl_code=c,true]#include "stm32f10x.h"
#include <stdio.h>
#include "stdlib.h"
#include "bsp_WaveMaker.h"
#include "arm_math.h"
SIN_T g_Sine; /*正弦波*/
RECT_T g_Rect; /*矩形波*/
SAW_T g_Saw; /*锯齿波*/
NOISE_T g_Noise; /*噪声 */
TRIA_T g_Tria; /*三角波*/
uint16_t g_Wave[100];
/*******************************************************************************
* 函数名: InitWaveMaker
* 输 入: 无
* 输 出: 无
* 功能说明:初始化波形发生器。
*******************************************************************************/
void InitWaveMaker(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
/*初始化DAC 通道1 */
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
DAC_DMACmd(DAC_Channel_1, ENABLE);
/* 配置PA4为DAC_OUT1 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*
*********************************************************************************************************
* 函 数 名: InitWaveFreq(uint32_t _usFrequency, uint8_t _ucDMABuffuerSize)
* 功能说明: 用于初始化各种波形的产生
* 形 参:_usFrequency 表示要产生波形的触发频率,
* _ucDMABuffuerSize 表示DMA要传输的数据数。
* 返 回 值: 无
*********************************************************************************************************
*/
void InitWaveFreq(uint32_t _usFrequency, uint8_t _ucDMABuffuerSize)
{
DMA_InitTypeDef DMA_InitStructure;
/*初始化定时器*/
TIM_PrescalerConfig(TIM6, 0, TIM_PSCReloadMode_Update);
TIM_SetAutoreload(TIM6, _usFrequency);
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
/*初始化DMA */
DMA_DeInit(DMA2_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1_Address;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&g_Wave;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = _ucDMABuffuerSize;
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_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low ;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel3, &DMA_InitStructure);
DMA_Cmd(DMA2_Channel3, ENABLE);
}
/*
*********************************************************************************************************
* 函 数 名: SetupWaveType
* 功能说明: 用于建立产生各种波形
* 形 参:_ucType 表示要产生的波形的类型
_ulFrequency 表示波形的触发频率
_usAmplitude 表示波形的幅值
_ucDutyCycle 表示矩形波的占空比
* 返 回 值: 无
*********************************************************************************************************
*/
void SetupWaveType(uint8_t _ucType,uint32_t _ulFrequency,uint16_t _usAmplitude,
uint8_t _ucDutyCycle)
{
uint8_t i;
TIM_Cmd(TIM6, DISABLE);
DAC_Cmd(DAC_Channel_1, DISABLE);
switch (_ucType)
{
case WT_RECT: /* 方波 */
InitWaveFreq(720000 / _ulFrequency, DMA_BufferSize_100); /*要先初始化这个*/
for (i = 0; i < _ucDutyCycle; i++)
{
g_Wave = _usAmplitude;
}
for (i = _ucDutyCycle; i < 100; i++)
{
g_Wave = 0;
}
break;
case WT_SIN: /* 正弦波 */
InitWaveFreq(720000 / _ulFrequency,DMA_BufferSize_100);
for (i = 0; i < DMA_BufferSize_100; i++)
{
g_Wave = 1024+_usAmplitude*sin(2*3.1415926f*99*i/100);
}
break;
case WT_SAW: /* 锯齿波 */
InitWaveFreq(720000 / _ulFrequency,DMA_BufferSize_100);
for (i = 0; i < DMA_BufferSize_100; i++)
{
g_Wave = 100 + i*_usAmplitude;
}
break;
case WT_TRIA: /* 三角波*/
InitWaveFreq(720000 / _ulFrequency,DMA_BufferSize_100);
for (i = 0; i < DMA_BufferSize_100; i++)
{
g_Wave = 100 + abs(50-i)*_usAmplitude;
}
break;
case WT_NOISE: /*噪声 */
InitWaveFreq(720000 / _ulFrequency,DMA_BufferSize_100);
for (i = 0; i < DMA_BufferSize_100; i++)
{
g_Wave = rand()%_usAmplitude;
}
break;
default : break;
}
DAC_Cmd(DAC_Channel_1, ENABLE);
TIM_Cmd(TIM6, ENABLE);
}[/mw_shl_code]
[mw_shl_code=c,true]//初始化显示的波形是方波
g_Rect.Frequency = 10000; //频率
g_Rect.Amplitude = 2000; //幅值
g_Rect.DutyCycle = 50; //占空比
InitWaveMaker(); //初始化
SetupWaveType(WT_RECT,g_Rect.Frequency,g_Rect.Amplitude,g_Rect.DutyCycle); //产生波形[/mw_shl_code]
|