From e14f1692f096bbeb0f37362ed5225699dbc8e2a9 Mon Sep 17 00:00:00 2001 From: Thies Lennart Alff Date: Mon, 19 Sep 2022 12:34:58 +0200 Subject: [PATCH] esp32 --- assets/plotly/esp32-bootmode-selection.html | 71 +++++++++++++++++ content/posts/discord-update.md | 2 +- content/posts/esp32-bootmode-selection.md | 61 ++++++++++++++ layouts/partials/foot_custom.html | 42 ++++++++++ layouts/shortcodes/centerfigure.html | 10 +++ layouts/shortcodes/figref.html | 1 + layouts/shortcodes/overline.html | 1 + layouts/shortcodes/overlinecode.html | 1 + layouts/shortcodes/plotly.html | 7 ++ layouts/shortcodes/table.html | 4 +- static/css/fonts.css | 2 +- static/css/style.css | 84 +++++++++++++++++--- static/images/esp32-bootmode-circuit.png | Bin 0 -> 28007 bytes static/js/figref.js | 30 +++++++ 14 files changed, 300 insertions(+), 16 deletions(-) create mode 100644 assets/plotly/esp32-bootmode-selection.html create mode 100644 content/posts/esp32-bootmode-selection.md create mode 100644 layouts/shortcodes/centerfigure.html create mode 100644 layouts/shortcodes/figref.html create mode 100644 layouts/shortcodes/overline.html create mode 100644 layouts/shortcodes/overlinecode.html create mode 100644 layouts/shortcodes/plotly.html create mode 100644 static/images/esp32-bootmode-circuit.png create mode 100644 static/js/figref.js diff --git a/assets/plotly/esp32-bootmode-selection.html b/assets/plotly/esp32-bootmode-selection.html new file mode 100644 index 0000000..98d1e10 --- /dev/null +++ b/assets/plotly/esp32-bootmode-selection.html @@ -0,0 +1,71 @@ + + + +
+
+ + \ No newline at end of file diff --git a/content/posts/discord-update.md b/content/posts/discord-update.md index 5d5b902..7f142db 100644 --- a/content/posts/discord-update.md +++ b/content/posts/discord-update.md @@ -15,4 +15,4 @@ sudo vim /opt/discord/resources/build_info.json "releaseChannel": "stable", "version": "0.0.18" } -``` \ No newline at end of file +``` diff --git a/content/posts/esp32-bootmode-selection.md b/content/posts/esp32-bootmode-selection.md new file mode 100644 index 0000000..9bc1123 --- /dev/null +++ b/content/posts/esp32-bootmode-selection.md @@ -0,0 +1,61 @@ +--- +title: ESP32 Automatic Bootmode Selection +date: 2022-09-16 +categories: ['Software'] +tags: ['software', 'microcontroller', 'esp32'] +figref: True +mathjax: True +--- + +Most ESP32 boards you can buy have a small circuit between the USB-Serial converter and the ESP32 itself to facilitate the procedure of writing new programs to the microcontroller. The general concept is that the ESP32 gets reset as soon as a serial connection will be created and the bootmode-selection pin gets pulled low to select the download-bootmode. + +The reset circuit in {{< figref circuit >}} looks quite simple, doesn't it? In fact, getting it working gave me some headaches. In the end probably because I was sloppy with the wires and it had nothing to do with the overall procedure at all. Whatsoever, it made me investigate the procedure of auto-resetting and auto-bootmode-selection in detail. + +{{< centerfigure id="circuit" src="/images/esp32-bootmode-circuit.png" width="50%" caption="The often used reset circuit to boot into the bootloader. This makes writing the a program to the flash memory possible without manual interaction." >}} + +Actually, {{< figref circuit >}} shows only one half of the reset and bootmode-selection circuitry. But we stick with the first half for now. It might be useful to extend the picture a bit though. Let's imagine we have a USB-Serial-Converter to connect our computer to the ESP32. The converter will have Tx and Rx pins of course but it also has a (amongst others) a {{< overlinecode RTS >}} and a {{< overlinecode DTR >}} pin. Originally these were used for flow control with for example modems. `RTS` means Request to Send. This way the computer tells the modem it would like to send data. The modem would signal its readiness to receive data with the Clear to Send (`CTS`) signal. `DTR` stand for Data Terminal Ready. The purpose of this line is to signal the modem readyness of our computer. + +Since we do not communicate with a modem, we do not care much about the original meaning of these signals. We just use the inverted `DTR` and `RTS` outputs of the USB-Serial-Converter to control the states of the `ENABLE` (sometimes also called {{< overlinecode RESET >}}) and the `GPIO0` pins. The following table displays the output states `EN` and `GPIO0` dependent on the inputs {{< overlinecode DTR >}} and {{< overlinecode RTS >}}. The parentheses indicate weak levels. The circuit in {{< figref circuit >}} is only able to pull the outputs low actively. Due to the fact, that the outputs are pulled high by internal or external pull-up resistors, we get defined output states. The x for `GPIO0` indicates that we do not care about its state while the `EN` pin is pulled low. Therefore the ESP32 is in reset state and the GPIO0 does not matter at all. But for the curious ones: it will be probably low during reset as we will see in a moment. +{{< table >}} +| State | !DTR | !RTS | EN | GPIO0 | +| ---- | ---- | ---- | ----- | ---- | +| 11 | 1 | 1 | (1) | (1) | +| 10 | 1 | 0 | 0 | x | +| 01 | 0 | 1 | (1) | 0 | +| 00 | 0 | 0 | (1) | (1) | +{{< /table >}} + +So far so bad. Have you spotted the problem? Remember what we want to achieve? Reset the ESP32 and reboot in the download mode to write our program to the flash. This has to be done by following this sequence: +- Pull `EN` low +- Pull `GPIO0` low while releasing `EN` + +And since **of course** we **do** read the f... manual, we know that `GPIO0` needs to be pulled down from at least the moment `EN` reaches `$ V_{IL\_\overline{RST}} = 0.6\,\text{V}$` for at least `$1\,\text{ms}$`. So a problem occures when we transition from state `10` to state `01`. Imagine we could switch {{< overlinecode RTS >}} and {{< overlinecode DTR >}} in no time. In this hypothetical case everything would be fine. The same moment the `EN` line goes high and enables the chip, the `GPIO0` line goes low and select the download boot mode. But in reality sometimes things are bad and in this case *bad* means, {{< overlinecode RTS >}} and {{< overlinecode DTR >}} will change their levels sequentially. It does not matter in which order we switch these lines. The transition order would bei `10 -> 11 -> 01` or `10 -> 00 -> 01` and state `00` and `11` both produce the same output, where the ESP32 is enabled but `GPIO0` is not pulled down to select the download boot mode. + +Fortunately, the solution to this problem is quite simple. We place a capacitor between `EN` and `GND` in parallel to the pullup resistor. This RC-Circuit slows down the rise of the `EN` voltage level `$V_{EN}$` as follows `\[V_{EN}(t) = V_{\textrm{CC}}\left(1-e^{-\frac{t}{RC}}\right)\]` where `$V_{CC}$` is the supply voltage, `$R$` the resistance of the pull-up resistor and `$C$` the capacitance of the afore mentioned capacitor. + +The procedure has been recorded with an oscilloscpe and is depicted in {{< figref plot >}}. As soon as the `esptool` script aquires the serial port, `RTS` and `DTR` are set to `true` which means {{< overlinecode RTS >}} and {{< overlinecode DTR >}} are `false` or low obviously. This point in time is marked as `$t_{\textrm{0}}$`. + +{{< plotly id="plot" src="esp32-bootmode-selection" caption="This is some caption" >}} + +To reset the ESP32 the script executes the following code at `$t_{\textrm{1}}$`: + +~~~ python +self._setDTR(False) # IO0=HIGH +self._setRTS(True) # EN=LOW, chip in reset +time.sleep(0.1) +~~~ +The chip is held in reset state for `$100\,\textrm{ms}$`. Then the `esptool` toogles `DTR` and `RTS` sequentially at `$t_{\textrm{2}}$` + +~~~ python +self._setDTR(True) # IO0=LOW +self._setRTS(False) # EN=HIGH, chip out of reset +time.sleep(delay) # delay=0.05 +~~~ + +We can see, that the level of `EN` rises slowly with a very soft edge. This give the `esptool` enough time to make sure `GPIO0` is pulled down before the ESP32 starts to boot. Without the RC-Circuit `EN` would have a very steep edge at `$t_{\textrm{2}}$` and we would see a short high pulse in the `GPIO0` level in the upper plot in {{< figref plot >}}. This pulse would lead to the ESP32 selecting the normal and not the donwload bootmode. + +At `$t_{\textrm{3}}$` `DTR` gets released as well, which means we finally end up with both {{< overlinecode RTS >}} and {{< overlinecode DTR >}} beeing high and both controlled transistors are in high impedance mode. + +~~~ python +self._setDTR(False) # IO0=HIGH, done +~~~ diff --git a/layouts/partials/foot_custom.html b/layouts/partials/foot_custom.html index e69de29..0348fa0 100644 --- a/layouts/partials/foot_custom.html +++ b/layouts/partials/foot_custom.html @@ -0,0 +1,42 @@ +{{ if .Params.mathjax }} + + + + + +{{ end }} + +{{ if .Params.figref }} + + +{{ end }} diff --git a/layouts/shortcodes/centerfigure.html b/layouts/shortcodes/centerfigure.html new file mode 100644 index 0000000..31c0912 --- /dev/null +++ b/layouts/shortcodes/centerfigure.html @@ -0,0 +1,10 @@ +
+
+ +
+ {{ with (.Get "caption") -}} +
{{ . }}
+ {{- end }} +
diff --git a/layouts/shortcodes/figref.html b/layouts/shortcodes/figref.html new file mode 100644 index 0000000..0a8fb72 --- /dev/null +++ b/layouts/shortcodes/figref.html @@ -0,0 +1 @@ + diff --git a/layouts/shortcodes/overline.html b/layouts/shortcodes/overline.html new file mode 100644 index 0000000..1b8d350 --- /dev/null +++ b/layouts/shortcodes/overline.html @@ -0,0 +1 @@ +{{ .Get 0 }} diff --git a/layouts/shortcodes/overlinecode.html b/layouts/shortcodes/overlinecode.html new file mode 100644 index 0000000..f5ff8dc --- /dev/null +++ b/layouts/shortcodes/overlinecode.html @@ -0,0 +1 @@ +{{ .Get 0 }} diff --git a/layouts/shortcodes/plotly.html b/layouts/shortcodes/plotly.html new file mode 100644 index 0000000..5e79b39 --- /dev/null +++ b/layouts/shortcodes/plotly.html @@ -0,0 +1,7 @@ +{{ $r := resources.Get (printf "plotly/%s.html" ($.Get "src")) }} +
+{{ $r.Content | safeHTML }} + {{- with (.Get "caption") -}} +
{{ . }}
+ {{- end }} +
diff --git a/layouts/shortcodes/table.html b/layouts/shortcodes/table.html index c1991d9..8af73ac 100644 --- a/layouts/shortcodes/table.html +++ b/layouts/shortcodes/table.html @@ -1,6 +1,6 @@ {{ $htmlTable := .Inner | markdownify }} {{ $class := .Get 0 }} {{ $old := "" }} -{{ $new := printf "
" $class }} +{{ $new := printf "
" $class }} {{ $htmlTable := replace $htmlTable $old $new }} -{{ $htmlTable | safeHTML }} \ No newline at end of file +{{ $htmlTable | safeHTML }} diff --git a/static/css/fonts.css b/static/css/fonts.css index b39a9c1..73e353f 100644 --- a/static/css/fonts.css +++ b/static/css/fonts.css @@ -3,5 +3,5 @@ body { } code { font-family: "DejaVu Sans Mono", monospace; - /* font-size: 85%; */ + font-size: 85%; } diff --git a/static/css/style.css b/static/css/style.css index 59596ae..5124f2d 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -6,17 +6,33 @@ body { } /* header and footer areas */ -.menu { padding: 0; } -.menu li { display: inline-block; } +.menu { + padding: 0; +} + +.menu li { + display: inline-block; +} + .article-meta, .menu a { text-decoration: none; background: #eee; padding: 5px; border-radius: 5px; } -.menu, .article-meta, footer { text-align: center; } -.title { font-size: 1.1em; } -footer a { text-decoration: none; } + +.menu, .article-meta, footer { + text-align: center; +} + +.title { + font-size: 1.1em; +} + +footer a { + text-decoration: none; +} + hr { border-style: dashed; color: #ddd; @@ -29,6 +45,7 @@ pre { padding: 1em; overflow-x: auto; } + code { background: #afb8c133; padding-left: 5px; @@ -37,11 +54,20 @@ code { padding-bottom: 3px; border-radius: 6px } -pre code { background: none; } + +pre code { + background: none; +} /* misc elements */ -img, iframe, video { max-width: 100%; } -main { hyphens: auto; } +img, iframe, video { + max-width: 100%; +} + +main { + hyphens: auto; +} + blockquote { background: #f9f9f9; border-left: 5px solid #ccc; @@ -50,9 +76,43 @@ blockquote { table { margin: auto; - border-top: 1px solid #666; +} + +table thead th { border-bottom: 1px solid #666; } -table thead th { border-bottom: 1px solid #ddd; } -th, td { padding: 5px; } -thead, tfoot, tr:nth-child(even) { background: #eee; } + +th, td { + padding: 5px; + text-align: center; +} + +/* tr:nth-child(even) { + background: #f0f0f0; +} */ + +figcaption { + font: italic smaller sans-serif; + padding: 3px; + text-align: center; +} + +figure { + /* border: #666 solid; */ + display: flex; + flex-flow: column; + padding: 5px; + margin: auto; + text-align: center; +} + +html, body { + scroll-padding-top: 100px; +} + +code.has-jax { + font: inherit; + font-size: 100%; + background: inherit; + border: inherit; +} diff --git a/static/images/esp32-bootmode-circuit.png b/static/images/esp32-bootmode-circuit.png new file mode 100644 index 0000000000000000000000000000000000000000..b2b4987a5bb09eb8990c075efc281359bd00984a GIT binary patch literal 28007 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