2014-04-06 5 views
2

안녕하세요. "stm32f10x open107V 개발 보드"가 있습니다. 제조업체가 제공 한 PWM 코드를 수정했지만, 주어진 LED에 PWM 출력이 없습니다. 개발 보드 누구든지 다음 코드에 대한 도움을 주시기 바랍니다. portB (GPIOB)의 GPIO_pins 0,1,14,15는 개발 보드에 제공된 LED 핀입니다. 코드에 오류가없고 링크하는 동안 오류가 없습니다. 내가 처음 시작했을 때 나는 무엇이 문제인지 이해하지 못합니다. 당신이 (즉, 당신이 있다고 가정합니다 MCU의)가 STM32F107 데이터 시트에서 확인하면 모든PWM 출력이 STM32F10x OPEN107V에서 작동하지 않습니다. 개발 보드

/** 
    -----------------------------------------------------------------*/ 
      #include "stm32f10x_gpio.h" 
      #include "stm32f10x_rcc.h" 
      #include "stm32f10x_tim.h" 



    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
    TIM_OCInitTypeDef TIM_OCInitStructure; 
    uint16_t CCR1_Val = 333; 
    uint16_t CCR2_Val = 249; 
    uint16_t CCR3_Val = 166; 
    uint16_t CCR4_Val = 83; 
    uint16_t PrescalerValue ; 

     /* Private function prototypes -----------------------------------------------*/ 
    void RCC_Configuration(void); 
    void GPIO_Configuration(void); 

     /* Private functions ---------------------------------------------------------*/ 

     /** 

    int main(void) 
    { 

    RCC_Configuration(); 

    /*GPIO Configuration */ 
    GPIO_Configuration(); 


    PrescalerValue =(72000000/24000000) - 1; 
    /* Time base configuration */ 
    TIM_TimeBaseStructure.TIM_Period = 665; 
    TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue; 
    TIM_TimeBaseStructure.TIM_ClockDivision = 4; 
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 

    /* PWM1 Mode configuration: Channel1 */ 
    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); 

    /* PWM1 Mode configuration: Channel2 */ 
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
    TIM_OCInitStructure.TIM_Pulse = CCR2_Val; 

    TIM_OC2Init(TIM3, &TIM_OCInitStructure); 

    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); 

    /* PWM1 Mode configuration: Channel3 */ 
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
    TIM_OCInitStructure.TIM_Pulse = CCR3_Val; 

    TIM_OC3Init(TIM3, &TIM_OCInitStructure); 

     TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); 


     /* TIM3 enable counter */ 
    TIM_Cmd(TIM3, ENABLE); 

    while (1) 
    {} 
    } 


    void RCC_Configuration(void) 
    { 
     /* TIM3 clock enable */ 
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 

    /* GPIOA and GPIOB clock enable */ 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); 
    } 


    void GPIO_Configuration(void) 
    { 
    GPIO_InitTypeDef GPIO_InitStructure; 
     /*GPIOB Configuration: TIM3 channel1, 2, 3 and 4 */ 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_14|GPIO_Pin_15 ; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

    GPIO_Init(GPIOB, &GPIO_InitStructure); 

    GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); 

    } 

답변

1

먼저,의 PB0 및 PB1 핀은 TIM3_CH3과 TIM3_CH4에 매핑 할 수 있지만, PB14와 PB15는 할 수 없다 모든 TIM3 채널에 매핑 됨 - TIM1 채널에만 매핑 됨. 최소한 내 버전의 데이터 시트는 3 절의 표 5를 참조하십시오.

두 번째로 GPIO_PinRemapConfig()을 호출하면 AFIO 재 매핑 기능이 사용됩니다. 실제로 LED에 연결된 두 개의 핀 (PB0 및 PB1)은 재 매핑이 필요하지 않지만 다른 두 개 (PB14 및 PB15)는 사용자가 무엇을 하든지 TIM3 채널로 다시 매핑 할 수 없습니다.

구체적으로 GPIO_PinRemapConfig()을 호출함으로써 코드 변경을 최소화하면서 두 개의 핀 (PB0 및 PB1)에서 PWM 출력을 얻을 수 있습니다. PB14와 PB15에 관해서는, 여분의 코드가 많이 필요할 TIM1을 구성해야합니다. 불행히도 TIM3에 해당 핀을 매핑하는 방법은 없습니다.