STM32F303 Discovery - 2. program (LED, tlačítko, přerušení od časovače [SysTick_Handler])
- September 04 2013
- STM32F4, STM32F7, STM32L1, STM32F3, Nucleo, Discovery
- 5706x Přečteno
Nejprve se zavolá funkce Delay() v té se provede zápis hodnoty do TimeForDelay, poté se čeká dokud není TimeForDelay = 0. Dekrementace TimeForDelay se provádí ve funkci DelayTime(), ta se volá po přerušení ze SysTick_Handler (přerušení od časovače). Jak často má k přerušení docházet je nastaveno takto:
Pro lepší pochopení tohoto příkazu ho trochu rozebereme. Do SysTick_Config se zapíše hodnota (SystemCoreClock / 1000). To znamená 8 000 000Hz / 1000 => 8000, ale protože je to if (xxx) znamená to, že dokud není SysTick_Config = 8000 zůstane v nekonečné smyčce. Proto výsledné zpoždění je 1ms.
Pokud SysTick_Config není nastaven, resp. nemá nastavený jiné hodiny, pak je frekvence odebíráná z interních hodin (8MHz).
Nastavení "co se stane, když nastane přerušení" se nastavuje v knihovně stm32f30x_it.c
V tomto případě se pouze zavolá funkce DelayTime, v které se provedou následující příkazy:
Porovná se hodnota TimeForDelay jestli už není nulová, pokud ne, dekrementuje se hodnota TimeForDelay. Ve funkci Delay(), ale stále čekáme (while TimeForDelay != 0) dokud nebude TimeForDelay nulový. Po dalším přerušení se opět zavolá funkce DelayTime() a zkontroluje se hodnota TimeForDelay. Pokud je už nulová, neprovede se žádná další instrukce ve fci DelayTime (už žádná není), zatímco v funkci Delay() se ukončí čekání na nulovou hodnotu TimeForDelay. Poté se pokračuje další instrukcí, tedy pro zapnutí/vypnutí LED. Následuje další instrukce, kde zapíšeme ve funkci Delay() novou hodnotu TimeForDelay. A celý proces se opakuje. Tlačítkem (USER BUTTON) pouze měníme hodnotu TimeForDelay.
Následuje kompletní kód v main.c