Skip to content
Permalink
Browse files

some updates

  • Loading branch information
Michael Schaufelberger
Michael Schaufelberger committed Jan 11, 2020
1 parent e2e9d9b commit 4b6f72a7eda93926be10fff6fffc4ce573a02a35
@@ -1,4 +1,5 @@
{
"pasteImage.insertPattern": "@import \"${imageFilePath}\" {.max}",
"pasteImage.path": "${currentFileDir}/images",
"pasteImage.filePathConfirmInputBoxMode": "onlyName",
}
@@ -24,15 +24,6 @@ puppeteer:

[TOC]

## Fragen
SRAM in CMOS
Floating Gate
FMC Signals for SRAMs
Rest Async SRAM
I2C
rest of adc
relocation table

## Microcontroller Basics

Single Chip Solutions = CPU mit integrierter Peripherie
@@ -97,35 +88,50 @@ Invertiert Signal wenn ENABLED = 1, sonst OUT = Z (high impedance/floating)

Gegenüber Word Access sind bei Half-Word und Byte Access gewisse Bytes mittels NBL (Not Byte Line) gesperrt.

### Kontroll- und Status Register
- Control Bits
- Erlaubt CPU Slaves zu konfigurieren
- CPU (software): $\rightarrow$ Register-Bit, Slave (HW): Register-Bits $\rightarrow$
- Normalerweise R/W
- Status Bits
- Erlaubt CPU, Slave zu überwachen
- Slave: Status $\rightarrow$ Register-Bit, CPU: Register-Bit \rightarrow$ Status
- Normalerweise R/O
**Memory view** after write access:
```
0x2100'0248 0xBB
0x2100'0249 0xAA
0x2100'024A 0x99
0x2100'024B 0x88
```

Gleiches Register kann Control und Status Bits beinhalten
**Langsame Slaves**
Individuelle Zyklen pro Slave, um allgemein tiefere Clock-Rate zu vermeiden$\rightarrow$ Wait-States einführen. Entweder sagt Slave ob fertig oder wait states werden beim Bus interface programmiert:

### Adressdecodierung
@import "images/wait_states.png"

### Adressdekodierung
= Interpretation von Werten auf Adresslinien
Mittels Adressdecodierung weiss Slave, ob er Ziel von Zugriff ist.
Mittels Adressdekodierung weiss Slave, ob er Ziel von Zugriff ist.

Volle Adressdecodierung
**Volle Adressdekodierung**
- Alle Adresslinien werden decodiert/geprüft
- Auf ein Kontrollregister kann an *genau einem* Ort zugegriffen werden
- 1:1 mapping

Partielle Adressdecodierung
Select ist nur bei einer Adresse aktiv, z.B. 0x4000'8234

**Partielle Adressdekodierung**
- Subset von Adresslinien werden decodiert
- Erkennt einen Adressbereich oder einen Satz von Adressen
- n:1 mapping, n unique Adressen zu gleicher Hardware
$\Rightarrow$ Simplere Decodierung, Aliasing (1:n, HW Register zu mehrere Adressen)

### Langsame Slaves
Individuelle Zyklen pro Slave, um allgemein tiefere Clock-Rate zu vermeiden $\rightarrow$ Wait-States einführen
select ist aktiv für alle Adressen in Bereich, z.B. $A_8$ bis $A_{31}$:
0x4000'8200 to 0x4000'82FF $\rightarrow$ 0x4000'82xx, $A_0$ bis $A_7$ ignoriert

### Kontroll- und Status Register
- Control Bits
- Erlaubt CPU, Slaves zu konfigurieren
- CPU (software): $\rightarrow$ Register-Bit, Slave (HW): Register-Bits $\rightarrow$
- Normalerweise R/W
- Status Bits
- Erlaubt CPU, Slave zu überwachen
- Slave: Status $\rightarrow$ Register-Bit, CPU: Register-Bit \rightarrow$ Status
- Normalerweise R/O

Gleiches Register kann Control und Status Bits beinhalten!

### Kontrollregister in C ansprechen
Volatile teilt Compiler mit, dass Wert der Variablen ausserhalb des Programms wechseln könnte.
@@ -179,26 +185,34 @@ TODO SRAM in CMOS
- ca. 1000x langsamer als SRAM
- Erase geht lange, Auf Sektor kann nicht zugegriffen werden während Löschung
0 = programmed (Bit auf '1'), 1 = erased (Bit auf '0')
Wir können nur 1 schreiben, heisst, Bits nur von 1 auf 0 drehen:
Bit 0 = programmed, Bit 1 = erased
Wir können Bits nur von 1 $\rightarrow$ 0 schreiben, heisst Speicher nur programmieren:
Bits: 1111 $\rightarrow$ 1010 $\rightarrow$ 1000 $\nrightarrow$ 1010
sonst müssen wir wieder löschen:
1000 $\nrightarrow$ 1010 $\Rightarrow$ 1000 $\rightarrow$ 1111 $\rightarrow$ 1010
Flash hat höhere Latenz $\rightarrow$ pre-fetch queue für bessere Performance bei sequentiellen Instruktionen
TODO Floating Gate
### Flexible Memory Controller
Brücke zwischen System- und External-Bus (Slave auf Sys, Master auf Ext)
Brücke zwischen System- und External-Bus (Slave auf Sys, Master auf Ext):
@import "images/fmc.png" {.max}
- Bottleneck, wenn weniger Datenlinien als Systembus
- Sequentielle Übertragung (Word in HW/B aufteilen)
- Implementation
- CPU write to memory
- CPU writes to memory
- FMC FIFO buffer, verhindert Warten auf Memory, freier Systembus
![asdf](images/fmc_write.png)
- CPU read from memory
- Systembus muss auf externen Bus warten, wird geblockt
![asdf](images/fmc_read_block.png)
TODO! FMC Signals for SRAMs
FMC Memory Banks
- 6 Banks (1: SRAM / NOR / PSRAM, 2&3: NAND flash, 4: PC card, 5&6: SDRAM)
- 4 devices per bank
- Pins are multiplexed $\rightarrow$ not possible using all banks simultaneously
### Asynchronous SRAM
Keine Clock
@@ -211,6 +225,19 @@ Kontrollsignale des Bausteins:
| L | H | H | HIGH-Z | Outputs Disabled |
| H | - | - | HIGH-Z | Deselected |
#### FMC Signals
| FMC signal name | I/O | Function |
| --------------- | ----- | ---------------------- |
| A[25:0] | OUT | Address bus |
| D[31:0] | INOUT | Data bidirectional bus |
| NE[4:1] | OUT | Four enable lines 1) |
| NOE | OUT | Output enable |
| NWE | OUT | Write enable |
| NBL[3:0] | OUT | Byte enable |
NBL[3:0] = welche Bytes updaten? alle: 0000, half-word: 0011, byte access: 1011b
**Beispiel: 32K x 8 Bit SRAM**
@import "images/32x8_SRAM.png" {.max}
15 Adressleitungen $\rightarrow$ $2^{15}$ = 32K Adressen à 8 Bit = 256 Kbit
@@ -254,6 +281,7 @@ Zu wenige I/O Pins $\rightarrow$ GPIO macht Pins konfigurierbar und gemeinsam nu
- Serielle Schnittstellen
- Timers/Counters
- ADC (A/D-Umwandlung)
Dies hat die Konsequenzen, dass nicht alle Funktionen gleichzeitig verfügbar sind, Programmierung von internen Registern definieren Pin-Funktion (einmalige Konfiguration on startup)
### STM32F4xx GPIO
@@ -266,8 +294,11 @@ Dies hat die Konsequenzen, dass nicht alle Funktionen gleichzeitig verfügbar si
@import "images/st_gpio.png"
### Konfigurieren
Register Adresse = Basis Adresse + Offset
Basisadresse = Buchstabe von GPIO**x** x = A/../I/J/K
Pin bestimmt Index
*Richtung*
**Richtung**
Mode Register (GPIOx_MODER, MODER[1:0]), 32 Bit
- 00: Input
- 01: General purpose output mode
@@ -307,7 +338,8 @@ GPIOx_ODR, 32 Bit, 16-31 reserviert, r/w by software
**Setting and Clearing Bits**
GPIOx_BSRR, 0-15 sind Set-Bits, 16-31 sind Clear-Bits
Setting a bit through ODR requires ‘read ODR’, ‘OR operation with bit mask’ and ‘write ODR’
Set: Write 1 to GPIOx_BSRR[bit], Clear: Write 1 to GPIOx_BSRR[bit+16]
Setting a bit through ODR requires 1. ‘read ODR’, 2. ‘OR operation with bit mask’, 3. ‘write ODR’
**Summary**
1. Pin nummern finden
@@ -454,7 +486,7 @@ TODO I2C
- CEN = 1 um zu starten (immer als letztes)

**Berechnung Zielfrequenz**
$\displaystyle T = \frac{1}{f}$ ($f$ in Hertz, e.g. 1kHz = alle 1ms)
$\displaystyle Z = \frac{1000 ms}{\text{ziel-ms}}$ ($Z$ in Hertz, e.g. 1kHz = alle 1ms)

**Berechnung Prescaler & ARR**
$\displaystyle D = \frac{Q}{Z}$ wobei $Q$ = Frequenz der Quelle, $Z$ = Zielfrequenz, $D$ = Divisor (gesucht)
BIN +166 KB (110%) Zusammenfassung.pdf
Binary file not shown.
BIN +38.5 KB images/fmc.png
Binary file not shown.
Binary file not shown.
BIN +19.9 KB images/fmc_write.png
Binary file not shown.
Binary file not shown.

0 comments on commit 4b6f72a

Please sign in to comment.
You can’t perform that action at this time.