cancel
Showing results for 
Search instead for 
Did you mean: 

using TIM1 on stm32f103t8 (36pins)

hannes_bauer
Associate
Posted on December 17, 2008 at 16:22

using TIM1 on stm32f103t8 (36pins)

1 REPLY 1
hannes_bauer
Associate
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 ]