尼玛,找了半天居然没几篇文章好使,最重要是要有计算方法,看我的:
void init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC->APB1ENR |= RCC_APB1Periph_TIM4; // 使用TIM4_CH3->PB8 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); } /* hz=2000,period=500;hz=1000,period=1000 */ void beep(int hz) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_Cmd(TIM4, DISABLE); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 71; // clock=1mhz TIM_TimeBaseStructure.TIM_Period = 1000000/hz; // update = 1Mhz / hz = period TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); /* Channel1 configuration: PWM2 Mode */ TIM_OCStructInit(&TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_Pulse = (TIM_TimeBaseStructure.TIM_Period+1)*50/100; /* duty = pulse/(period+1), pulse=50%*(TIM_TimeBaseStructure.TIM_Period+1) */ TIM_OC3Init(TIM4, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM4, ENABLE); TIM_Cmd(TIM4, ENABLE); } void beep_onoff(int is_on) { if(is_on) TIM_Cmd(TIM4, ENABLE); else TIM_Cmd(TIM4, DISABLE); } 调用: /* beep */ beep(2000); OSTimeDly(30); beep_onoff(0); OSTimeDly(40); beep(1600); OSTimeDly(50); beep(1800); OSTimeDly(10); beep(2000); OSTimeDly(30); beep_onoff(0);