![]() |
發布時間: 2020-3-27 17:03
正文摘要:先上一下STM32的流程圖,幾個名詞了解一下,CNT:計時器,系統時鐘分頻而來72M,ARR寄存器:A(重裝載寄存器),CCR(比較/捕獲計時器)N,圖上標錯了,設置TIMx相關參數(主要就是N的值,為了保證50%占空比,所以A ... |
這部分是我改寫的,原作者寫的很亂 //蜂鳴器發出指定頻率的聲音 //usFreq是發聲頻率,取值 (人耳可聽20Hz-20KHz) void buzzerSound(unsigned short usFreq) { GPIO_InitTypeDef GPIO_InitStructure; unsigned long ulVal; if((usFreq<=20)||(usFreq>20000))//次音和超聲過濾 { buzzerQuiet();// 蜂鳴器靜音 } else { GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5 //設置該引腳為復用輸出功能,輸出TIM3 CH2的PWM脈沖波形 GPIOB.5 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO ulVal=7200000/usFreq;//聲音頻率 //主頻是72M不分頻,原作者是8M TIM3->ARR =2*ulVal ; //設置自動重裝載寄存器 A 的值 ,原作者是 ulVal //ulVal TIM_SetCompare2(TIM3,ulVal);//TIM3比較/捕獲寄存器 N 重設置為 //原作者是ulVal /2,保證50%占空比 ->A=2N TIM_Cmd(TIM3, ENABLE); //啟動TIM3 //IO輸出 為 周期 T = (N+1)*系統時鐘分頻 {即倒數為輸入聲波的方波} 的方波。N=ulVal /2 } } |
// 低音頻率 #define L1 262 #define L2 294 #define L3 330 #define L4 349 #define L5 392 #define L6 440 #define L7 494 // 中音頻率 #define M1 523 #define M2 587 #define M3 659 #define M4 698 #define M5 784 #define M6 880 #define M7 988 // 高音頻率 #define H1 1047 #define H2 1175 #define H3 1319 #define H4 1397 #define H5 1568 #define H6 1760 #define H7 1976 |
主函數主要是初始化延時函數和初始化TIM3 int main(void) { delay_init();// TIM3_PWM_Init(14399,0); //TIM3預分頻系數為0,72M/0+1=72M,不分頻 while(1) { musicPlay(); // LED=!LED; delay_ms(50); } } |