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).

Signál který čip vypouští na svůj CCO výstup lze měnit jen když je funkce CCO vypnutá. Před změnou, tedy novým voláním funkce CLK_CCOConfig() musíme nejprve zavolat funkci CLK_CCOCmd(DISABLE), která CCO vypne. Funkce CLK_CCOConfig() výstup automaticky zapne, takže poté není třeba volat funkci CLK_CCOCmd(ENABLE). To je bohužel trochu nelogické (zapínání se provádí "samo", ale vypínání musíme provést my).

/ 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.1 27.6.2020 (akt.7.6.2021) /
| By Michal Dudka (m.dudka@seznam.cz) /