Search
Podklady pro Cvičení_5 - Skalický
Blinky_start
Podklady pro cvičení - Konfigurace GPIO
Vývojové prostředí KEIL
Přístup k jednotlivým vývodům uP.pdf
Možnosti debug v prostředí KEIL
Příklady využití debug režimů v prostředí KEIL
Jádro ARM M4
Datasheet STM32F401
Referenční manuál STM32F401
Instrukční sada STM32F4
Datasheet Nucleo F401RE
Podklady pro Nucleo STM32F401
Funkce - Nastavení GPIO
#define BITSET(reg, bit) ((reg) |= (1U << (bit))) #define BITCLEAR(reg, bit) ((reg) &= (~(1U << (bit)))) #define BITTOGGLE(reg, bit) ((reg) ^= (1U << (bit))) #define BITGET(reg, bit) ((reg & (1U << bit)) >> bit)
Mikrokontrolér (MCU) je sekvenční programovatelný obvod se zabudovanými periferiemi a pamětí uvnitř čipu. Některé MCU disponují ještě externí pamětí, kterou lze využít na rozšířenou RAM paměť nebo další periferie. Činnost MCU závisí na posloupnosti příkazů strojového kódu programu uloženou v paměti ROM nebo dočasně v paměti RAM. Každá instrukce vyžaduje určitý strojový čas na jeho provedení (min. 1 strojový cyklus na instrukci) během kterého se vykonají tři fáze (fetch-decode-execute). Aby bylo možné zvýšit rychlost mikrokontroléru, byl vymyšlena tzv. pipeline příkazů, kde v daný okamžik se může vykonávat více fází instrukce najednou a tím urychlit běh programu. Instrukce se vykonají podle toho, jak jsou napsané v programu za sebou, kde každá část fetch-decode-execute se vykoná na jeden hodinový takt se zpožděním, viz. následující schéma nebo Referenční manuál STM32F401 na straně 48.
Fig. 1
Fig. 2
Architektura jádra ARM je navržena s lineárním 32-bitovým paměťovým prostorem, kde pro jednotlivé části je vyhrazeno zpravidla 512 MB paměti, což odpovídá adresám pro:
0x0000 0000
0x1FFF FFFF
0x2000 0000
0x3FFF FFFF
0x4000 0000
0x5FFF FFFF
V případě, že mikrokontrolér má paměť pro oblast ROM a RAM menší než 512 MB, je využita zpravidla pouze spodní část adres, pro STM32F401RE konkrétně:
0x0007 FFFF
0x2001 7FFF
Každý mikrokontrolér obsahuje sadu registrů pro ovládání jednotlivých periferií nebo interních obvodů/bloků. Abychom mohli s mikrokontrolérem pracovat, je třeba se seznámit se základní konfiguraci pro následujícími registry: RCC, GPIOx, NVIC, EXTI a pochopit jejich použití. Obecně architektura ARM pracuje na bázi skupiny registrů, které jsou umístěny do adresového prostoru bázovou adresou a následně konfiguračními registry, které představují offset od bázové adresy.
RCC
GPIOx
NVIC
EXTI
Přístup z jazyka C se po vložení hlavičkového souboru provádí přes strukturu daného registru, např. pro skupinu RCC a registr AHB1ENR
RCC→AHB1ENR
Pro přístup z jazyka symbolických adres se využívá nastavení pomocných registrů a offsetu instrukce LDR, viz příklad 01 - GPIO LED a Vybraná instrukční sada pro STM32
Na následujících řádcích je práce s registrem RCC→AHB1ENR, který je na bázové adrese 0x40023800 s posunem o 0x30. Výsledná adresa je následně v registru R2.
0x40023800
0x30
ldr R0, #0x40023800; ldr R1, #0x30; ldr R2, [R0, R1];
Bázová adresa je: 0x40023800
Skupina registrů RCC povoluje hodinové signály do jednotlivých periferií (GPIO, TIMER, ADC, …) podle schématu výš. K aktivaci příslušné periferii, kterou chceme používat, je třeba nejprve zavést hodinový signál do příslušného bloku, který obstarávají registry AHBxxx nebo APBxxx. Pokud se hodinový signál nezavede, daný blok nebude funkční a nebude registrovat žádné instrukce.
Taktéž zajišťuje nastavení hodinových kmitočtů pro jednotlivé periferie i jádro procesoru.
Offset registru je: 0x30
Registr AHB1ENR zajišťuje povolení hodin pro GPIO brány a DMA signály. Podle následujícího obrázku např. nastavením nultého bitu do logické 1 povolíme hodinový signál do brány GPIOA, nastavením do 0 naopak hodinový signál z brány GPIOA odebereme.
Bázové adresy jsou pro port:
0x4002 0000
0x4002 0400
0x4002 0800
0x4002 0C00
0x4002 1000
0x4002 1C00
Obecná GPIOx brána je 16-ti bitová brána, která může být použita jak vstupně-výstupní port pro digitální periferie, tak i analogová brána, pokud se na dané bráně nachází analogové vstupy nebo výstupy.
Digitální GPIO piny mohou být řízeny jednat softwarově, tak je možné využít i alternativní funkci předem definovaných bloků, které jsou harwarově namapované na konkrétní piny procesoru (jeden blok může být namapován i na více pinů, ale v tomto případě je třeba se rozhodnout na kterých pinech se daný blok bude používat). Namapování alternativních funkcí lze přehledně nalézt v datahsheetu od strany 45 v tabulce alternativních funkcí.
Na následujícím obrázku je schéma jednoho GPIO pinu
Offset registru je: 0x00
0x00
Mód pinu se nastavuje dvojicemi sousedních bitů pro každý GPIO pin portu.
00 – Input (pin bude vstupní) 01 – Output (pin bude výstupní) 11 – Analog (pin bude analogový vstup) 10 – Alternate function (pin bude sloužit k alternativní funkci, například bude připojen k jiné periferii v procesoru)
Offset registru je: 0x04
0x04
Registrem určujeme, zda bude výstupní pin dvojčinný (push-pull) nebo s otevřeným kolektorem, který je nezbytný pro připojení k datovým sběrnicím. Každý pin dané brány je nastaven právě jedním bitem, je tedy využito dolních 16 bitů registru.
0 – Push-pull (dvojčinný) 1 – Open-drain (otevřený kolektor)
Offset registru je: 0x08
0x08
32b registr. Opět dvojce bitů přísluší jednomu pinu. Pomocí toho registru lze nastavit maximální frekvenci výstupního signálu (samotný procesor je natolik rychlý, že by výstupní frekvence mohla být velmi vysoká, ovšem to je při delších vedeních nevyhovující a delším vedením lze pro vysoké frekvence považovat i vodič délky pár centimetrů). Ovšem snížení frekvence znamená i prodloužení doby náběžné a sestupné hrany. To ale také znamená menší dodávaný proud a tím i ušetřená energie.
00 – Low speed 01 – Medium speed 10 – Fast speed 11 – High speed
Rychlosti záleží na typu procesoru, je třeba nahlédnout do datasheetu.
Offset registru je: 0x0C
0x0C
32b registr. Pro nastavení správných úrovní na vstupním pinu lze zapnout interní pull-up nebo pull-down rezistor. Pokud není připojen, úroveň na vstupním pinu je nedefinovaná (floating input) a může vést k nesprávnému vyhodnocení stavu brány.
00 – Źádné rezistory 01 – Pull-up (rezistor na napájecí napětí) 10 – Pull-down (rezistor na zem) 11 – nevyužitá kombinace
Offset registru je: 0x10
0x10
16b registr. Obsahuje údaj o logické hodnotě na vstupních pinech dané brány. Pin musí být nastaven jako vstupní digitální, aby mělo smysl vstup číst, protože v případě nastavení pinu jako analogového je vstupní digitální obvod odpojen.
Offset registru je: 0x14
0x14
16b registr. Nastavením bitů registru je ovládána logická úroveň jednotlivých pinů brány. Pin musí být nastaven jako vstupní digitální, aby mělo smysl výstup zapisovat, protože v případě nastavení pinu jako analogového je výstupní digitální obvod odpojen.
Offset registru je: 0x18
0x18
Registr, kterým lze nastavit nebo resetovat jednotlivé GPIO piny brány přímo, aniž by bylo třeba vstupní hodnotu číst. Spodních 16 bitů slouží pro nastavení (log. 1) pinu, vrchních 16 bitů slouží pro resetování pinu (log. 0). BSRR registr je určený pouze pro zápis a nelze z něj číst (resp. se přečte hodnota 0).
0 - Bit GPIOx portu se nezmění 1 - Bit GPIOx portu se nastaví (spodních 16 bitů) nebo vynuluje (vrchních 16 bitů)