xxk-43976 发表于 2017-9-6 14:50:04

stm32f301使用tim15产生PWM输出无反应,求解

源代码如下:
/**
* @briefÅäÖÃTIM15¸´ÓÃÊä³öPWMʱÓõ½µÄI/O
* @paramÎÞ
* @retval ÎÞ
*/
static void TIM15_GPIO_Config(void)
{
                /*¶¨ÒåÒ»¸öGPIO_InitTypeDefÀàÐ͵ĽṹÌå*/
                GPIO_InitTypeDef GPIO_InitStructure;

                /*¿ªÆôµç»úÏà¹ØµÄGPIOÍâÉèʱÖÓ*/
                RCC_AHBPeriphClockCmd(MOTOR_TIM_GPIOA_CLK, ENABLE);

                GPIO_PinAFConfig(MOTOR_P_GPIO_PORT,MOTOR_P_PINSOURCE,MOTOR_P_AF);
                GPIO_PinAFConfig(MOTOR_N_GPIO_PORT,MOTOR_N_PINSOURCE,MOTOR_N_AF);
       
                /*µç»úÕý¼«*/                                                                                                                          
                GPIO_InitStructure.GPIO_Pin = MOTOR_P_PIN;       
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(MOTOR_P_GPIO_PORT, &GPIO_InitStructure);
               
               
    /*µç»ú¸º¼«*/                                                                                                                          
                GPIO_InitStructure.GPIO_Pin = MOTOR_N_PIN;       
    GPIO_Init(MOTOR_N_GPIO_PORT, &GPIO_InitStructure);       
//                GPIO_InitStructure.GPIO_Pin = MOTOR_N_PIN;       
//                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   
//    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//                GPIO_Init(MOTOR_N_GPIO_PORT, &GPIO_InitStructure);
                GPIO_SetBits(MOTOR_P_GPIO_PORT,MOTOR_P_PIN);       
                GPIO_ResetBits(MOTOR_N_GPIO_PORT,MOTOR_N_PIN);               


                   
}



/**
* @briefÅäÖÃMOTOR_TIMxÊä³öµÄPWMÐźŵÄģʽ£¬ÈçÖÜÆÚ¡¢¼«ÐÔ
* @paramÎÞ
* @retval ÎÞ
*/
static void TIM15_Mode_Config(void)
{
        TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
        TIM_OCInitTypeDefTIM_OCInitStructure;


        // ¿ªÆôTIMx_CLK,x
MOTOR_TIM_APBxClock_FUN(MOTOR_TIM_CLK, ENABLE);
       
/* ÀÛ¼Æ TIM_Period¸öºó²úÉúÒ»¸ö¸üлòÕßÖжÏ*/               
TIM_TimeBaseStructure.TIM_Period = 256-1;       //µ±¶¨Ê±Æ÷´Ó0¼ÆÊýµ½255£¬¼´Îª256´Î£¬ÎªÒ»¸ö¶¨Ê±ÖÜÆÚ
       
        //¶¨Ê±Æ÷ʱÖÓÔ´TIMxCLK = 2 * PCLK1
//                                PCLK1 = HCLK / 4
//                                => TIMxCLK = HCLK / 2 = SystemCoreClock /2
        // ¶¨Ê±Æ÷ƵÂÊΪ = TIMxCLK/(TIM_Prescaler+1) = (SystemCoreClock /2)/((SystemCoreClock/2)/1000000)*30 = 1000000/30 = 1/30MHz

        /*»ù±¾¶¨Ê±Æ÷ÅäÖÃTIM_Prescaler¸ù¾ÝЧ¹ûÀ´ÉèÖü´¿É£¬ÖжÏÖÜÆÚС µÆÉÁ˸¿ì£¬´óÔòÉÁ˸»ºÂý*/
        TIM_TimeBaseStructure.TIM_Prescaler = 1000;//((SystemCoreClock/2)/1000000)*30-1;          
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2 ;               //ÉèÖÃʱÖÓ·ÖÆµÏµÊý£º²»·ÖƵ(ÕâÀïÓò»µ½)
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//ÏòÉϼÆÊýģʽ
       
        // ³õʼ»¯¶¨Ê±Æ÷TIMx, x
        TIM_TimeBaseInit(MOTOR_TIM, &TIM_TimeBaseStructure);       
       
       
        /*PWMģʽÅäÖÃ*/
        /* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                          //ÅäÖÃΪPWMģʽ1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        //ʹÄÜÊä³ö
TIM_OCInitStructure.TIM_Pulse = 100;                                                                                                                          //ÉèÖóõʼPWMÂö³å¿í¶ÈΪ0       
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;          //µ±¶¨Ê±Æ÷¼ÆÊýֵСÓÚCCR_ValʱΪµÍµçƽ
//ʹÄÜͨµÀ
MOTOR_P_TIM_OCxInit(MOTOR_TIM, &TIM_OCInitStructure);                                                              
        /*ʹÄÜͨµÀÖØÔØ*/
        MOTOR_P_TIM_OCxPreloadConfig(MOTOR_TIM, TIM_OCPreload_Enable);
       
       
        /* PWM1 Mode configuration: Channel2 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                          //ÅäÖÃΪPWMģʽ1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        //ʹÄÜÊä³ö
TIM_OCInitStructure.TIM_Pulse = 100;                                                                                                                          //ÉèÖóõʼPWMÂö³å¿í¶ÈΪ0       
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;          //µ±¶¨Ê±Æ÷¼ÆÊýֵСÓÚCCR_ValʱΪµÍµçƽ
//ʹÄÜͨµÀ
MOTOR_N_TIM_OCxInit(MOTOR_TIM, &TIM_OCInitStructure);                                                              
        /*ʹÄÜͨµÀÖØÔØ*/
        MOTOR_N_TIM_OCxPreloadConfig(MOTOR_TIM, TIM_OCPreload_Enable);
       
        TIM_ARRPreloadConfig(MOTOR_TIM, ENABLE);                        //ʹÄÜTIMÖØÔØ¼Ä´æÆ÷ARR
       
        // ʹÄܼÆÊýÆ÷
        TIM_Cmd(MOTOR_TIM, ENABLE);                                                                                                                                               
}



/********************¶¨Ê±Æ÷ͨµÀ**************************/

#define MOTOR_TIM                                                         TIM15
#define MOTOR_TIM_CLK                                                       RCC_APB2Periph_TIM15
#define MOTOR_TIM_APBxClock_FUN      RCC_APB2PeriphResetCmd

#define MOTOR_TIM_GPIOA_CLK             RCC_AHBPeriph_GPIOA


/************Õý¼«***************/

#define MOTOR_P_PIN                          GPIO_Pin_2               
#define MOTOR_P_GPIO_PORT      GPIOA                     
#define MOTOR_P_PINSOURCE        GPIO_PinSource2
#define MOTOR_P_AF                        GPIO_AF_9

#defineMOTOR_P_TIM_OCxInit                     TIM_OC1Init            //ͨµÀ³õʼ»¯º¯Êý
#defineMOTOR_P_TIM_OCxPreloadConfig       TIM_OC1PreloadConfig //ͨµÀÖØÔØÅäÖú¯Êý

//ͨµÀ±È½Ï¼Ä´æÆ÷£¬ÒÔTIMx->CCRx·½Ê½¿É·ÃÎʸüĴæÆ÷£¬ÉèÖÃеıȽÏÖµ£¬¿ØÖÆÕ¼¿Õ±È
//ÒÔºê·â×°ºó£¬Ê¹ÓÃÕâÖÖÐÎʽ£ºMOTOR_TIMx->MOTOR_RED_CCRx £¬¿É·ÃÎʸÃͨµÀµÄ±È½Ï¼Ä´æÆ÷
#defineMOTOR_P_CCRx                             CCR1       

/************¸º¼«***************/
#define MOTOR_N_PIN                        GPIO_Pin_3               
#define MOTOR_N_GPIO_PORT         GPIOA                     
#define MOTOR_N_PINSOURCE          GPIO_PinSource3
#define MOTOR_N_AF                          GPIO_AF_9

#defineMOTOR_N_TIM_OCxInit                      TIM_OC2Init            //ͨµÀ³õʼ»¯º¯Êý
#defineMOTOR_N_TIM_OCxPreloadConfig       TIM_OC2PreloadConfig //ͨµÀÖØÔØÅäÖú¯Êý

//ͨµÀ±È½Ï¼Ä´æÆ÷£¬ÒÔTIMx->CCRx·½Ê½¿É·ÃÎʸüĴæÆ÷£¬ÉèÖÃеıȽÏÖµ£¬¿ØÖÆÕ¼¿Õ±È
//ÒÔºê·â×°ºó£¬Ê¹ÓÃÕâÖÖÐÎʽ£ºMOTOR_TIMx->MOTOR_GREEN_CCRx £¬¿É·ÃÎʸÃͨµÀµÄ±È½Ï¼Ä´æÆ÷
#defineMOTOR_N_CCRx                     CCR2


配置参数检查多次,没有发现有问题,求大哥大姐们看看问题出在哪里,谢谢了




努力的人 发表于 2018-1-24 10:54:43

把这两句删了,试一下
GPIO_SetBits(MOTOR_P_GPIO_PORT,MOTOR_P_PIN);      
GPIO_ResetBits(MOTOR_N_GPIO_PORT,MOTOR_N_PIN);

xmshao 发表于 2018-1-24 12:09:44

时钟配置、管脚复用配置,好好检查下。整体上配置不复杂。
TIM15 只支持通道1/2.

你可以使用STM32CUBEMX配置测试下。
页: [1]
查看完整版本: stm32f301使用tim15产生PWM输出无反应,求解