Timery u STM32

Tomáš Hamouz hamouz na divesoft.cz
Úterý Červen 27 17:44:16 CEST 2017


Tak už se to vyřešilo díky poznámce H.Sladkého.
Ale když už jsem se s tím vypisoval, tak to pošlu také.




>>Zdravím
>>
>>začínám s rodinou STM32 a narazil jsem na záhadu u TIM7.
>>Procesor STM32F303VE, prostředí CrossWorks
>>
>>Mám zkonfigurované 2 timery
>>  - TIM2 prescaler na 1MHz, jen počítá us
>>  - TIM7 prescaler na 1MHz, počítá do 1000 a generuje interupt po 1ms.
>>
>>Kdyľ to přeloľím jako Debug, vąe běľí jak má.
>>Kdyľ to přeloľím jako Release, TIM7 běľí 2x rychleji a generuje int po
>>0.5s.

> Asi to malo byt 0.5ms, tipujem.

Ano, 0.5ms.

> Odkial viete ako casto to generuje prerusenie?

myslel jsme si to, protože to vypisovalo na debug po 0.5s.
Máte pravdu, mohlo to být způsobené že by se v interruptu
inkrementovaly ticky více než o 1.


Zjednodušený výpis zdrojáků a výpis z debug UARTu je na konci.



> Ako presne su nastavene
> hodiny?

HSE=24MHz, PLL=72MHz, AHB=Div1, APB1=Div2, APB2=Div1 (na plné pecky)


> Idealne dajte hodnoty vycitane z relevantnych registrov RCC aj
> timerov.

Doufám že jsem nepřehlédl nějaký relevantní registr

RCC
  CR    = 03035D83
  CFGR  = 0619040A
  CFGR2 = 00000002
  CFGR3 = 0
V obou případech stejné

TIM7
  CR1   = 00000001
  CR2   = 0
  DIER  = 00000001
  SR    = 00000001
  PSC   = 00000047
  ARR   = 000003E7
V obou případech stejné


TIM2
  CR1   = 00000001
  CR2   = 0
  SMCR  = 0
  SR    = 00000001
  PSC   = 00000047
  ARR   = FFFFFFFF
V obou případech stejné


----

//----------------------------------------------------------------------------
void TIM7_IRQHandler(void)
// Handler for TIM7 interrupt
//----------------------------------------------------------------------------
{
 TADY TO BYLO PUVODNE OBRACENE!

    // shodit int flag v timeru
    TIM_ClearFlag(TIM7, TIM_SR_UIF);

    // zapocitat dalsi tick
    jiffies++;
}  // TIM7_IRQHandler




//-----------------------------------------------------------------------------
void main(void)
//-----------------------------------------------------------------------------
{
    init();

    // hlavni smycka
    while(true) {
        modbus_regs[IHUD_REG_DIVETIME] = getSystemTickCount()/TICKS_PER_SECOND; // test  aby se mi menily data
        display_hud();
        __WFI();

        if (jiffies % TICKS_PER_SECOND) == 0) {
            char   buf[64];
            int length = sprintf(buf, "jif: %u    tmr: %u\n", getSystemTickCount(), TIMER_US_READ_VALUE);
            uart1_write(buf, length);
        }
    }  // while
}  // main


Vypisuje to
Na debug:
jif: 1000    tmr: 998993
jif: 2000    tmr: 1998993
jif: 3000    tmr: 2998993
jif: 4000    tmr: 3998993
jif: 5000    tmr: 4998993
jif: 6000    tmr: 5998993
jif: 7000    tmr: 6998993
jif: 8000    tmr: 7998993
jif: 9000    tmr: 8998993

Na Release
jif: 1000    tmr: 6598996
jif: 2000    tmr: 7098996
jif: 3000    tmr: 7598996
jif: 4000    tmr: 8098996
jif: 5000    tmr: 8598996
jif: 6000    tmr: 9098996
jif: 7000    tmr: 9598996
jif: 8000    tmr: 10098996
jif: 9000    tmr: 10598996
A skutečně to vypisuje po 0,5s


Tomáš




Další informace o konferenci Hw-list