#include "lcd.h"
#include "System.h"
#include "DMA_DAC.h"
//²¨ÐÎÏÔʾ
void Wave_Diaplay(void)
{
u16 i;
switch(Wave_Flag)
{
case 0: for(i=0;i<317;i++) LCD_DrawPoint(3+i,138-Wave_Sin[2*i%256]/32); break;
case 1: for(i=0;i<317;i++) { LCD_DrawPoint(3+i,138-Wave_Sawtooth[2*i%256]/32); if(i%128==0) LCD_DrawLine(i+2,139,i+2,11); } break;
case 2: for(i=0;i<317;i++) LCD_DrawPoint(3+i,138-Wave_Triangle[2*i%256]/32); break;
case 3: for(i=0;i<317;i++) { LCD_DrawPoint(3+i,138-Wave_Square[2*i%256]/32); if(i%64==0) LCD_DrawLine(i+2,138,i+2,11); } break;
}
}
//°´¼ü´¦Àí
void Key_Deal(void)
{
u16 i=0;
if(Key1==0)//°´¼ü1°´ÏÂ
{
delay_ms(20);
if(Key1==0)
{
Wave_Flag++;
if(Wave_Flag==4)
Wave_Flag=0;
switch(Wave_Flag)
{
case 0: for(i=0;i<256;i++) My_Wave[i]=Wave_Sin[i]; LCD_ShowString(70,190,300,24,24," Wave_Sin "); break;
case 1: for(i=0;i<256;i++) My_Wave[i]=Wave_Sawtooth[i]; LCD_ShowString(70,190,300,24,24," Wave_Sawtooth "); break;
case 2: for(i=0;i<256;i++) My_Wave[i]=Wave_Triangle[i]; LCD_ShowString(70,190,300,24,24," Wave_Triangle "); break;
case 3: for(i=0;i<256;i++) My_Wave[i]=Wave_Square[i]; LCD_ShowString(70,190,300,24,24," Wave_Square "); break;
}
Wave_Diaplay();
}
while(!Key1);
}
}
int main(void)
{
System_Init();
TIM2_Int_Init(Wave_Rate);
DAC_DMA_Config();
Beep_Dealy_ms(100);
LCD_ShowString(40,160,300,24,24," STM32 ");
LCD_ShowString(70,190,300,24,24," Wave_Sin ");
Data_Diaplay();
Wave_Diaplay();
while(1)
{
Key_Deal();
}
}
#include "DMA_DAC.h"
#define HZ(x) (u16)(72000000/sizeof(My_Wave)*2/x) //¼ÆËãHz
#define DAC_DHR12R1 0x40007408 //ÍâÉèDACͨµÀ1µÄ»ùµØÖ·
u16 My_Wave[256] ={0};
u8 Wave_Flag=0; //0ÕýÏÒ²¨ 1¾â³Ý²¨ 2Èý½Ç²¨ 3·½²¨
u16 Wave_Sin[256] = {
2048, 2098, 2148, 2198, 2248, 2298, 2348, 2398, 2447, 2496,
2545, 2594, 2642, 2690, 2737, 2785, 2831, 2877, 2923, 2968,
3013, 3057, 3100, 3143, 3185, 3227, 3267, 3307, 3347, 3385,
3423, 3460, 3496, 3531, 3565, 3598, 3631, 3662, 3692, 3722,
3750, 3778, 3804, 3829, 3854, 3877, 3899, 3920, 3940, 3958,
3976, 3992, 4007, 4021, 4034, 4046, 4056, 4065, 4073, 4080,
4086, 4090, 4093, 4094, 4095, 4094, 4093, 4090, 4086, 4080,
4073, 4065, 4056, 4046, 4034, 4021, 4007, 3992, 3976, 3958,
3940, 3920, 3899, 3877, 3854, 3829, 3804, 3778, 3750, 3722,
3692, 3662, 3631, 3598, 3565, 3531, 3496, 3460, 3423, 3385,
3347, 3307, 3267, 3227, 3185, 3143, 3100, 3057, 3013, 2968,
2923, 2877, 2831, 2785, 2737, 2690, 2642, 2594, 2545, 2496,
2447, 2398, 2348, 2298, 2248, 2198, 2148, 2098, 2047, 1997,
1947, 1897, 1847, 1797, 1747, 1697, 1648, 1599, 1550, 1501,
1453, 1405, 1358, 1310, 1264, 1218, 1172, 1127, 1082, 1038,
995, 952, 910, 868, 828, 788, 748, 710, 672, 635,
599, 564, 530, 497, 464, 433, 403, 373, 345, 317,
291, 266, 241, 218, 196, 175, 155, 137, 119, 103,
88, 74, 61, 49, 39, 30, 22, 15, 9, 5,
2, 1, 0, 1, 2, 5, 9, 15, 22, 30,
39, 49, 61, 74, 88, 103, 119, 137, 155, 175,
196, 218, 241, 266, 291, 317, 345, 373, 403, 433,
464, 497, 530, 564, 599, 635, 672, 710, 748, 788,
828, 868, 910, 952, 995, 1038, 1082, 1127, 1172, 1218,
1264, 1310, 1358, 1405, 1453, 1501, 1550, 1599, 1648, 1697,
1747, 1797, 1847, 1897, 1947, 1997 };
u16 Wave_Sawtooth[256] = {
0,16,32,48,64,80,96,112,128,144,160,176,192,208,224,240,256,272,288,304,
320,336,352,368,384,400,416,432,448,464,480,496,512,528,544,560,576,592,608,624,
640,656,672,688,704,720,736,752,768,784,800,816,832,848,864,880,896,912,928,944,
960,976,992,1008,1024,1040,1056,1072,1088,1104,1120,1136,1152,1168,1184,1200,1216,1232,1248,1264,
1280,1296,1312,1328,1344,1360,1376,1392,1408,1424,1440,1456,1472,1488,1504,1520,1536,1552,1568,1584,
1600,1616,1632,1648,1664,1680,1696,1712,1728,1744,1760,1776,1792,1808,1824,1840,1856,1872,1888,1904,
1920,1936,1952,1968,1984,2000,2016,2032,2048,2064,2080,2096,2112,2128,2144,2160,2176,2192,2208,2224,
2240,2256,2272,2288,2304,2320,2336,2352,2368,2384,2400,2416,2432,2448,2464,2480,2496,2512,2528,2544,
2560,2576,2592,2608,2624,2640,2656,2672,2688,2704,2720,2736,2752,2768,2784,2800,2816,2832,2848,2864,
2880,2896,2912,2928,2944,2960,2976,2992,3008,3024,3040,3056,3072,3088,3104,3120,3136,3152,3168,3184,
3200,3216,3232,3248,3264,3280,3296,3312,3328,3344,3360,3376,3392,3408,3424,3440,3456,3472,3488,3504,
3520,3536,3552,3568,3584,3600,3616,3632,3648,3664,3680,3696,3712,3728,3744,3760,3776,3792,3808,3824,
3840,3856,3872,3888,3904,3920,3936,3952,3968,3984,4000,4016,4032,4048,4064,4080};
u16 Wave_Triangle[256] = {
4095,4063,4031,3999,3967,3935,3903,3871,3839,3807,3775,3743,3711,3679,3647,3615,3583,3551,3519,3487,
3455,3423,3391,3359,3327,3295,3263,3231,3199,3167,3135,3103,3071,3039,3007,2975,2943,2911,2879,2847,
2815,2783,2751,2719,2687,2655,2623,2591,2559,2527,2495,2463,2431,2399,2367,2335,2303,2271,2239,2207,
2175,2143,2111,2079,2047,2015,1983,1951,1919,1887,1855,1823,1791,1759,1727,1695,1663,1631,1599,1567,
1535,1503,1471,1439,1407,1375,1343,1311,1279,1247,1215,1183,1151,1119,1087,1055,1023,991,959,927,
895,863,831,799,767,735,703,671,639,607,575,543,511,479,447,415,383,351,319,287,
255,223,191,159,127,95,63,31,0,31,63,95,127,159,191,223,255,287,319,351,
383,415,447,479,511,543,575,607,639,671,703,735,767,799,831,863,895,927,959,991,
1023,1055,1087,1119,1151,1183,1215,1247,1279,1311,1343,1375,1407,1439,1471,1503,1535,1567,1599,1631,
1663,1695,1727,1759,1791,1823,1855,1887,1919,1951,1983,2015,2047,2079,2111,2143,2175,2207,2239,2271,
2303,2335,2367,2399,2431,2463,2495,2527,2559,2591,2623,2655,2687,2719,2751,2783,2815,2847,2879,2911,
2943,2975,3007,3039,3071,3103,3135,3167,3199,3231,3263,3295,3327,3359,3391,3423,3455,3487,3519,3551,
3583,3615,3647,3679,3711,3743,3775,3807,3839,3871,3903,3935,3967,3999,4031,4063};
u16 Wave_Square[256] = {
4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,
4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,
4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,
4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,
4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,
4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,
4095,4095,4095,4095,4095,4095,4095,4095,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
/*************************************************************
Function : set_Wave
Description : ÉèÖÃÕýÐþ²¨Âë±í
Input : MAX(Õý·å·åÖµ) MIN(¸º·å·åÖµ)
return : none
//Wave_Flag//0ÕýÏÒ²¨Wave_Sin 1¾â³Ý²¨Wave_Sawtooth 2Èý½Ç²¨Wave_Triangle 3·½²¨Wave_Square
*************************************************************/
void Set_Wave(float MAX,float MIN)
{
int i;
float jiaodu=0;
float MID=(MAX+MIN)/2.0; //Öмä·åÖµ
for(i=0;i<256;i++)
{
switch(Wave_Flag)
{
case 0: jiaodu=i*0.0247369;
My_Wave[i]=((float)sin(jiaodu)*(MAX-MID)+MID)*1241.212; break;
case 1: My_Wave[i]=((float)Wave_Sawtooth[i]/4096*(MAX-MIN)+MIN)*1241.212; break;
case 2: My_Wave[i]=((float)Wave_Triangle[i]/4096*(MAX-MIN)+MIN)*1241.212; break;
case 3: My_Wave[i]=((float)Wave_Square[i]/4096*(MAX-MIN)+MIN)*1241.212; break;
}
}
}
/*************************************************************
Function : Set_Period
Description : ÉèÖÃÆµÂÊhz
Input : value(ÐèÒªÉèÖÃµÄÆµÂÊhzÖµ)
return : none
*************************************************************/
void Set_Period(u32 value)
{
TIM_ARRPreloadConfig(TIM2,DISABLE);
TIM2->ARR=HZ(value); //¸üÐÂÔ¤×°ÔØÖµ
TIM_ARRPreloadConfig(TIM2,ENABLE);
}
/*************************************************************
Function : TIM2_Int_Init
Description: ³õʼ»¯¶¨Ê±Æ÷2
Input : Hz (ÐèÒª³õʼ»¯µÄƵÂÊhzÖµ)
return : none
*************************************************************/
void TIM2_Int_Init(u32 Hz)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//³õʼ»¯¶¨Ê±Æ÷2Óë6µÄʱÖÓ
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = HZ(Hz); //ÕýÏÒ²¨ÆµÂÊÉèÖÃ
TIM_TimeBaseStructure.TIM_Prescaler = 0x0; //ûÓÐÔ¤·ÖƵ
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //ʱÖÓ²»·ÖƵ 72M
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //Ôö¼ÆÊý
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);//¸üÐÂTIM2Êä³ö´¥·¢
}
/*************************************************************
Function : DAC_DMA_Config
Description: ³õʼ»¯DACºÍDMA
Input : none
return : none
*************************************************************/
void DAC_DMA_Config(void)
{
u16 i=0;
DAC_InitTypeDef DAC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
for(i=0;i<256;i++)
My_Wave[i]=Wave_Sin[i];
RCC_APB1PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//³õʼ»¯DACµÄʱÖÓ
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);//³õʼ»¯DMA2µÄʱÖÓ
/*³õʼ»¯GPIO*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ;//DAC channel1ºÍchannel2¶ÔÓ¦µÄÒý½Å
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*³õʼ»¯DAC¼Ä´æÆ÷*/
DAC_StructInit(&DAC_InitStructure);
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;//Ö¸¶¨DAC1µÄ´¥·¢¶¨Ê±Æ÷TIM2
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;//ÎÞ²¨ÐβúÉú
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; //²»ÊÇÄÜDACÊä³ö»º³å
DAC_Init(DAC_Channel_1, &DAC_InitStructure);//³õʼ»¯DAC channel1
DAC_Cmd(DAC_Channel_1, ENABLE); //ʹÄÜDAC channel1
DAC_DMACmd(DAC_Channel_1, ENABLE); //ʹÄÜDAC Channel1µÄDMA
/*³õʼ»¯DMA¼Ä´æÆ÷*/
DMA_DeInit(DMA2_Channel3); //½«DMAÅäÖóÉĬÈÏÖµ
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1;//Ö¸¶¨DMA2ͨµÀ3µÄÄ¿±êµØÖ·ÎªDAC1_DHR12R1
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&My_Wave;//Ö¸¶¨DMAµÄÔ´µØÖ·ÎªÊý×éSine12bit
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//ÍâÉè×÷ΪÊý¾Ý´«ÊäµÄÄ¿µÄµØ
DMA_InitStructure.DMA_BufferSize = sizeof(My_Wave)/2;//DMA»º³åÇø´óС
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;//¹¤×÷ÔÚÑ»·»º´æÄ£Ê½£¬Êý¾Ý´«ÊäÊýΪ0ʱ£¬×Ô¶¯»Ö¸´ÅäÖóõÖµ
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;//·Ç³£¸ßÓÅÏȼ¶
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//ͨµÀδ±»ÉèÖóÉÄÚ´æµ½ÄÚ´æÄ£Ê½£¬ÓëÑ»·Ä£Ê½Ïà¶Ô
DMA_Init(DMA2_Channel3, &DMA_InitStructure);//³õʼ»¯DMA
DMA_Cmd(DMA2_Channel3, ENABLE); //ʹÄÜDMAµÄchannel3
TIM_Cmd(TIM2, ENABLE); //×îºó¿ªÆôTIM2ת»»
}