首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

关于STM32F2系列的PWM有关问题

2012-12-27 
关于STM32F2系列的PWM问题/**************************************************************************

关于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);


   } 

麻烦各位大虾看看,为什么驱动不了蜂鸣器?
[解决办法]
谢谢大家了,程序没事,是硬件问题

热点排行