stm32 PWM

主函数:
u16 time;
int main(void)
{    
    RCC_Configuration();   
    GPIO_Configuration();    
    NVIC_Configuration(); 
    TIM_Configuration();
    time=0;
    while(1)
    {
    }
}



#include "time.h"
/*=============================================================================================
时钟设置:72M
    使能TIM3和GPIOA
==============================================================================================*/
void RCC_Configuration()
{
    SystemInit();//系统时钟设置位72MHz
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOA,GPIOB
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定时器3 
}



/*=============================================================================================
GPIO端口设置:
    PORTA.7端口设置为复用推挽输出
==============================================================================================*/
void GPIO_Configuration()
{
    GPIO_InitTypeDef GPIO_InitStructure;                           //定义一个结构体
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;                        //设定管脚
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;                //50MHz翻转速度
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;                  //设置模式,复用推挽输出,这个很重要
    GPIO_Init(GPIOA,&GPIO_InitStructure);                          //初始化这些设置
}



/*=============================================================================================
 NVIC设置:
    中断优先级为最高
    定时器3
==============================================================================================*/
void NVIC_Configuration()
{
    NVIC_InitTypeDef NVIC_InitStructure;                           //定义结构体
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                //采用分组2方式
    NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;                  //定时器3
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;        //0抢断优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;               //0从优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;                  //使能该通道
    NVIC_Init(&NVIC_InitStructure);                                //初始化设置
}



/*=============================================================================================
TIM模块设置
    
==============================================================================================*/
void TIM_Configuration()
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;                  //定义两个结构体,一个基本机构,一个比较输出结构
    TIM_OCInitTypeDef TIM_OCInitStructure;
    
    TIM_TimeBaseStructure.TIM_Period=0xffff;                        //必须是0xffff
    TIM_TimeBaseStructure.TIM_Prescaler=72-1;                       //时钟为72/72=1MHz
    TIM_TimeBaseStructure.TIM_ClockDivision=0;                      //0个采样分频
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;       //向上计数模式
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);                  //初始化设置

    TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;               //管脚输出模式:翻转模式
    TIM_OCInitStructure.TIM_Pulse=2000;                             //翻转周期2000个脉冲
    TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;     //使能这个通道
    TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;         //输出为正逻辑
    TIM_OC2Init(TIM3,&TIM_OCInitStructure);                         //写入配置
    //TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);              //使能预装载寄存器
    //TIM_ARRPreloadConfig(TIM3,ENABLE);
    TIM_ClearFlag(TIM3, TIM_FLAG_Update);                           //清除中断
    
      	//TIM_PrescalerConfig(TIM3, 0xEA5F, TIM_PSCReloadMode_Immediate);   //设置预分频数
        	
    TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);                      //TIM中断源设置,开启相应通道的捕获比较中断
    TIM_Cmd(TIM3,ENABLE);                                           //开启TIM3
    TIM_CtrlPWMOutputs(TIM3,ENABLE);                                //通道输出使能
}


在这里要注意的是,你要看到你使能的中断源是什么,因为这个倒最后你要查询的东西!


void TIM3_IRQHandler(void)
{
   
     
//    if(TIM_GetITStatus(TIM3, TIM_IT_CC2)==SET)//这个的中断源是TIM_IT_CC2这个通道
//    {
//         time++;
//         TIM_ClearITPendingBit(TIM3, TIM_IT_CC2 );
//        capture = TIM_GetCapture2(TIM3);
//        TIM_SetCompare2(TIM3, capture + 2000);
//        //这里解释下:
//        //将TIM1_CCR1的值增加2000,使得下一个TIM事件也需要2000个脉冲,
//        //另一种方式是清零脉冲计数器
//        //TIM_SetCounter(TIM2,0x0000);
//    }
    
    time++;
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET) //这个的中断源是TIM_IT_Update
    {
        capture++;
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
        //GPIO_WriteBit(GPIOA,GPIO_Pin_9,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_9)));
    } 
}

你可能感兴趣的:(stm32)