STM32F769: Seven Timing Numbers That Describe a Memory Chip You Cannot See
A recovery request usually names one device. On a board built around this part, the firmware may be spread across three: the microcontroller, a serial flash holding the application image, and a parallel memory holding everything that did not fit — frame buffers, sample buffers, and sometimes the code itself.
The third device is the one that gets overlooked, because it is not where anyone expects firmware to live. It is also the one that can be described most precisely from inside the image, because the controller that drives it is configured by software, and that configuration is a compressed description of the memory part.
What the controller has to be told
Before the external memory can be used, the program writes a geometry word and two timing words. The geometry says how the part is organised; the timing says how slow it is.
| field | what it declares | typical values |
|---|---|---|
| number of column address bits | columns per row | eight, nine, ten or eleven |
| number of row address bits | rows | eleven, twelve or thirteen |
| memory width | data bus width | eight, sixteen or thirty-two bits |
| internal bank count | whether the part has two or four banks | two or four |
| column address strobe latency | clock cycles from command to data | two or three |
| read burst and write burst mode | whether bursts are single or sequential | usually sequential |
Those six fields together describe the addressable capacity, and the arithmetic is direct: rows times columns times width times internal banks. A part with thirteen row bits, ten column bits, a sixteen-bit bus and four internal banks holds sixty-four million bits of storage organised as four million sixteen-bit words. That number either matches the device on the board or it does not, and if it does not, the configuration came from a different hardware revision.
The timing words
The timing registers hold the values that describe how the memory responds, expressed in controller clock cycles.
| parameter | what it constrains | what a large value suggests |
|---|---|---|
| row address strobe to column address strobe delay | how quickly a second access in the same row can begin | a slower part, or a slower clock |
| row precharge delay | time to close a row | likewise |
| row active time | minimum time a row stays open | older or larger geometry |
| row cycle time | row-to-row access | the dominant limit for scattered access |
| exit self-refresh to active | recovery from low power | a part with a long wake-up |
| mode register set to active | initialisation | rarely discriminating |
| write recovery time | time after a write before precharge | distinguishes faster parts from slower ones |
Individual values are not a fingerprint. The set of them is: a design configures the controller for the exact part it was built with, and the ratios between the parameters follow the part’s speed grade. A controller configured for a fast part on a board that now carries a slower one will work until the temperature rises, and the failure will present as random corruption that the customer attributes to the firmware.
Why code ends up out there
Executing from external memory is possible on this family, and it is a rational choice when the application is large and the internal array is not. What matters for a recovery is that the decision leaves a signature.
| signature in the internal image | what it means |
|---|---|
| controller initialisation before any large allocation | the design depends on external memory from early in startup |
| a copy loop with a source in the serial-flash region and a destination in the external memory region | the application is staged through two external devices |
| a jump to an address in the external memory range | execution continues outside the chip |
| a linker script boundary at the end of the internal array with a large vector table offset | the vector table was relocated |
The third row is the decisive one. Once execution continues outside the die, the internal dump is a boot stage and the external device holds the code that does the work — which is the same conclusion as on the value-line member, reached from a different direction, and covered in STM32F750 flash recovery.
Reading the external part
Three approaches, ordered by how much they depend on the firmware working.
| approach | how | reliability |
|---|---|---|
| through the controller, with the device running | read the memory-mapped range with the processor halted | high, if the controller is initialised and protection permits |
| through the controller, with a debugger writing the initialisation | reproduce the configuration, then read | high, but the configuration has to be correct first |
| directly from the memory device | connect to the part and read it as it is | highest, and independent of the firmware entirely |
The second is the one that most benches use and the one that produces the most interesting failures, because reproducing the configuration requires knowing the timing values exactly, and a controller configured with slightly wrong timings reads plausible data that is occasionally wrong. The third is slower and requires access to the board, and it removes the whole class of doubt.
When the readings disagree with the marking
A board whose controller is configured for a different part than the one fitted is not rare. It happens after a component substitution during a shortage, after a board revision that changed supplier, and after a repair in which the memory device was replaced with the nearest available equivalent.
The symptom pattern is distinctive. Reads through the controller succeed and every so often return a value that fails a checksum. The failure rate rises with temperature and with access speed. A direct read of the device returns correct data every time. That combination — intermittent through the controller, perfect directly — is the signature of a timing mismatch rather than a bad memory.
| symptom | likely cause |
|---|---|
| intermittent single-word errors that scale with temperature | timing values too aggressive for the fitted part |
| reads that work at low clock and fail at full speed | same |
| a geometry that implies a larger part than is fitted | configuration left from another board revision |
| data correct through the controller and correct directly | no fault; the earlier errors were elsewhere |
What the report should state
State the geometry as decoded, with the capacity the arithmetic produces. State the timing set and whether it is consistent with the part identification. State whether execution continues into external memory, and if so at what address. And state whether the external device was read directly or through the controller, because the two answers carry different confidence.
The banked internal array that sits alongside this external memory, and the boundary that falls in the middle of it, is covered in STM32F767 firmware recovery. The cache behaviour that decides whether a read of a buffer is current is in STM32F746 software recovery, and the case where the external device holds ciphertext rather than plaintext is in STM32H725 heximal recovery.
FAQ
Can the external memory be read without desoldering? Usually, either through the controller with the device running or by halting the core and taking over the controller. Both depend on the firmware not having protected the region.
Does a flat internal dump include the external memory? No. It is a separate device with a separate address range and a separate read.
Is the timing configuration reliable enough to identify the part? It narrows the candidates to a speed grade and a geometry. The package marking on the device itself settles it.
Conclusion
The external memory is the part of the board that a recovery plan most often forgets, and the controller configuration is the part of the image that describes it best. Geometry gives capacity, timing gives speed grade, and the presence of a jump into that range tells you the internal dump is only the beginning. Reading the registers costs nothing and prevents the most common incomplete delivery on this class of board.