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