关于STM32F2系列的PWM问题
/**
******************************************************************************
* @file Buzzer.c
* @author Readers Team
* @version V 1.10.00
* @date 19-July-2012
* @brief
******************************************************************************
* @attention
******************************************************************************
*/
/* Includes ------------------------------*/
#include "stm32f2xx.h"
#include "stm32f2xx_tim.h"
#include "stm32f2xx_gpio.h"
#include "stm32f2xx_rcc.h"
#include "misc.h"
#include "Buzzer.h"
/* Private typedef -----------------------*/
#define PWM_TIM TIM5
uint32_t delayCount=1000;
extern void LCDDelay_ms(uint16_t N);
typedef void (*pCompleteCallbackFunc)(void);
static void BuzzerConf(void);
/* Private define ------------------------*/
/* Private macro -------------------------*/
/* Private variables ---------------------*/
/* Private function prototypes -----------------------------------------------*/
static void BuzeerDelay_us(uint16_t N)
{
uint16_t us;
while( --N )
{
us = 70;
while(us--);
}
}
static void BuzeerDelay_ms(uint16_t N)
{
BuzeerDelay_us(N*1000);
}
/* Private functions ---------------------*/
static void BuzzerConf(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/* GPIO configure */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM5);
/* TIM configure */
TIM_DeInit(PWM_TIM);
TIM_TimeBaseStructure.TIM_Period = 0;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(PWM_TIM, &TIM_TimeBaseStructure);
/* PWM mode 1, default frequency = 200Hz. */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC2Init( PWM_TIM, &TIM_OCInitStructure );
}
static bool Buzzer_SetFrequency(uint32_t dwFrequency)
{
if( (dwFrequency >= 500) && (dwFrequency <= 10000) )
{
TIM_Cmd(PWM_TIM, DISABLE);
/* duty cycle = 1/6. */
TIM_SetAutoreload(PWM_TIM, 60000000 / dwFrequency);
TIM_SetCompare2(PWM_TIM, 10000000 / dwFrequency);
TIM_SetCounter(PWM_TIM, 0);
return TRUE;
}
else
{
return FALSE;
}
}
void InitBuzzer(void)
{
BuzzerConf();
Buzzer_SetFrequency(2690);
}
void Buzzer_Ctrl(uint32_t dwCount,
uint32_t dwOnTime,
uint32_t dwOffTime)
{
while (dwCount--)
{
TIM_Cmd(PWM_TIM, ENABLE);
BuzeerDelay_ms(dwOnTime);
TIM_Cmd(PWM_TIM, DISABLE);
BuzeerDelay_ms(dwOffTime);
}
}
/*******************************************************************************
Function name:TIM5_IRQHandler
Description: TIM5 interrupt processing function.
parameter:
return:
*******************************************************************************/
void TIM5_IRQHandler(void)
{
/* clear interrupt flag */
TIM5->SR = ~TIM_IT_Update;
if( delayCount-- <= 1 )
{
/* stop TIM5, force output high, disable interrupt. */
TIM5->CR1 &= (uint16_t)~TIM_CR1_CEN;
TIM5->CCMR1 &= ~TIM_CCMR1_OC2M;
TIM5->CCMR1 |= TIM_ForcedAction_Active << 8;
TIM5->DIER &= (uint16_t)~TIM_IT_Update;
}
}
下面是主程序:
int main( void )
{
// InitLcd();
InitBuzzer();
// LCDSetCursorPos(&pCursor);
// LCD_Full();
// LCDSetDisplayMode( LCD_SCROLL_UP );
while(1)
{
// Lcd_Clear( LCD_CLEAR_LINE );
// LCDDisplayString(buffer);
Buzzer_Ctrl(20,
500,
500);
// LCDDelay_ms(50);
// Buzzer_SetFrequency(2690);
// Lcd_Clear( LCD_CLEAR_ROW );
//
// LCDDelay_ms(200);
}
麻烦各位大虾看看,为什么驱动不了蜂鸣器?
[解决办法]
谢谢大家了,程序没事,是硬件问题