Skip to main content
emil_eriksson4
Associate
January 6, 2016
Question

STM32F100RCT6TR TIM12 issues

  • January 6, 2016
  • 12 replies
  • 3002 views
Posted on January 06, 2016 at 18:39

Hi!

I am trying to control two motors using an STM32F100RCT6TR microcontroller and the standard peripheral library version 3.5.0. I want to use TIM3 channel 1&2 and TIM12 channel 1&2. TIM3 works perfectly but I get nothing out of TIM12. None of the TIM12 registers that I look at using the debugging mode of IAR embedded workbench even seem to change form being 0. I figure since I initialize TIM12 the same way as TIM3 it should work. 

Does anyone know where I am doing it wrong?

This is my initializing code:

GPIO_InitTypeDef GPIO_InitStruct;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE );

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; 

    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; 

    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 

    GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;

    GPIO_Init(GPIOC, &GPIO_InitStruct);

TIM_TimeBaseInitTypeDef TIM_BaseStruct; //make a struct

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM12, ENABLE); //turn on clock for TIM12

    TIM_BaseStruct.TIM_Prescaler = 0; //No prescaler

    TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_Up; //count up

    TIM_BaseStruct.TIM_Period = PWM_PERIOD; //(PWM_PERIOD=24000)

    TIM_BaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; 

    TIM_BaseStruct.TIM_RepetitionCounter = 0;

    TIM_TimeBaseInit(TIM12, &TIM_BaseStruct); //init

    TIM_Cmd(TIM12, ENABLE); //enable TIM12

    

    TIM_OCInitTypeDef TIM_OCStruct; //Output compare struct

    TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1; //clear on compare match

    TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCStruct.TIM_OutputNState = TIM_OutputNState_Disable;

    TIM_OCStruct.TIM_Pulse = (uint32_t)(PWM_PERIOD*0.6); //60% duty cycle

    TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_Low;

    TIM_OCStruct.TIM_OCNPolarity = TIM_OCNPolarity_High; 

    TIM_OCStruct.TIM_OCIdleState = TIM_OCIdleState_Reset;

    TIM_OCStruct.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

    TIM_OC1Init(TIM12, &TIM_OCStruct); //Initialize TIM12 channel 1

    TIM_OC1PreloadConfig(TIM12, TIM_OCPreload_Enable);

    TIM_ARRPreloadConfig(TIM12, ENABLE);

    

    TIM_OCStruct.TIM_Pulse = (uint32_t)(PWM_PERIOD*0.6);

    TIM_OC2Init(TIM12, &TIM_OCStruct); //Initialize TIM12 channel 2

    TIM_OC2PreloadConfig(TIM12, TIM_OCPreload_Enable); 

    

    

    //Steering

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //turn on clock for TIM3

    TIM_TimeBaseInit(TIM3, &TIM_BaseStruct); //init

    TIM_Cmd(TIM3, ENABLE); //enable TIM3

    

    TIM_OCStruct.TIM_Pulse = (uint32_t)(PWM_PERIOD*0.5); //50% duty cycle

    TIM_OC1Init(TIM3, &TIM_OCStruct); //Initialize TIM3 channel 1

    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

    

    TIM_OCStruct.TIM_Pulse = (uint32_t)(PWM_PERIOD*0.5);

    TIM_OC2Init(TIM3, &TIM_OCStruct); //Initialize TIM3 channel 2

    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); 

    

Best regards,

Emil

#stop-tap-dancing-around
    This topic has been closed for replies.

    12 replies

    Amel NASRI
    ST Technical Moderator
    January 7, 2016
    Posted on January 07, 2016 at 10:45

    Hi eriksson.emil.001,

    It seems that TIM12 is not available in the device you are using.

    In fact, you have to check the exact used revision.

    To be sure about the used revision of STM32F100 device, please check the exact value of ''DEV_ID'' field in DBGMCU_IDCODE register (0xE0042000):

    - If the value is 0x420 or 0x428, refer to RM0041

    - Otherwise, refer to RM0008.

    Based on the reference manual content, you can verify if TIM12 is available on your device or not.

    TIM12 is available only on devices with DEV_ID: 0x430 or 0x428.

    -Mayla-

    To give better visibility on the answered topics, please click on "Best Answer" on the reply which solved your issue or answered your question.
    Tesla DeLorean
    Guru
    January 7, 2016
    Posted on January 07, 2016 at 11:25

    This is an area in which your documentation is VERY weak.

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    Tesla DeLorean
    Guru
    January 7, 2016
    Posted on January 07, 2016 at 11:30

    The Data Sheet (rev 9, Sep 2015) for the part makes no reference to this, just says 10 general purpose timers and has a block diagram showing TIM12

    http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1031/LN775/PF216845

    http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00212417.pdf

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    emil_eriksson4
    Associate
    January 7, 2016
    Posted on January 07, 2016 at 21:53

    Mayla, I checked the revision of the device and it says that is is revision 0x1003 (revision 1,2,3,X,or Y) and device identifier is 0x414.

    As I understand it that means that this is in fact a STM32F101 device and not the STM32F100 device that is says on the package?

    I mean considering that the RM0041 is the manual for STM32F100 and RM0008 is the manual for STM32F101/2/3/5/7.

    This is very unfortunate, we just finished a PCB prototype using the information available in the datasheet for the STM32F100 and because of this error it does not work.

    I agree with clive1 that documentation is lacking in this area, had we known about this beforehand it would be easy to work around.

    I do however thank you for taking the time to respond to my question.

    Regards,

    Emil

    Amel NASRI
    ST Technical Moderator
    January 18, 2016
    Posted on January 18, 2016 at 17:24

    Hi emil,

    If you refer to

    http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/CD00212417.pdf

     that you should be using in your prototype, you will see in page 103 that the marking must contain B as internal code. So it has to be marked as: STM32F100RCT6B.

    If it is not the case, you have to check the issue with your distributor to get correct devices.

    -Mayla-

    To give better visibility on the answered topics, please click on "Best Answer" on the reply which solved your issue or answered your question.
    Tesla DeLorean
    Guru
    January 18, 2016
    Posted on January 18, 2016 at 19:04

    Ok, but where's the manual for the part he has? Is this a legitimate part?

    The one you/I provided gives no information about other part numbering or details on fewer timers.

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    Amel NASRI
    ST Technical Moderator
    January 19, 2016
    Posted on January 19, 2016 at 11:33

    Hi clive1,

    Based on the DEV_ID value, RM0008 has to be used.

    But as I already said, the Distributor has to be contacted to get more details on how to do in such case (continue with these devices and look for manuals to be used or replace the with the correct STM32F100 devices).

    -Mayla-

    To give better visibility on the answered topics, please click on "Best Answer" on the reply which solved your issue or answered your question.
    Tesla DeLorean
    Guru
    January 19, 2016
    Posted on January 19, 2016 at 17:22

    But the part quoted is a standard Tape-Reel product, should we understand that there is mismarked product from the factory, or counterfeit product in the channel?

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    Amel NASRI
    ST Technical Moderator
    January 20, 2016
    Posted on January 20, 2016 at 08:30

    It is neither a mismarked nor a counterfeit product.

    With the agreement of Customers/Distributors requiring it, some STM32F103 devices were delivered in F100 packages.

    These Customers/Distributors are aware of the differences (F103 is more performant but some peripherals as timers may be missed there compared to F100).

    To conclude: the marking of STM32F100 devices must contain the internal code B. Otherwise, it has to be checked with distributor.

    -Mayla-

    To give better visibility on the answered topics, please click on "Best Answer" on the reply which solved your issue or answered your question.
    Tesla DeLorean
    Guru
    January 20, 2016
    Posted on January 20, 2016 at 14:23

    Please consider making specific note of this in the Data Sheet, and any related documentation. 

    http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1031/LN775/PF216845

    Once the parts leave the factory you have little control about where they end up. Engineers who have to support designs later in the life cycle may not be fully aware of this, and the supplied software and tools really don't differentiate this, as best I can tell.

    I probably would have marked these devices as F103 parts and then wavier them into customers like that.

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..