STM 32 DMAを使用して正弦波、三角波、方波を発生


一:stm 32を使用して波形を生成するには、もちろんDACを使用する必要があります.これは欠かせません.stm 32には三角波ジェネレータがありますが、ここでは主にdmaを使用しています.このように、どんな波形を生成しても、対応する関数のリストを構築すればいいです.
二:関数リストの実装
主にサンプリング法で、1つの波形図の上で複数の点を選択して、それから相応の数値を保存して、呼び出し(DMA循環呼び出し)を待って、それからDACを通じて数値を変換して、最後に波形を近似して得て、この方法は実は数学の中の描点法です;正弦波:
u16 D_sin[256];
void SineWave_Data()
{
     
	u16 i;
	for( i=0;i<=255;i++)
	{
     
		D_sin[i]=(u16)(4095*(sin(i*2*3.1415926/255)+1)/2);
	}
}

方波:
u16 D_fang[N];
void Fang_Data()
{
     
	u16 i;
	for(i=0;i<N/2;i++)
	{
     
		D_fang[i]= (u16)(0);
	}
	for( i=N/2;i<N;i++)
	{
     
		D_fang[i]=(u16)(4095);
	}
}

三角波:
u16 D_saw[N];
void Saw_Data()
{
     
	u16 i;
	for( i=0;i<N/2;i++)
	{
     
		D_saw[i]= (u16)(4095*2*i/N);
	}
	for( i=N/2;i<N;i++)
	{
     
		D_saw[i]= (u16)(2*4095*(N-i)/N);
	}
}

生成された数を対応する配列に格納すればよいので、DMA呼び出しを待つ.
三:キー制御周波数増減://キー初期化
void KEY_init()
{
     
	RCC->APB2ENR|=1<<2;     //  PORTA  
	RCC->APB2ENR|=1<<4;     //  PORTC  
	//JTAG_Set(SWD_ENABLE);	//  JTAG,  SWD
	GPIOA->CRL&=0XFFFFFFF0;	//PA0     	  
	GPIOA->CRL|=0X00000008;   
	GPIOA->CRH&=0X0FFFFFFF;	//PA15     	  
	GPIOA->CRH|=0X80000000; 			 
	GPIOA->ODR|=1<<15;	   	//PA15  ,PA0    
	GPIOC->CRL&=0XFF0FFFFF;	//PC5     	  
	GPIOC->CRL|=0X00800000;   
	GPIOC->ODR|=1<<5;	   	//PC5   
}

//主関数キー制御部
//          
if(KEY_0 == 0 && mode==0 )
	{
     
		delay_ms(10);
		fang_Hz +=1;
		saw_Hz +=1;
		mode=1;
	}
else if(KEY_1==0 && mode==0)
	{
     
		delay_ms(10);
		fang_Hz -=1;
		saw_Hz -=1;
		mode=1;
	}
if(KEY_0 == 1 && KEY_1==1)
		mode=0;
Init_config(fang_Hz,saw_Hz);//       

四:DAC,DMA,TIME初期化;//ここでは正弦波のみを挙げる
//DAC   
void Dac1_Init()//       
{
     
	RCC->APB1ENR|=1<<29; //   DAC    
	RCC->APB2ENR|=1<<2; //   PORTA    
	GPIOA->CRL&=0XFFF0FFFF; 
	GPIOA->CRL|=0X00000000; //PA4     
	DAC->CR|=1<<0; //   DAC1
	DAC->CR|=1<<2; //       TEN1=1
	DAC->CR|=0<<1; //DAC1         BOFF1=1
	DAC->CR|=4<<3; //DAC TIM2 TRGO,    TEN1=1   
	DAC->CR|=0<<6; //       
	DAC->CR|=0<<8;//    
	DAC->CR|=1<<12;//DAC1 DMA   
	DAC->DHR12R1=0;
}
//DMA   
void DMA2_init1()
{
     
	    RCC->AHBENR|=1<<1; //   DMA2   
			delay_ms(5); //   DMA     
			DMA2_Channel3->CPAR=(u32)&(DAC->DHR12R1); 	 	//DMA2      
			DMA2_Channel3->CMAR=(u32)D_sin; 	//DMA2,     
			DMA2_Channel3->CNDTR=256;    	//DMA2,     
			DMA2_Channel3->CCR=0X00000000;	//  
			DMA2_Channel3->CCR|=1<<4;  		//     
			DMA2_Channel3->CCR|=0<<6; 		//         
			DMA2_Channel3->CCR|=1<<7; 	 	//       
			DMA2_Channel3->CCR|=1<<8; 	 	//       16 
			DMA2_Channel3->CCR|=1<<10; 		//       16 
			DMA2_Channel3->CCR|=1<<12; 		//     
			DMA2_Channel3->CCR|=1<<13; 		//     
			DMA2_Channel3->CCR|=0<<14; 		//          	
			DMA2_Channel3->CCR|=1<<5;  		//      
			DMA2_Channel3->CCR|=1<<0;     //  DMA  
}
//      
void TIM2_Int_Init(u16 arr)//   TIM2--  
{
     
	RCC->APB1ENR|=1<<0; //TIM2      
	TIM2->CR1|=0<<4;//      
	TIM2->ARR=arr; //          
	TIM2->PSC=0; //     7200,   10Khz         =72000/(899+1)=80Khz
	TIM2->CR2|=2<<4; //            (TRGO)
	TIM2->CR1|=0x01; //     2
}

五:以上をまとめると正弦波が生成されますが、まだ少し足りないものが彼らを組織して、みんなで自分で追加すればいいです.私の才学が浅くて、構想をよく整理することができなくて、コードを提供してみんなの参考にするしかありません;もしソースが必要なものがあれば、私のqqを加えればいいです.