2014-12-26 9 views
0

Я не могу понять, почему мой код не работает! Я работал с TIM1, и все работает нормально, но когда я перехожу на TIM8, PC6 и PC7 всегда включены, а дополнения всегда выключены. Пожалуйста, помогите мне и счастливые праздники!STM32F407 TIM8 дополняющий

/* Includes ------------------------------------------------------------------*/ 
#include "stm32f4xx.h" 
#include "stm32f4xx_gpio.h" 
#include "stm32f4xx_rcc.h" 
#include "stm32f4xx_tim.h" 
#include "misc.h" 

/* Private typedef -----------------------------------------------------------*/ 
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
TIM_OCInitTypeDef TIM_OCInitStructure; 
TIM_BDTRInitTypeDef TIM_BDTRInitStructure; 

/* Private define ------------------------------------------------------------*/ 
#define frequency 42500 /* output frequency 42500 KHz */ 
#define f1 1/2 /* phase shift 90 degrees */ 

/* Private macro -------------------------------------------------------------*/ 
/* Private variables ---------------------------------------------------------*/ 
int TimerPeriod = 0; 

/* Private function prototypes -----------------------------------------------*/ 
void TIM_Config(void); 

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

/** 
    * Main program 
    */ 
int main(void) 
{ 

    /* TIM8 Configuration */ 
    TIM_Config(); 

    /* Compute the value to be set in ARR register to generate the desired signal frequency */ 
    TimerPeriod = ((SystemCoreClock/2)/frequency) - 1; 

    /* Time Base configuration */ 
    TIM_TimeBaseStructure.TIM_Prescaler = 0; 
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
    TIM_TimeBaseStructure.TIM_Period = TimerPeriod; 
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; 

    TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); 

    /* Channel 1 and 2 Configuration in Toggle mode */ 
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; 
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; 
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
    TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; 
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; 
    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; 

    TIM_OCInitStructure.TIM_Pulse = (TimerPeriod/6)+ (TimerPeriod * f1); 
    TIM_OC1Init(TIM8, &TIM_OCInitStructure); 

    TIM_OCInitStructure.TIM_Pulse = (TimerPeriod/6) ; 
    TIM_OC2Init(TIM8, &TIM_OCInitStructure); 

    /* Automatic Output enable, Break, dead time and lock configuration*/ 
    TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; 
    TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; 
    TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; 
    TIM_BDTRInitStructure.TIM_DeadTime = 25; ///////// the right value for 250ns delay //////// 
    TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable; 
    TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; 
    TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; 

    TIM_BDTRConfig(TIM8, &TIM_BDTRInitStructure); 

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

    /* Main Output Enable */ 
    TIM_CtrlPWMOutputs(TIM8, ENABLE); 

    while (1) 
    { 
    } 
} 

/** 
    * Configure the TIM8 Pins. 
    */ 
void TIM_Config(void) 
{ 
    GPIO_InitTypeDef GPIO_InitStructure; 

    /* GPIOA, GPIOB and GPIOC clocks enable */ 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC, ENABLE); 

    /* TIM8 clock enable */ 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); 

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; 
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; 
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; 

    /*GPIOA Configuration: Channel 1N and BKIN as alternate function push-pull*/ 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; 
    GPIO_Init(GPIOA, &GPIO_InitStructure); 

    /* GPIOA Configuration: Channel 1 and 2 as alternate function push-pull */ 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; 
    GPIO_Init(GPIOC, &GPIO_InitStructure); 

    /* GPIOB Configuration: Channel 2N as alternate function push-pull */ 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 
    GPIO_Init(GPIOB, &GPIO_InitStructure); 

    /* Connect TIM pins to AF1 */ 
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_TIM8); 
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_TIM8); 
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM8); 
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM8); 
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_TIM8); 

} 
+0

Какую плату вы используете? Если это обнаружение F4, то обратите внимание, что некоторые из контактов канала TIM8 берутся другими периферийными устройствами на этой плате. Обратитесь к [схематическому] (http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00039084.pdf) и выберите только контакты, обозначенные как «Свободный I/вывод». –

+0

Ну, если я изменю свой код на TIM1, это правда, что каждый вывод «Свободный ввод-вывод». Ну, я думаю, что самым важным булавкой является BKIN. Но если вы ищете TIM8_BKIN, есть только один, PA6, который не является «Free I/O». – co2ark5

+0

@ co2ark5 Привет ... Вы решили эту проблему? Я тоже сталкиваюсь с этим! – Swanand

ответ

0

@Swanand пытаются изменить

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set;

и дайте мне знать.