STM32F103輸出正弦波源程序,大家可以參考下
單片機源程序如下:
- #include "sys.h"
- #include "usart.h"
- #include "delay.h"
- #include "key.h"
- #include "led.h"
- #include "STM32_WaveOutput.h"
- int main(void)
- {
- Stm32_Clock_Init(9); //系統時鐘設置
- uart_init(72,9600); //串口初始化為9600
- delay_init(72); //延時初始化
- LED_Init();
- KEY_Init(); //初始化與按鍵連接的硬件接口
- SineWave_Init( SawToothWave ,10 ,ENABLE ,SinWave ,10 ,ENABLE);//PA4輸出為 10Hz的三角波;PA5輸出為10Hz的正弦波
- printf("The Program is running!!!\n");
- while(1)
- {/********KEY3為增加頻率,KEY1為減少頻率;(變化量為100)***測試不好用*****/
- // static u16 f=1000;
- // if( KEY_Scan(0)==4)
- // {
- // f +=100;
- // if(f>15000) f=15000;
- // Set_WaveFre( Wave_Channel_1 ,f);
- // }
- // else if( KEY_Scan(0)==2)
- // {
- // f -=100;
- // if(f<=20) f=5;
- // Set_WaveFre( Wave_Channel_1 ,f);
- // }
- LED0=!LED0;
- delay_ms(500);
- }
- }
復制代碼- #include "STM32_WaveOutput.h"
- #include "delay.h"
- /********生成正弦波形輸出表***********/
- void SineWave_Data( u16 cycle ,u16 *D)
- {
- u16 i;
- for( i=0;i<cycle;i++)
- {
- D[i]=(u16)((Um*sin(( 1.0*i/(cycle-1))*2*PI)+Um)*4095/3.3);
- }
- }
- /********生成鋸齒波形輸出表***********/
- void SawTooth_Data( u16 cycle ,u16 *D)
- {
- u16 i;
- for( i=0;i<cycle;i++)
- {
- D[i]= (u16)(1.0*i/255*4095);
- }
- }
- /******************正弦波形表***********************/
- #ifdef Sine_WaveOutput_Enable
- u16 SineWave_Value[256]; //已用函數代替
- #endif
- /******************鋸齒波形表***********************/
- #ifdef SawTooth_WaveOutput_Enable
- u16 SawToothWave_Value[256]; //已用函數代替
- #endif
-
- /******DAC寄存器地址聲明*******/
- #define DAC_DHR12R1 (u32)&(DAC->DHR12R1) //DAC通道1輸出寄存器地址
- #define DAC_DHR12R2 (u32)&(DAC->DHR12R2) //DAC通道2輸出寄存器地址
- /****************引腳初始化******************/
- void SineWave_GPIO_Config(u8 NewState1 ,u8 NewState2)
- {
- RCC->APB2ENR|=1<<2; //使能PORTA時鐘
- if( NewState1!=DISABLE)
- {
- GPIOA->CRL&=0xFFF0FFFF;
- GPIOA->CRL&=0x00030000;
- GPIOA->ODR|=(1<<4);
- }
- if( NewState2!=DISABLE)
- {
- GPIOA->CRL&=0xFF0FFFFF;
- GPIOA->CRL&=0x00300000;
- GPIOA->ODR|=(1<<5);
- }
- }
- /******************DAC初始化*************************/
- void SineWave_DAC_Config(u8 NewState1 ,u8 NewState2)
- {
- RCC->APB2ENR|=1<<2; //使能PORTA時鐘
- RCC->APB1ENR|=1<<29; //使能DAC時鐘
-
- GPIOA->CRL&=0XFFF0FFFF;
- GPIOA->CRL|=0X00000000;//PA4 模擬輸入
- if( NewState1!=DISABLE)
- {
- DAC->CR|=1<<0; //使能DAC通道1
- DAC->CR|=1<<1; //DAC1輸出緩存不使能 BOFF1=1
- DAC->CR|=1<<2; //使用觸發功能 TEN1=1
-
- DAC->CR|=0<<3; //3、4、5=100時為TIM2 TRGO事件觸發
- DAC->CR|=0<<4; //
- DAC->CR|=1<<5; //
-
- DAC->CR|=0<<6; //不使用波形發生
- DAC->CR|=0<<8; //屏蔽、幅值設置
- DAC->CR|=1<<12; //DAC1 DMA使能
- }
-
- if( NewState2!=DISABLE)
- {
- DAC->CR|=1<<16; //使能DAC通道2
- DAC->CR|=1<<17; //DAC2輸出緩存不使能 BOFF1=1
- DAC->CR|=1<<18; //使用觸發功能 TEN2=1
-
- DAC->CR|=0<<19; //3、4、5=100時為TIM2 TRGO事件觸發
- DAC->CR|=0<<20; //
- DAC->CR|=0<<21; //
-
- DAC->CR|=0<<22; //不使用波形發生
- DAC->CR|=0<<24; //屏蔽、幅值設置
- DAC->CR|=1<<28; //DAC1 DMA使能
-
-
- DAC->DHR12R1=0;//使能通道1
- DAC->DHR12R2=0;//使能通道2
- }
- }
- /*********定時器配置************/
- void SineWave_TIM_Config( u32 Wave1_Fre ,u8 NewState1 ,u32 Wave2_Fre ,u8 NewState2)
- {
-
- if( NewState1!=DISABLE)RCC->APB1ENR|=1<<0; //TIM2時鐘使能
- if( NewState2!=DISABLE)RCC->APB1ENR|=1<<4; //TIM6時鐘使能
-
- TIM2->PSC=0x0; //預分頻器不分頻
- TIM2->CR1|=0<<4;//向上計數模式
- TIM6->PSC=0x0;
- TIM6->CR1|=0<<4;//向上計數模式
- if( NewState1!=DISABLE)
- {
- TIM2->ARR=Wave1_Fre;
- TIM6->CR1|=0x01; //使能定時器6
- TIM2->CR2 &= (u16)~((u16)0x0070);//設置TIM2輸出觸發為更新模式
- TIM2->CR2 |=0x0020;//設置TIM2輸出觸發為更新模式
-
- }
- if( NewState2!=DISABLE)
- {
- TIM6->ARR = Wave2_Fre; //設置輸出頻率
- TIM2->CR1|=0x01; //使能定時器2
- TIM6->CR2 &= (u16)~((u16)0x0070);//設置TIM2輸出觸發為更新模式
- TIM6->CR2 |=0x0020;//設置TIM2輸出觸發為更新模式
- }
- }
- /*********DMA配置***********/
- void SineWave_DMA_Config( u16 *Wave1_Mem ,u8 NewState1 ,u16 *Wave2_Mem ,u8 NewState2)
- {
- RCC->AHBENR|=1<<1; //開啟DMA2時鐘
- delay_ms(5); //等待DMA時鐘穩定
-
- if( NewState1!=DISABLE)
- {
- DMA2_Channel3->CPAR=DAC_DHR12R1; //DMA1 外設地址
- DMA2_Channel3->CMAR=(u32)Wave1_Mem; //DMA1,存儲器地址
- 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傳輸
- }
- if( NewState2!=DISABLE)
- {
- DMA2_Channel4->CPAR=DAC_DHR12R2; //DMA1 外設地址
- DMA2_Channel4->CMAR=(u32)Wave2_Mem; //DMA1,存儲器地址
- DMA2_Channel4->CNDTR=256; //DMA2,傳輸數據量
- DMA2_Channel4->CCR=0X00000000; //復位
- DMA2_Channel4->CCR|=1<<4; //從存儲器讀
- DMA2_Channel4->CCR|=0<<6; //外設地址非增量模式
- DMA2_Channel4->CCR|=1<<7; //存儲器增量模式
- DMA2_Channel4->CCR|=1<<8; //外設數據寬度為16位
- DMA2_Channel4->CCR|=1<<10; //存儲器數據寬度16位
- DMA2_Channel4->CCR|=1<<12; //最高優先級
- DMA2_Channel4->CCR|=1<<13; //最高優先級
- DMA2_Channel4->CCR|=0<<14; //非存儲器到存儲器模式
- DMA2_Channel4->CCR|=1<<5; //循環發送模式
- DMA2_Channel4->CCR|=1<<0; //開啟DMA傳輸
- }
- }
- void MyTIM_SetAutoreload(TIM_TypeDef* TIMx, u16 Autoreload)
- {
- /* Check the parameters */
- assert_param(IS_TIM_ALL_PERIPH(TIMx));
- /* Set the Autoreload Register value */
- TIMx->ARR = Autoreload;
- }
- /***********正弦波初始化***************/
- //u8 Wave1 波形1
- //u16 Wave1_Fre 波形1頻率(Hz)
- //u8 NewState1 波形1狀態(忽略)
- //u8 Wave2 波形2
- //u16 Wave2_Fre 波形2頻率(Hz)
- //u8 NewState2 波形2狀態(忽略)
- //調用exp: SineWave_Init( SawToothWave ,10 ,ENABLE ,SinWave ,10 ,ENABLE);//三角波,10Hz,正弦波,10Hz
- void SineWave_Init(u8 Wave1,u16 Wave1_Fre,u8 NewState1,u8 Wave2,u16 Wave2_Fre,u8 NewState2)
- {
- u16 *add1,*add2;
- u16 f1=(u16)(72000000/sizeof(SineWave_Value)*2/Wave1_Fre);
- u16 f2=(u16)(72000000/sizeof(SineWave_Value)*2/Wave2_Fre);
- SineWave_Data( N ,SineWave_Value); //生成波形表1
- SawTooth_Data( N ,SawToothWave_Value);//生成波形表2
- if( NewState1!=DISABLE)
- {
- if( Wave1==0x00) add1=SineWave_Value;
- else add1=SawToothWave_Value;
- }
- if( NewState2!=DISABLE)
- {
- if( Wave2==0x00) add2=SineWave_Value;
- else add2=SawToothWave_Value;
- }
- SineWave_GPIO_Config( ENABLE ,ENABLE); //初始化引腳
- SineWave_TIM_Config( f1 , NewState1 ,f2 ,NewState2); //初始化定時器
- SineWave_DAC_Config(NewState1 ,NewState2); //初始化DAC
- SineWave_DMA_Config( add1 ,NewState1 ,add2 ,NewState2); //初始化DMA
- if( NewState1!=DISABLE) TIM2->CR1|=0x01; //使能定時器2; //使能TIM2,開始產生波形
- if( NewState2!=DISABLE) TIM6->CR1|=0x01; //使能定時器2; //使能TIM6,開始產生波形
- }
- void Set_WaveFre( u8 Wave_Channel ,u16 fre)
- {
- TIM_TypeDef* TIMX;
- u16 reload;
-
- if( Wave_Channel==0x00) TIMX = TIM2;
- else if(Wave_Channel==0x01) TIMX = TIM6;
-
- reload=(u16)(72000000/512/fre);
- MyTIM_SetAutoreload( TIMX ,reload);
- }
復制代碼
所有資料51hei提供下載:
stm32F103正弦波.rar
(349.17 KB, 下載次數: 172)
2018-11-14 17:46 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|