Do dílů týkajících se ethernetu jsem vklínil tento díl týkající se chyb Value Line mcu. Inspirovala mne k tomu diskuze nad přesností ADC. Celý díl bych rád uvedl úvahou, že k dobrému použití nástrojů potřebuji znát nejen jejich přednosti, ale také chyby.

Chyby

Jednak má čip chyby v návrhu ARM Cortex M3 jádra (který nalezna sama firma ARM) a je společný většině čipů s jádrem Cortex M3. A za druhé má čip chyby v perifériích.

Chyby jádra

Pokud se provádí instrukce LDRD na systémové sběrnici a instrukce je ve tvaru LDRD Ra,Rb,[Ra,#imm], tak se instrukce nedokončí když přijde přerušení v jejím průběhu, nebo když nahrání druhé proměnné vyvolá chybu sběrnice.
Další podrobnosti:
Chyba nenastane, když se instrukce provádí z Flash paměti, nastává pouze při běhu z SRAM. Novější překladače chybu ošetřují, nahrazením této instrukce.

Pokud se provede přerušení spojené s WFE dříve něž je WFE provedeno, tak se registr událostí nenastaví správně a událost se promešká. Proto když je provedeno WFE (to je vstup od sleep módu "wait for event") tak se mcu z WFE neprobudí, pokud nepřijde kromě WFE jiné přerušení nebo nenastane jiná událost.
Další podrobnosti:
Použijte externí události pro probuzení z WFE tak, že nakonfigurujete interní nebo externí EXTI.

Ostatní chyby nepokládám za podstatné (podrobnosti pro nedůvěřivé jsou v errata).

Chyby periférií

Těch je bohužel více.

Chyba ADC vstup 0: pokud je použit PA0 vstup pro ADC konverzi s injection triggerem, tak se na vstupu objeví chyba cca 150 mV po dobu 10 ns.
Další podrobnosti:
Nepoužívejte PA0 jako vstup pro ADC v režimu Injection Trigger

Chyba Debugging Stop Mode + System Tick timer: Když je povoleno přerušení pro Systick a je provedeno při Stop Mode Debug, tak nastane probuzení ze Stop Mode.
Další podrobnosti:
Při debugu Stop Mode zakažte předem přerušení Systick.

Chyba Debugging Stop Mode + WFE: Když dojde při debugu ke vstupu do Stop mode pomocí WFE, které je následováno nějakou instrukcí, tak po probuzení se tato instrukce nevykoná.
Další podrobnosti:
Při debugu Stop Mode zařaďte za instrukci WFE jednu instrukci NOP.

Unikátní ID chybí: U starších revizí čipu vrací načtení unikátního ID hodnoty 0xFF.
Další podrobnosti:
Nejsou - holt to nejde používat u starších čipů Od výrobního kódu 045 tento problém není.

SPI1 ve slave/master módu + USART2 v synchonním módu se nesnášejí: Pokud přicházejí hodiny na SPI1 a USART2 a GPIO port PA4 je ve funkci: Alternate function output, tak dojde k chybě.
Další podrobnosti:
Nejsou - holt to nejde používat v této konfiguraci.

SPI2 ve slave/master módu + USART3 v synchonním módu se nesnášejí: Pokud přicházejí hodiny na SPI1 a USART2 a GPIO port PB12 je ve funkci: Alternate function output, tak dojde k chybě.
Další podrobnosti:
Nejsou - holt to nejde používat v této konfiguraci.

I2C2 s SPI2 a/nebo USART3 se nesnáší: Pokud přicházejí hodiny na I2C2 a SPI2 a/nebo USART3 a GPIO port PB12 je ve funkci: Alternate function output, tak dojde k chybě.
Další podrobnosti:
Nejsou - holt I2C2 nejde používat společně s SPI2 nebo USART3.

I2C1 s SPI1 na remapovaném vývodu a v Master mode se nesnáší: Pokud přicházejí hodiny na I2C1 a SPI1 a zároveň je SPI1 remapovaná a GPIO port PB5 je ve funkci: Alternate function output, tak dojde k chybě.
Další podrobnosti:
I2C1 nejde používat společně s SPI1 v master mode, pokud je SPI1 remapovaná.

I2C1 s TIM3_CH2 s remapovaným vývodem se nesnáší: Pokud přicházejí hodiny na I2C1 a TIM3 a GPIO port PB5 je ve funkci: Alternate function output, tak dojde k chybě.
Další podrobnosti:
I2C1 jde používat společně TIM3, jen pokud je TIM3_CH2 ve input modu.

Chyba USARTx_TX pinu: Pokud je USART jednotka nastavena do modu Receive only, tak na výstupu TX se nastaví "1" a nejde použít jiná alternativní funkce namapovaná na tento pin.
Další podrobnosti:
Žádné - výstup TX u všech USART jednotek je buď výstupní se signálem, nebo vždy "1".

Chyba bitu BSY pro Flash paměť: Pokud je nastaven STRT bit (při vstupu to operace mazání), tak BSY bit se nastaví až o jeden cyklus později. Proto okamžité čtení bitu BSY po nastavení STRT dává vždy výsledek 0.
Další podrobnosti:
Vložte jakoukoliv operaci (případně NOP) po nastavení STRT bitu před prvním čtením BSY.

To předcházející až tak příšerné nebylo, ale I2C dělá paseku.
I2C - některé události je třeba vyřídit, před přenesením byte: Celá řada událostí (viz errata) jení vyřízena před přenosem byte. Problémy vyvstanou, když se přijme extra bajt navíc, stejná data se přečtou dvakrát nebo když data chybějí.
Další podrobnosti:
1. Používejte I2C s DMA, ve všech případech, s výjimou Master modu, kdy se přijímá jeden bajt.
2. Použijete pro obsluhu I2C přerušení a nastavte jeho prioritu jako nejvyšší, aby vykonávání obsluhy nemohlo být přerušeno. Dále vyřešte EV6_1 událost (master přijímá 2 bajty) a EV6_3 událost (master přijímá 1 bajt) dle postupu v erata materiálu.

I2C periférie není zcela v souladu s SMBus v.2.0.: Periférie neumí vyslat NACK pro chybný bajt/příkaz.
Další podrobnosti:
Použijte nějakou jinou kontrolu pro úspěšnost zápisu do cílového zařízení (např. využijte SMBA pin, nebo ARA protokol, nebo Host notify protokol)

Špatné chování I2C periférie když je v master modu a dojde k neočekávanému Stop: Pokud je Stop bezprostředně po Start, tak periférie reagovat na požadavek následného Start. Pokud dojde k Stop v jiném okamžiku a START řídicí bit je v I2C_CR2 nastaven, tak je generován Start na sběrnici chybně a může způsobit chybu sběrnice.
Další podrobnosti:
Za normálních okolností (standart povoluje Stop jen na konci celého bajtu =8 bitů+potvrzení) k tomuto dojít nemůže. V zarušeném prostředí implementujte timeout, který zkontroluje zda po nastavení START řídicího bitu je SB flag nastaven. V opačném případě je třeba periférii resetovat natavením SWRST bitu v I2C_CR2 řídicím registru. Stejně tak je třeba periférii resetovat, když je detekován bit BERR a START bit v I2C_CR2 je nastaven.

Chybný čas I2C periférie pro "Setup time for repeated Start condition": Pokud je I2C provozována na frekvencích mezi 88 kHz a 100 kHz, a je v master modu, dochází k chybnému určení času.
Další podrobnosti:
Snižte rychlost pod 88 kHz nebo použijete I2C Fast mnode.

Při pozdním zápisu odesílaného bajtu do registru I2C periférie dojde k chybě na sběrnici: Pokud je do I2C ve slave módu zapsán odesílaný bajt pozdě ale ještě před SCL rising edge, tak dojde k chybě na sběrnici.
Další podrobnosti:
Data zapisujte v dostatečném předstihu (pokud použijete DMA, problém nenastane) nebo dostatečně pozdě. Problém lze obejít použitím NOSTRECH=0 (periférie natáhne hodiny, ale ne vždy to musí master podporovat).

Při master modu I2C periférie může být poslední bajt chybně přečtený: Pokud je I2C v master mode a poslední bajt není odebrán před příchodem Stop, tak dojde k poškození jeho hodnoty.
Další podrobnosti:
Data odebírejte dostatečně rychle (pokud použijete DMA nebo přerušení s vysokou prioritou, problém nenastane).

Periférie USART má také své nectnosti.
Idle frame není detekován, když je rychlost vyšší než určená: Pokud při přijmutí idle frame (to ani nevím jak přeložit) následuje další znak a hodiny vysílajícího USART jsou rychleji než hodiny přijímající USART periférie, tak USART nedetekuje idle frame.
Další podrobnosti:
Žádné - snažte se aby vysílající USART nebyl rychlejší.

Při full duplex se případná chyba Parity při příjmu vymaže zápisem bajtu do vysílacího registru: Pokud dojde při přijmu k chybě parity a zapíše se nový znak na vysílání pro full duplex módu, tak se příznak - flag PE nastaví na "0".
Další podrobnosti:
Kontrolujete flag PE před zápisem bajtu do vysílacího registru.

Při Mute mode s detekcí značky adresy se nenastaví příznak Chyby Parity: Pokud dojde při přijmu k chybě parity a je nastaven Mute mode a zároveň je detekována validní adresu, tak periférie ukončí Mute mód bez nastavení flagu Parity Error.
Další podrobnosti:
Žádné.

Při nastavení HW kontroly je nezávisle na stavu CTS řídicího signálu vždy vyslán Break frame: Pokud se nastaví Send Break bit (SBK), tak USART odešle Break frame, nezávisle na stavu CTS. Pokud přijímač není chopen příjmu, tak dojde ke ztrátě Break frame.
Další podrobnosti:
Žádné.

Při nastavení HW kontroly je RTS řídicí signál generován nesprávně: Pokud je nastaveno HW řízení přenosu, tak se po příjmu bajtu RST nastaví na High. Ale pokud se bajt neodebere z registru a vysílající USART i přesto pošle další bajt (porušení protokolu), tak na konci bajtu se RTS nastaví do Low úrovně.
Další podrobnosti:
Žádné.

Časovače (týká se TIM1, TIM2, TIM3, TIM4 a TIM5)
Při Capture mode, může dojít ke ztrátě příznaku Capture: Pokud dojde k capture v okamžiku, kdy se čte CCRx registr, tak se Capture flag CCxIF vymaže bez nastavení overcapture flagu (CCxOF).
Další podrobnosti:
Povolte externí přerušení při capture, těsně před čtením capture registru (v capture přerušení) a zakažte externí přerušení po přečtení. Případné chybějící capture můžete detekovat pomocí EXTI.

Při Capture mode, se příznaku Overcapture nastaví brzo: Pokud dojde k capture v okamžiku, kdy se čte capture registr, tak se nastaví Overcapture flag (CCxOF) i když se data správně uloží do capture registru.
Další podrobnosti:
Nejsou.

Regulace při 100% PWM je chybná: Pokud je plnění PWM 100%, nedochází k restartu čítače a OCxREF zůstane nepotvrzený.
Další podrobnosti:
Nejsou.

LSI oscilátor
Ustálení LSI oscilátoru trvá déle: Pokud je nastaven flag LSIRDY, tak stále ještě může být oscilátor nestabilizovaný.
Další podrobnosti:
Dejte LSI oscilátoru ještě navrch 100 us.


Závěr

Spousta zde popsaných chyb je velmi výjimečných a v běžné praxi se s nimi nesetkáte. Na druhou stranu je dobré o těchto chybách vědět v okamžiku, když potřebujete nějaké ne zcela běžné nastavení periférií. Já osobně jsem se z výše uvedených chyb setkal jen s problémy s I2C sběrnicí, která se mi chovala velmi záhadně.


Odkazy

STM32-VL DISCOVERY popis je zde.
STM32-VL Discovery 2. (další popis, osobní poznatky) je zde.
Začínáme s STM32 VL Discovery kitem naleznete zde.
Začínáme s STM32 VL Discovery kitem _2. naleznete zde.
Začínáme s STM32 VL Discovery kitem _3. naleznete zde.
Začínáme s STM32 VL Discovery kitem _4. naleznete zde.
Začínáme s STM32 VL Discovery kitem _5. naleznete zde.
Začínáme s STM32 VL Discovery kitem _6. naleznete zde. (blikání LED)
Začínáme s STM32 VL Discovery kitem _7. naleznete zde. (ladění)
Začínáme s STM32 VL Discovery kitem _8. naleznete zde. (využití SysTick)
Začínáme s STM32 VL Discovery kitem _9. naleznete zde. (změna CLK)
Začínáme s STM32 VL Discovery kitem 10. naleznete zde. (kontaktní pole)
Začínáme s STM32 VL Discovery kitem 11. naleznete zde. (PWM)
Začínáme s STM32 VL Discovery kitem 12. naleznete zde. (watchdog)
Začínáme s STM32 VL Discovery kitem 13. naleznete zde. (externí přerušení)
Začínáme s STM32 VL Discovery kitem 14. naleznete zde. (LCD)
Začínáme s STM32 VL Discovery kitem 15. naleznete zde. (ADC)
Začínáme s STM32 VL Discovery kitem 16. naleznete zde. (Teplotní čidlo)
Začínáme s STM32 VL Discovery kitem 17. naleznete zde. (klávesnice PS/2)
Začínáme s STM32 VL Discovery kitem 18. naleznete zde. (správná verze LCD.c)
Začínáme s STM32 VL Discovery kitem 19. naleznete zde. (DAC převodník)
Začínáme s STM32 VL Discovery kitem 20. naleznete zde. (DAC s přerušením)
Začínáme s STM32 VL Discovery kitem 21. naleznete zde. (DMA v paměti)
Začínáme s STM32 VL Discovery kitem 22. naleznete zde. (DMA s DAC)
Začínáme s STM32 VL Discovery kitem 23. naleznete zde. (RTC)
Dodatek k "Začínáme s STM32 VL Discovery kitem 23." je zde. (RTC úprava)
Začínáme s STM32 VL Discovery kitem 24. naleznete zde. (RTOS-přehled)
Začínáme s STM32 VL Discovery kitem 25. naleznete zde. (USART-přerušení)
Začínáme s STM32 VL Discovery kitem 26. naleznete zde. (USART-přesměrování vstupů a výstupů)
Začínáme s STM32 VL Discovery kitem 27. naleznete zde. (Assembler vkládaný do C kódu)
Začínáme s STM32 VL Discovery kitem 28. naleznete zde. (Vnořované přerušení)
Začínáme s STM32 VL Discovery kitem 29. naleznete zde. (Přímé řízení znakového LCD)
Začínáme s STM32 VL Discovery kitem 30. naleznete zde. (I2C komunikace)
Začínáme s STM32 VL Discovery kitem 31. naleznete zde. (mcu řady STM32L)
Začínáme s STM32 VL Discovery kitem 32. naleznete zde. (RTC)
Začínáme s STM32 VL Discovery kitem 33. naleznete zde. (vícekanálové ADC)
Začínáme s STM32 VL Discovery kitem 34. naleznete zde. (popis TCP/IP)

Errata k STM32F100 naleznete zde.
Reference manuál k Value Line naleznete zde.