新手入门
- 积分
- 17
- 金钱
- 17
- 注册时间
- 2016-11-26
- 在线时间
- 1 小时
|
1金钱
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "key.h"
#include "led.h"
#include "dac.h"
#include "lcd.h"
#include "dma.h"
#include "timer.h"
#include "math.h"
#define PI 3.14159
u16 Sine12bit[256];
void sin_Generation(void)
{
u16 n;
for(n=0;n<256;n++)
{
Sine12bit[n] = (sin(2*PI*n/256)+1)*2047;
}
}
int main(void)
{
u8 i=0;
u16 dacval=0;
u8 key;
u8 flag;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÏμí3ÖD¶ÏóÅÏè¼¶·Ö×é2
delay_init(168); //3õê¼»ˉÑóê±oˉêy
uart_init(115200); //3õê¼»ˉ′®¿ú2¨ìØÂêÎa115200
LED_Init(); //3õê¼»ˉLED
LCD_Init(); //LCD3õê¼»ˉ
KEY_Init(); //°′¼ü3õê¼»ˉ
Dac1_Init(); //DACí¨μà13õê¼»ˉ
TIM2_Int_Init(5000-1,8400-1); //¶¨ê±Æ÷ê±Öó84M£¬·ÖÆμÏμêy8400£¬ËùòÔ84M/8400=10KhzμļÆêyÆμÂ꣬¼Æêy5000′ÎÎa500m
sin_Generation();
//MYDMA_Config(DMA1_Stream5,DMA_Channel_7,(u32)&DAC->DHR12R1,(u32)Sine12bit,256);//DMA1,STEAM7,CH5,íaéèÎaDAC1,′æ′¢Æ÷ÎaSendBuff,3¤¶èÎa:SEND_BUF_SIZE.
//MYDMA_Enable(DMA1_Stream5,256);
DAC_SetChannel1Data(DAC_Align_12b_R,dacval);//3õê¼ÖμÎa0
while(1)
{
/*dacval=3000;
key=KEY_Scan(0);
if(key==WKUP_PRES)
{
flag='1';
}
if(key==KEY1_PRES)
{
flag='2';
}
if(flag=='1')
{
for(i=0;i<100;i++)
{
DAC_SetChannel1Data(DAC_Align_12b_R, Sine12bit[i]);
}
}
if(flag=='2')
{
DAC_SetChannel1Data(DAC_Align_12b_R, dacval);
delay_ms(500);
DAC_SetChannel1Data(DAC_Align_12b_R,0);
delay_ms(500);
}*/
MYDMA_Config(DMA1_Stream5,DMA_Channel_7,(u32)&DAC->DHR12R1,(u32)Sine12bit,256);//DMA1,STEAM7,CH5,íaéèÎaDAC1,′æ′¢Æ÷ÎaSendBuff,3¤¶èÎa:SEND_BUF_SIZE.
MYDMA_Enable(DMA1_Stream5,256);
}
}
#include "dma.h"
#include "delay.h"
//DMAxμĸ÷í¨μàÅäÖÃ
//ÕaàïμÄ′«êäDÎê½êÇ1춨μÄ,Õaμãòa¸ù¾Y2»í¬μÄÇé¿öà′DT¸Ä
//′ó′æ′¢Æ÷->íaéèÄ£ê½/8λêy¾Y¿í¶è/′æ′¢Æ÷Ôöá¿Ä£ê½
//DMA_Streamx MAêy¾Yá÷,DMA1_Stream0~7/DMA2_Stream0~7
//chx MAí¨μàÑ¡Ôñ,@ref DMA_channel DMA_Channel_0~DMA_Channel_7
//par:íaéèμØÖ·
//mar:′æ′¢Æ÷μØÖ·
//ndtr:êy¾Y′«êäá¿
void MYDMA_Config(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
{
DMA_InitTypeDef DMA_InitStructure;
if((u32)DMA_Streamx>(u32)DMA2)//μÃμ½μ±Ç°streamêÇêôóúDMA2»1êÇDMA1
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2ê±Öóê1Äü
}else
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1ê±Öóê1Äü
}
DMA_DeInit(DMA_Streamx);
while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//μè′yDMA¿éÅäÖÃ
/* ÅäÖÃ DMA Stream */
DMA_InitStructure.DMA_Channel = chx; //í¨μàÑ¡Ôñ
DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMAíaéèμØÖ·
DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA ′æ′¢Æ÷0μØÖ·
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//′æ′¢Æ÷μ½íaéèÄ£ê½
DMA_InitStructure.DMA_BufferSize = ndtr;//êy¾Y′«êäá¿
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//íaéè·ÇÔöá¿Ä£ê½
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//′æ′¢Æ÷Ôöá¿Ä£ê½
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//íaéèêy¾Y3¤¶è:16λ
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//′æ′¢Æ÷êy¾Y3¤¶è:16λ
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;// ê1óÃÑ-»·Ä£ê½
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//ÖDμèóÅÏè¼¶
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//′æ′¢Æ÷í»·¢μ¥′Î′«êä
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//íaéèí»·¢μ¥′Î′«êä
DMA_Init(DMA_Streamx, &DMA_InitStructure);//3õê¼»ˉDMA Stream
}
//¿aÆôò»′ÎDMA′«êä
//DMA_Streamx MAêy¾Yá÷,DMA1_Stream0~7/DMA2_Stream0~7
//ndtr:êy¾Y′«êäá¿
void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
{
DMA_Cmd(DMA_Streamx, DISABLE); //1رÕDMA′«êä
while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){} //è·±£DMA¿éòÔ±»éèÖÃ
DMA_SetCurrDataCounter(DMA_Streamx,ndtr); //êy¾Y′«êäá¿
DMA_Cmd(DMA_Streamx, ENABLE); //¿aÆôDMA′«êä
}
#include "dac.h"
//DACí¨μà1êä3ö3õê¼»ˉ
void Dac1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitType;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ê1ÄüGPIOAê±Öó
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);//ê1ÄüDACê±Öó
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//Ä£Äaêäèë
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//ÏÂà-
GPIO_Init(GPIOA, &GPIO_InitStructure);//3õê¼»ˉ
DAC_InitType.DAC_Trigger=DAC_Trigger_T2_TRGO ; //¶¨ê±Æ÷2′¥·¢
DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_None;//2»ê1óÃ2¨Dη¢éú
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;//Æá±Î¡¢·ùÖμéèÖÃ
DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ; //DAC1êä3ö»o′æ1Ø±Õ BOFF1=1
DAC_Init(DAC_Channel_1,&DAC_InitType); //3õê¼»ˉDACí¨μà1
DAC_Cmd(DAC_Channel_1, ENABLE); //ê1ÄüDACí¨μà1
DAC_DMACmd(DAC_Channel_1, ENABLE);
DAC_SetChannel1Data(DAC_Align_12b_R, 0); //12λóò¶ÔÆëêy¾Y¸ñê½éèÖÃDACÖμ
}
//éèÖÃí¨μà1êä3öμçÑ1
//vol:0~3300,′ú±í0~3.3V
void Dac1_Set_Vol(u16 vol)
{
double temp=vol;
temp/=1000;
temp=temp*4096/3.3;
DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12λóò¶ÔÆëêy¾Y¸ñê½éèÖÃDACÖμ
}
#include "timer.h"
#include "led.h"
//í¨óö¨ê±Æ÷2ÖD¶Ï3õê¼»ˉ
//arr£o×Ô¶ˉ֨װÖμ¡£
//psc£oê±ÖóÔ¤·ÖÆμêy
//¶¨ê±Æ÷òç3öê±¼ä¼ÆËã·½·¨:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=¶¨ê±Æ÷1¤×÷ÆμÂê,μ¥λ:Mhz
//Õaàïê1óÃμÄêǶ¨ê±Æ÷2!
void TIM2_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); ///ê1ÄüTIM2ê±Öó
TIM_TimeBaseInitStructure.TIM_Period = arr; //×Ô¶ˉÖØ×°ÔØÖμ
TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //¶¨ê±Æ÷·ÖÆμ
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //ÏòéϼÆêyÄ£ê½
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//3õê¼»ˉTIM2
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //ÔêDí¶¨ê±Æ÷2¸üDÂÖD¶Ï
TIM_Cmd(TIM2,ENABLE); //ê1Äü¶¨ê±Æ÷2
TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);
NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; //¶¨ê±Æ÷2ÖD¶Ï
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //ÇàÕ¼óÅÏè¼¶1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //×óóÅÏè¼¶3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//¶¨ê±Æ÷3ÖD¶Ï·tÎñoˉêy
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) //òç3öÖD¶Ï
{
LED1=!LED1;//DS1·-×a
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //Çå3yÖD¶Ï±ê־λ
}
求助 谢谢啦 哪里有问题呢
|
|