logo_elektromys.eu

/ STM8S Clock |

/ Systém Clocku |

O tom co je a k čemu slouží clock jsme se pobavili na přednáškách, takže si tento popis dovolím vynechat a přejdu hned k tomu jak je clock generován a distribuován v našem STM8S208. Přehledné blokové schema najdete v datasheetu jako Figure 20. Clock Tree. Možná ještě lepším nástrojem s jehož pomocí získáte vhled do clocku na STM8 je STM8CubeMX.


Okno interaktivního nástroj pro konfiguraci clocku STM8CubeMX

blokové schema distribuce clocku v STM8S
Pro většinu naší práce si z tohoto "komplikovaného" schematu vystačíme s možností volit clock mezi HSI a HSE. Tam kde nebudeme potřebovat přesnou frekvenci budeme používat HSI a tam kde budeme potřebovat přesnější frekvence (u aplikací kde pracujeme s časem) sáhneme po HSE.

/ CCO - Configurable Clock Output |

Začnu malým příkladem.

Př.1:
Představte si že postavíte dva krystalové oscilátory o frekvenci 8MHz (to už jistě umíte a pokud ne, vygooglete si "Schmitt inverter crystal oscillator"). Každý takový oscilátor bude mít omezenou přesnost a jeho frekvence se bude odchylovat v řádu jednotek až desítek ppm (miliontin). Řekněme že jeden oscilátor bude mít o 15ppm více než 8MHz a druhý o 15ppm méně než 8MHz. Spočtěte o kolik kmitů udělá první oscilátor více než druhý za 20 sekund své činnosti.

Frekvence prvního oscilátoru je 8MHz*(1+15ppm) = 8MHz.(1+15*10-6)=8000120Hz => tedy o 120Hz více jak nominální hodnota 8MHz
Frekvence druhéo oscilátoru bude analogicky 8MHz*(1-15*10-6)=7999880Hz => tedy o 120Hz méně jako 8MHz
Za jednu sekundu udělá první oscilátor celkem 8000120 kmitů, druhý oscilátor pouze 7999880. První tedy udělá o 240kmitů více jako druhý.
Za dvacet sekund udělá tedy první oscilátor o 20*240 = 4800 více kmitů než druhý.

Ve spoustě aplikací budete potřebovat aby dva integrované obvody nebo obecně nějaké systémy běžely synchronně. Tedy aby měly přesně stejnou frekvenci a nedocházelo k nepříjemnému jevu z příkladu. K tomuto účelu je na našem mikrokontroléru funkce CCO - Configurable clock output, která umožňuje vyvést některý z vnitřních clocků na vybraný pin (PE0 u našeho STM8S208). Tento signál je pak možné přivést okolní elektronice nebo i jinému mikrokontroléru. My se tuto funkci naučíme používat protože pak můžeme signál připojit do osciloskopu nebo do čítače a ověřovat si tím že konfigurujeme clock správně.

Ze "Schematu clocku" vyplývá že na CCO můžeme "vypustit" jeden z mnoha různých signálů. V našich aplikacích budeme většinou pracovat s jedním clockem společným pro periferie (fMASTER) a jádro (fCPU). Takže nás bude zajímat jak na CCO přivést některou z těchto variant. Nejprve bychom měli pomocí už známé funkce GPIO_Init() nastavit pin PE0 jako výstup typu push pull. Pak už stačí zavolat funkci CLK_CCOConfig() s argumentem například CLK_OUTPUT_CPU a clock je vyveden. Schválně si tento jednoduchý "program" napište a změřte na čítači nebo osciloskopu přesnou frekvenci. Pokud jste clock nijak sami nekonfigurovali, měl by čip běžet na frekvenci přibližně 2MHz s tolerancí +-1.5%. To je v praxi velmi nízká přesnost která stačí leda tak na "kuchyňské minutky". Pro přesné časování je potřeba použít jako zdroj clocku krystalový oscilátor (o němž bude řeč později).

/ HSI (High Speed Internal) |

Jak už jsme si řekli za vnitřním 16MHz oscilátorem se nachází blok který umožňuje jej podělit. Ten se ovládá funkcí CLK_HSIPrescalerConfig, která zároveň nastavuje jak dělicí poměr HSI tak dělící poměr CPU (o kterém jsme řekli že ho budeme vždy udržovat na hodnotě /1). Proto budeme volat funkci pouze s jedním z následujících čtyř argumentů

Cv.1:
Využijte funkce CCO a zkuste nastavit clock čipu na různé frekvence a sledujte na osciloskopu nebo čítači zda frekvence odpovídá.

/ HSE (High Speed External) |

Bylo by velmi praktické předvést si jak k mikrokontroléru připojit vlastní externí krystal (například 24MHz) a rozběhnout s ním HSE jako krystalový oscilátor. Na našem nucleo kitu se nachází prostor jak pro krystal tak pro kondenzátory, ale jedná se o miniaturní SMD součástky a jejich připájení by vám dělalo problémy. Navíc bychom riskovali zničení kitu, proto si tuto variantu necháme do praxe, kde si jistě budete moct připravit vlastní desku s STM8S. Abychom ale nezůstali zkrátka, předvedeme si jak HSE využít ke zpracování externího clocku. Ten je na pin PA1 (OSCIN) přiváděd z Stlinku (programátoru), má frekvenci 8MHz a je odvozen od krystalu, takže je o několik řádů přesnější než HSI a na stopky by nám bude bohatě stačit.

K přepnutí stačí zavolat funkci CLK_ClockSwitchConfig() se správnými parametry a ona se pak postará o všechno za vás. Její parametry jsou popořadě:

  1. CLK_SWITCHMODE_AUTO - chcete provést automatické přepnutí (manuální ještě dlouho nebudete potřebovat)
  2. CLK_SOURCE_HSE - zdroj clocku má být HSE
  3. DISABLE - nechceme zapnout přerušení (přerušení by se vyvolalo v okamžiku kdy dojde k přepnutí clocku)
  4. CLK_CURRENTCLOCKSTATE_ENABLE - stávající zdroj clocku (HSI) chceme nechat běžet (neřešíme spotřebu).
Po celou dobu kurzu můžete tuto funkci brát jako kouzelnou formuli a volat ji stále s těmito parametry kdykoli budete chtít přepnout HSE jako zdroj clocku. Typicky tuto funkci zavoláte jednou někde na začátku programu a od té doby už nebudete clock měnit.

Cv.2:
Upravte program tak aby byl taktován z HSE a s pomocí funkce CCO si vyveďte clock na pin. Změřte čítačem nebo osciloskopem frekvenci.


Průběh na výstupu CCO když je jako clock zvolen 16MHz HSI. V pravém horním rohu vidíte frekvenci měřenou čítačem 16.1073MHz. Tedy frekvence o 0.7% větší než nominálních 16MHz.

Průběh na výstupu CCO když je jako clock zvolen HSE. Frekvence je zde velmi přesná 8.00005MHz, tedy přibližně o 6ppm nad 8MHz (K měření s přesností na jednotky ppm je potřeba použít čítač s kvalitním oscilátorem - což není tento případ). Pro srovnání jsem tentýž signál vyvedl jednou s PE0 nastaveným jako GPIO_MODE_OUT_PP_LOW_SLOW a jednou jako GPIO_MODE_OUT_PP_LOW_FAST. Který je který je patrné z doby náběžné a sestupné hrany.

| /

| Odkazy /

Home
| V1.01 27.6.2020 /
| By Michal Dudka (m.dudka@seznam.cz) /