Skip to main content
hannes_bauer
Associate
December 17, 2008
Question

using TIM1 on stm32f103t8 (36pins)

  • December 17, 2008
  • 1 reply
  • 619 views
Posted on December 17, 2008 at 16:22

using TIM1 on stm32f103t8 (36pins)

    This topic has been closed for replies.

    1 reply

    hannes_bauer
    Associate
    May 17, 2011
    Posted on May 17, 2011 at 12:56

    Hello there!

    I'm pretty new with the stm32 and I worked with the st motor control eval board with the 100 pins stm32, where I used tim1 for 6step pwm generation on GIOPE8,9,10,11,12,13- it all worked fine.

    However, now im using the 36 pin version (stm32f103t8) where tim1 can only be used at pins PA8,9,10 (tim_ch1,ch2,ch3) and PA7,PB0,PB1(tim_ch1n,ch2n,ch3n).

    source code:

    #include ''stm32f10x_dbg.h''

    /* Private typedef --------*/

    /* Private define ---------*/

    /* Private macro ----------*/

    /* Private variables ------*/

    /* Private function prototypes -------------*/

    void NVIC_Configuration(void);

    void GPIO_Configuration(void);

    void RCC_Configuration(void);

    void BLDC_Start_Position(void);

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    TIM_OCInitTypeDef TIM_OCInitStructure;

    TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

    USART_InitTypeDef USART_InitStructure;

    /*******************************************************************************

    * Function Name : main

    * Description : Main program.

    * Input : None

    * Output : None

    * Return : None

    *******************************************************************************/

    int main(void)

    {

    #ifdef DEBUG

    //debug();

    #endif

    NVIC_Configuration();

    RCC_Configuration();

    GPIO_Configuration();

    /* TIM1 Counter Clock stopped when the core is halted */

    DBG->CR |= DBG_TIM1_STOP ;

    BLDC_Start_Position();

    while(1);

    }

    /*******************************************************************************

    * Function Name : GPIO_Configuration

    * Description : Configures the TIM1 Pins.

    * Input : None

    * Output : None

    * Return : None

    *******************************************************************************/

    void GPIO_Configuration(void)

    {

    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_StructInit(&GPIO_InitStructure);

    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE);

    GPIO_DeInit(GPIOA);

    GPIO_DeInit(GPIOB);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_7;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

    }

    /*******************************************************************************

    * Function Name : RCC_Configuration

    * Description : Configures the different system clocks.

    * Input : None

    * Output : None

    * Return : None

    *******************************************************************************/

    void RCC_Configuration(void)

    {

    ErrorStatus HSEStartUpStatus;

    /* RCC system reset(for debug purpose) */

    RCC_DeInit();

    /* Enable HSE */

    RCC_HSEConfig(RCC_HSE_ON);

    /* Wait till HSE is ready */

    HSEStartUpStatus = RCC_WaitForHSEStartUp();

    if(HSEStartUpStatus == SUCCESS)

    {

    /* HCLK = SYSCLK */

    RCC_HCLKConfig(RCC_SYSCLK_Div1);

    /* PCLK2 = HCLK */

    RCC_PCLK2Config(RCC_HCLK_Div1);

    /* PCLK1 = HCLK/2 */

    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* Flash 2 wait state */

    FLASH_SetLatency(FLASH_Latency_2);

    /* Enable Prefetch Buffer */

    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* PLLCLK = 8MHz * 9 = 72 MHz */

    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */

    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

    {

    }

    /* Select PLL as system clock source */

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */

    while(RCC_GetSYSCLKSource() != 0x08)

    {

    }

    }

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB

    | RCC_APB2Periph_AFIO | RCC_APB2Periph_TIM1, ENABLE);

    }

    /*******************************************************************************

    * Function Name : NVIC_Configuration

    * Description : Configures the Vector Table base address.

    * Input : None

    * Output : None

    * Return : None

    *******************************************************************************/

    void NVIC_Configuration(void)

    {

    #ifdef VECT_TAB_RAM

    /* Set the Vector Table base location at 0x20000000 */

    NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);

    #else /* VECT_TAB_FLASH */

    /* Set the Vector Table base location at 0x08000000 */

    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

    #endif

    /* 4Bits for subpriority and 0 bits for pre-emption */

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

    }

    void BLDC_Start_Position(void)

    {

    TIM_SetTimeBase(TIM1,5000); //50

    /* Channel 1, 2,3 and 4 Configuration in PWM mode */

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;

    TIM_OCInitStructure.TIM_Pulse = TIM_GetPeriod(TIM1)/2;

    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_OCNIdleState_Set;

    TIM_OC1Init(TIM1, &TIM_OCInitStructure);

    TIM_OC2Init(TIM1, &TIM_OCInitStructure);

    TIM_OC3Init(TIM1, &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_OFF;

    TIM_BDTRInitStructure.TIM_DeadTime = 1;

    TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;

    TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;

    TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

    TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

    /* TIM1 counter enable */

    TIM_Cmd(TIM1, ENABLE);

    /* Main Output Enable */

    TIM_CtrlPWMOutputs(TIM1, ENABLE);

    }

    Its not really different to the code I use for the eval board except the Pins I use and the remap is here partial and for the eval board full.

    When I simulate it in KEIL it the pins PA9,10 and PB0,1 react sa they should - but no reaction at pins PA8 and PA7.

    Then running it on hardware nothing happens not a single pin does anything.

    I tried setting the pins manually works perfectly but in connection with the timer nothing happens.

    What am I doing wrong?

    Please help me, its driving me INSANE :o

    best regards

    Hannes

    [ This message was edited by: hannes_bauer on 17-12-2008 20:55 ]