STM32F4xxx –część 3 — Cortex bez tajemnic

st_logo

Poznaliśmy dwa zestawy z mikrokontrolerem  STM32F4xx  nawet umiemy się nieco z nimi pobawić , ale czy to nam wystarczy ??  Nie … wiedzy nigdy dość i warto wiedzieć więcej o rdzeniach CORTEX-MX  …  w tej części  omówimy niektóre szczegóły rdzeni Cortex oraz zobaczymy co się dzieje w naszym mikrokontrolerze po resecie …

Wiedza ta nam się przyda , dzięki czemu będziemy wiedzieli co i jak oraz co się tak naprawdę dzieje ….

Rys Historyczny w skrócie 


ARM czyli Acorn RISC Machine  , później  Adcanced RISC Machine . To rodzina mikrokontrolerów RISC, obecnie rozwijana przez ARM ltd,  i sprzedawana na zasadzie licencji na rdzeń firmom produkującym krzem , jak STM , NXP …. itd.. Rdzenie ARM charakteryzują się 32bitową przestrzenią adresową  — za wyjątkiem ARMv3 który powstał na potrzeby komputerów BBC ACORN i miał tryb zgodności z 26bitowy ….

Oficjalnie ACorn Risc Machine  wystartował w 1983, a producentem krzemu był VLSI Technologic,  jako że był też producentem pamięci i innych układów dla komputerów ACORN.  Procesor jednak przegrał poniekąd z popularnym 6502 z MOS , w 85roku pojawił się jako drugi procesor w mikrokomputerze BBC MIcro. Jednak cel samodzielnej jednostki osiągnięto w 87 roku i pojawił się świetny ACORN Archimedes. 1992 Acorn wygrał  Queen’s Award for Technology.

Później było już tylko lepiej .. choć na rynku popularnych microkontrolerów panowały 6502, MC68000. następny Rdzeń ARM3  miał 30000 tranzystorów i miał konkurować ze staruszką już bo 6 letnią 68000 (40000) tranzystorów … uproszczenie w ARM polegało głównie na braku microkodu.  Rdzeń był energooszczędny i wydajniejszy od wchodzącego na rynek 80286 oparty na CISC.

Można powiedzieć że procesory takie jak XScale , Mohawk …  i kilka innych zakończyły  linie procesorów ARM.

Ale pojawił się ARMv6-M i świat się zmienił … odtąd mamy wysyp mikrokontrolerów (nie należy mieszać nazwy mikroprocesor i mikrokontroler gdyż oznaczają zupełnie odmienne urządzenia). Ekspansja Rdzeni ARM na rynek urządzeń mobilnych i zabawek wydaje się niemieć końca .. a dzięki takim firmom jak STM są one bardziej dostępne dla nas amatorów programowania.


CORTEX  zestaw instrukcji :


 
ARM
Cortex-M
Thumb Thumb-2 Hardware 
multiply    
Hardware
divide
Saturated
math
DSP
extensions
Floating-point ARM 
architecture
 Core
 architecture
Cortex-M0
Most
Subset
1 or 32 cycle
No No No No
ARMv6-M
Von Neumann
Cortex-M0+
Most
Subset
1 or 32 cycle
No No No No
ARMv6-M
Von Neumann
Cortex-M1
Most
Subset
3 or 33 cycle
No No No No
ARMv6-M
Von Neumann
Cortex-M3
Entire Entire 1 cycle Yes Yes No No
ARMv7-M
Harvard
Cortex-M4
Entire Entire 1 cycle Yes Yes Yes
Optional
ARMv7E-M
     Harvard
Cortex-M4F
Entire Entire 1 cycle Yes Yes Yes
Yes
ARMv7E-M
Harvard

W tabelce powyżej widzimy podstawowe informacje o Rdzeniach CORTEX ..  Tu kilka uwag  do tabelki .

Rdzenie Cortex-M0/M0+ i M1 nie obsługują instrukcji Thumb: CBZ, CBNZ, IT  oraz nie zawierają instrukcji dzielenia, ale Obsługują instrukcje Thumb-2: DMB, DSB, ISB, MRS i MSR.  Należy pamiętać też że te rdzenie zostały zaprojektowane jako najmniejsze z rodziny i zostały okrojone do absolutnego minimum — posiadają najmniejszą liczbę instrukcji z rdzeni COrtex-M.

Referencyjny rdzeń Cortex-M3 – ma dodane ma dodane 3 instrukcje Thumb i wszystkie Thumb-2 dodatkowo 10-12 cykli sprzętowych wspomagających dzielenie i pozostałych instrukcji matematycznych.

Cortex-M4 – dodatkowo poza tym co znajdziemy w  M3 posiada też dodatkowe instrukcje wspomagające DSP oraz opcjonalny cooprocesor SPFPU (Single Precision Floating Point Unit)

 

Instructions Instruction
size
Cortex
M0
Cortex
M0+
Cortex
M1
Cortex
M3
Cortex
M4
Cortex
M4F
ADC, ADD, ADR, AND, ASR, B, BIC, BKPT, BLX, BX, CMN, CMP, CPS, EOR, LDM, LDR, LDRB, LDRH, LDRSB, LDRSH, LSL, LSR, MOV, MUL, MVN, NOP, ORR, POP, PUSH, REV, REV16, REVSH, ROR, RSB, SBC, SEV, STM, STMIA, STR, STRB, STRH, SUB, SVC, SXTB, SXTH, TST, UXTB, UXTH, WFE, WFI, YIELD
16-bit
Yes Yes Yes Yes Yes Yes
BL, DMB, DSB, ISB, MRS, MSR
32-bit
Yes Yes Yes Yes Yes Yes
CBNZ, CBZ, IT
16-bit
No No No Yes Yes Yes
ADC, ADD, ADR, AND, ASR, B, BFC, BFI, BIC, CDP, CLREX, CLZ, CMN, CMP, DBG, EOR, LDC, LDMA, LDMDB, LDR, LDRB, LDRBT, LDRD, LDREX, LDREXB, LDREXH, LDRH, LDRHT, LDRSB, LDRSBT, LDRSHT, LDRSH, LDRT, MCR, LSL, LSR, MLS, MCRR, MLA, MOV, MOVT, MRC, MRRC, MUL, MVN, NOP, ORN, ORR, PLD, PLDW, PLI, POP, PUSH, RBIT, REV, REV16, REVSH, ROR, RRX, RSB, SBC, SBFX, SDIV, SEV, SMLAL, SMULL, SSAT, STC, STMDB, STR, STRB, STRBT, STRD, STREX, STREXB, STREXH, STRH, STRHT, STRT, SUB, SXTB, SXTH, TBB, TBH, TEQ, TST, UBFX, UDIV, UMLAL, UMULL, USAT, UXTB, UXTH, WFE, WFI, YIELD
32-bit
No No No Yes Yes Yes
PKH, QADD, QADD16, QADD8, QASX, QDADD, QDSUB, QSAX, QSUB, QSUB16, QSUB8, SADD16, SADD8, SASX, SEL, SHADD16, SHADD8, SHASX, SHSAX, SHSUB16, SHSUB8, SMLABB, SMLABT, SMLATB, SMLATT, SMLAD, SMLALBB, SMLALBT, SMLALTB, SMLALTT, SMLALD, SMLAWB, SMLAWT, SMLSD, SMLSLD, SMMLA, SMMLS, SMMUL, SMUAD, SMULBB, SMULBT, SMULTT, SMULTB, SMULWT, SMULWB, SMUSD, SSAT16, SSAX, SSUB16, SSUB8, SXTAB, SXTAB16, SXTAH, SXTB16, UADD16, UADD8, UASX, UHADD16, UHADD8, UHASX, UHSAX, UHSUB16, UHSUB8, UMAAL, UQADD16, UQADD8, UQASX, UQSAX, UQSUB16, UQSUB8, USAD8, USADA8, USAT16, USAX, USUB16, USUB8, UXTAB, UXTAB16, UXTAH, UXTB16
32-bit
No No No No Yes Yes
VABS, VADD, VCMP, VCMPE, VCVT, VCVTR, VDIV, VLDM, VLDR, VMLA, VMLS, VMOV, VMRS, VMSR, VMUL, VNEG, VNMLA, VNMLS, VNMUL, VPOP, VPUSH, VSQRT, VSTM, VSTR, VSUB
32-bit
No No No No No Yes

Powyższa  tabelka  prezentuje zestawienie instrukcji dla kolejnych rdzeni Cortex …


 

CORTEX-M4   — co w rejestrach piszczy po resecie ….

W sumie nigdy się nad tym nie zastanawiamy , ale niektóre budowane przez nas urządzenia mogą w trakcie resetu  dziwnie się zachowywać … dlatego warto wiedzieć co się dzieje i jak ustawiane są rejestry naszego Mikrokontrolera podczas resetu.

Dla nas oczywiste jest że podczas resetu sa przywracane ustawienia początkowe i program uruchamiany jest od początku, ale tak naprawdę zjawisko resetu jest bardziej złożone i w tym  czasie dzieje się wiele rzeczy dla nas niezauważalnych mianowicie:

  • rejestry ogólnego — przeznaczenia mają nieustalone wartości
  • wskaźnik stosu — ładowane są wartości początkowe rejestru SP umieszczone pod adresem 0x0000 czyli tablica vektorów
  • w rejestrze Link  pojawia się 0xFFFFFFFF
  • licznik programu jest ładowany wartością rejestru reset umieszczoną pod 0x0004 tablicy vektorów
  • w przypadku naszego Cortex-M4 rejestr RESET zawiera adres Reset-Handler który jest definiowany w pliku startup_stm32F4xxx,s. przeprowadza on konfigurację podstawową systemu mikrokontrolera, ustawia zegar systemowy i punkty wejścia do programu __main .
  • Tabela Vektorów jest odwzorowana pod adresem 0 przy resecie , ale może zostać przeniesiona pod dowolny adres w zakresie 0x00000080 – 0x3FFFFF80

268182-20150908232442325-175166027

Poniżej mamy zestawienie rejestrów i ich role w wywołaniu procedury (AAPCS).

268182-20150908232453872-1167795756

Oczywiście szczegóły znajdziecie w dokumentacji ARM dla rdzeni jak też i w dokumentach dostawców krzemu.

I na tą chwilę to wszystko. W następnej części zajmiemy się implementacją magistrali CAN i łączeniem urządzeń w sieci …  przydatne będą oba zestawy ….

 

 

2 myśli w temacie “STM32F4xxx –część 3 — Cortex bez tajemnic

Możliwość komentowania jest wyłączona.