打印

简单的PWM波形输出配置

[复制链接]
1670|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
绿眼孤狼|  楼主 | 2011-1-29 22:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "stm32f10x_lib.h"
#include "stm32f10x_conf.h"
/*********************************/
u16                CCR1_Val = 250;
u16                CCR2_Val = 500;

/*********************************/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void TIM_Configuration(void);

/*******************/
int main(void)
{
        RCC_Configuration();
        GPIO_Configuration();
        NVIC_Configuration();
        TIM_Configuration();
        
        while(1);
}

/*****************/
void RCC_Configuration(void)
{
        ErrorStatus                HSEStartUpStatus;
        
        RCC_DeInit();
        RCC_HSEConfig(RCC_HSE_ON);
        HSEStartUpStatus = RCC_WaitForHSEStartUp();
        if(HSEStartUpStatus == SUCCESS)
        {
                 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
                FLASH_SetLatency(FLASH_Latency_2);
                RCC_HCLKConfig(RCC_SYSCLK_Div1);
                RCC_PCLK2Config(RCC_HCLK_Div1);
                RCC_PCLK1Config(RCC_HCLK_Div4);
                RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
                RCC_PLLCmd(ENABLE);
                while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
                while(RCC_GetSYSCLKSource() != 0x08);
        }
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
}

/***************/
void GPIO_Configuration(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;

        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/***********************/
void NVIC_Configuration(void)
{
        #ifdef VECT_TAB_RAM
                NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
        #else
                NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0X0);
        #endif
}

/*****************************/
void TIM_Configuration(void)
{
        TIM_TimeBaseInitTypeDef                TIM_TimeBaseStructure;
        TIM_OCInitTypeDef                        TIM_OCInitStructure;

        /*******************************************************
        
                TIM3的内部时钟频率为36MHz,每个PWM通道的频率经
        (TIM_Period + 1)后为36KHz.
                输出的占空比为:
                        duty cycle = TIM_Pulse/(TIM_Period + 1) * 100%
                        
        *******************************************************/
        TIM_TimeBaseStructure.TIM_Period                = 999;
        TIM_TimeBaseStructure.TIM_Prescaler                = 0;
        TIM_TimeBaseStructure.TIM_ClockDivision        = 0;
        TIM_TimeBaseStructure.TIM_CounterMode        = TIM_CounterMode_Up;

        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

        //------------- 占空比为 50% 输出波形 ----------------
        TIM_OCInitStructure.TIM_OCMode                = TIM_OCMode_PWM1;
        TIM_OCInitStructure.TIM_OutputState        = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse                = CCR1_Val;
        TIM_OCInitStructure.TIM_OCPolarity        = TIM_OCPolarity_High;

        TIM_OC1Init(TIM3, &TIM_OCInitStructure);
        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
        //------------- 占空比为 25% 输出波形 ---------------
        TIM_OCInitStructure.TIM_Pulse                = CCR2_Val;
        TIM_OC2Init(TIM3, &TIM_OCInitStructure);
        TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
        //------------------

        TIM_ARRPreloadConfig(TIM3, ENABLE);
        TIM_Cmd(TIM3, ENABLE);
}

/*********************/
#ifdef                DEBUG
void assert_failed(u8 *file, u32 line)
{
        while(1);
}
#endif
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

19

帖子

1

粉丝