Sdílejte chiptron.cz na sociálních sítích



RSS feeds

STM32F303 Discovery - 2. program (LED, tlačítko, přerušení od časovače [SysTick_Handler])Tisk

Takže tu máme druhý program, opět blikání LEDkou, ale tentokrát pomocí přerušení od časovače SysTick. Změna frekvence blikání je řešena tlačítkem (USER BUTTON). Program byl opět převzatý ze stránek mcu.cz přesněji z http://mcu.cz/comment-n2119.html. Jako pomůcka nám pomůže vývojový diagram.

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

Upozornění

Administrátor těchto stránek ani autor článků neručí za správnost a funkčnost zde uvedených materiálů.
Administrátor těchto stránek se zříká jakékoli odpovědnosti za případné ublížení na zdraví či poškození nebo zničení majetku v důsledku elektrického proudu, chybnosti schémat nebo i teoretické výuky. Je zakázané používat zařízení, která jsou v rozporu s právními předpisy ČR či EU.
Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva.
Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ.
10,933,094 návštěv