📄 wavemaker.c
字号:
/****************************************************************************
* Copyright (C), 2010, www.armfly.com
*
* 【本例程在安富莱STM32F103ZE-EK开发板上调试通过 】
* 【QQ: 1295744630, 旺旺:armfly, Email: armfly@qq.com 】
*
* 文件名: WaveMaker.c
* 内容简述: 波形发生器
*
* 文件历史:
* 版本号 日期 作者 说明
* v0.1 2010-02-15 armfly 创建该文件
*
*/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdio.h>
#include "systick.h"
#include "WaveMaker.h"
/*
安富莱STM32F103ZE-EK 口线分配:
波形由PA4输出, PA4 用作 DAC_OUT1, DAC的参考电压 = 3.3V
*/
/* 正弦波数据,12bit,1个周期128个点*/
const uint16_t g_SineWave128[] = {
2047 ,
2147 ,
2248 ,
2347 ,
2446 ,
2544 ,
2641 ,
2737 ,
2830 ,
2922 ,
3012 ,
3099 ,
3184 ,
3266 ,
3346 ,
3422 ,
3494 ,
3564 ,
3629 ,
3691 ,
3749 ,
3803 ,
3852 ,
3897 ,
3938 ,
3974 ,
4006 ,
4033 ,
4055 ,
4072 ,
4084 ,
4092 ,
4094 ,
4092 ,
4084 ,
4072 ,
4055 ,
4033 ,
4006 ,
3974 ,
3938 ,
3897 ,
3852 ,
3803 ,
3749 ,
3691 ,
3629 ,
3564 ,
3494 ,
3422 ,
3346 ,
3266 ,
3184 ,
3099 ,
3012 ,
2922 ,
2830 ,
2737 ,
2641 ,
2544 ,
2446 ,
2347 ,
2248 ,
2147 ,
2047 ,
1947 ,
1846 ,
1747 ,
1648 ,
1550 ,
1453 ,
1357 ,
1264 ,
1172 ,
1082 ,
995 ,
910 ,
828 ,
748 ,
672 ,
600 ,
530 ,
465 ,
403 ,
345 ,
291 ,
242 ,
197 ,
156 ,
120 ,
88 ,
61 ,
39 ,
22 ,
10 ,
2 ,
0 ,
2 ,
10 ,
22 ,
39 ,
61 ,
88 ,
120 ,
156 ,
197 ,
242 ,
291 ,
345 ,
403 ,
465 ,
530 ,
600 ,
672 ,
748 ,
828 ,
910 ,
995 ,
1082 ,
1172 ,
1264 ,
1357 ,
1453 ,
1550 ,
1648 ,
1747 ,
1846 ,
1947
};
/* 正弦波 */
const uint16_t g_SineWave32[32] = {
2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,
599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647};
/* 方波 */
const uint16_t g_SineWave32_FangBo[32] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,
4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095
};
uint16_t g_Wave[128];
/*******************************************************************************
* 函数名: InitWaveMaker
* 输 入: 无
* 输 出: 无
* 功能说明:初始化波形发生器。
* 配置PA4 为DAC_OUT1, 启用DMA2
*/
void InitWaveMaker(void)
{
{
uint32_t i;
for (i = 0; i < 32; i++)
{
/* 调整正弦波幅度 */
g_Wave[i] = g_SineWave32[i] * 0.606;
}
}
/* 配置时钟 */
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
/* GPIOA Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* DAC Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
/* TIM6 Periph clock enable */
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
}
/* 第1步,配置GPIO. */
{
GPIO_InitTypeDef GPIO_InitStructure;
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* 配置PA4为DAC_OUT1 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/* TIM6 Configuration */
#if 1 /* 用TIM6, IAR下不产生波形 */
{
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_PrescalerConfig(TIM6, 0, TIM_PSCReloadMode_Update);
/* 决定DAC输出的采样频率
x = 72000000 / 频率
*/
//TIM_SetAutoreload(TIM6, 562); /* 562 输出1KHz的正弦波 */
//TIM_SetAutoreload(TIM6, 22); /* 22 输出100KHz的正弦波 */
TIM_SetAutoreload(TIM6, 220); /* 22 输出10KHz的正弦波 */
/* TIM6 TRGO selection */
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
}
#else
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/* TIM2 Configuration */
/* Time base configuration */
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 0x19;
TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* TIM2 TRGO selection */
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
}
#endif
/* DAC channel1 Configuration */
{
DAC_InitTypeDef DAC_InitStructure;
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
//DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
}
{
uint32_t i;
for (i = 0; i < 32; i++)
{
/* 调整正弦波幅度 */
g_Wave[i] = g_SineWave32[i] * 0.606;
}
}
/* DMA2 channel3 configuration */
{
DMA_InitTypeDef DMA_InitStructure;
// RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
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 = 32;
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_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel3, &DMA_InitStructure);
/* Enable DMA2 Channel3 */
DMA_Cmd(DMA2_Channel3, ENABLE);
}
/* Enable DAC Channel1: Once the DAC channel1 is enabled, PA.04 is
automatically connected to the DAC converter. */
DAC_Cmd(DAC_Channel_1, ENABLE);
/* Enable DMA for DAC Channel1 */
DAC_DMACmd(DAC_Channel_1, ENABLE);
/* TIM6 enable counter */
TIM_Cmd(TIM6, ENABLE);
//TIM_Cmd(TIM2, ENABLE);
}
void SetupWaveType(uint8_t _type)
{
/*
计算波形幅度。
DAC寄存器最大值 4096 对应3.3V
我们期望获得2V的幅度,系数 = 0.606
4096 * 0.606 = 2482
*/
TIM_Cmd(TIM6, DISABLE);
switch (_type)
{
case WT_SIN: /* 正弦波 */
{
uint32_t i;
for (i = 0; i < 128; i++)
{
/* 调整正弦波幅度 */
g_Wave[i] = g_SineWave32[i] * 0.606;
}
}
break;
case WT_RECT: /* 方波 */
{
uint32_t i;
for (i = 0; i < 64; i++)
{
g_Wave[i] = 0;
}
for (i = 0; i < 64; i++)
{
g_Wave[i] = 2482;
}
}
break;
}
TIM_Cmd(TIM6, ENABLE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -