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
配置参数检查多次,没有发现有问题,求大哥大姐们看看问题出在哪里,谢谢了
把这两句删了,试一下
GPIO_SetBits(MOTOR_P_GPIO_PORT,MOTOR_P_PIN);
GPIO_ResetBits(MOTOR_N_GPIO_PORT,MOTOR_N_PIN); 时钟配置、管脚复用配置,好好检查下。整体上配置不复杂。
TIM15 只支持通道1/2.
你可以使用STM32CUBEMX配置测试下。
页:
[1]