Source: ESP32-C3 datasheet
Electronics
How much RAM does the ESP32-C3 have?
The ESP32-C3 has 400 kBytes of integrated SRAM (16 kbytes cache).
Source: ESP32-C3 datasheet
Teensy 4.x timer interrupt example using TimerTree
void myTimerInterrupt() { // TODO Your code goes here // The following functions may be useful here: // Timer3.start(); // Start counting & clear counter // Timer3.stop(); // => stop counting but do not clear counter // Timer3.restart(); // => clear counter // Timer3.resume(); // => Start, without clearing counter } void setup() { Timer3.initialize(20000); Timer3.attachInterrupt(myTimerInterrupt); Timer3.start(); }
How to Arduino attachInterrupt() with both RISING and FALLING edge
You can use attachInterupt()
with CHANGE
to trigger on both RISING
and FALLING
flanks.
#define INTERRUPT_PIN 13 // Choose any pin with interrupt functionality here. void myInterrupt() { // TODO Your code goes here. } void setup() { attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), myInterrupt, CHANGE); }
Teensy 4.1 Arduino external interrupt (pin interrupt) minimal example
In setup()
, use
attachInterrupt(digitalPinToInterrupt(23), myInterrupt, RISING);
to configure the interrupt on Teensy Pin 23
on the RISING
edge.
Add this function, which will be called during the interrupt:
void myInterrupt() { // Your code goes here }
PyVISA Rigol DL3021 via LXI (TCP SCPI) example
First install using
sudo pip install pyvisa pyvisa-py
The following example will connec to a LXI-enabled (license required!!!) DL3021 at IP address 192.168.178.31
import pyvisa import time rm = pyvisa.ResourceManager() inst = rm.open_resource("TCPIP0::192.168.178.112::INSTR") # Query if instrument is present # Prints e.g. "RIGOL TECHNOLOGIES,DL3021,DL3A204800938,00.01.05.00.01" print(inst.query("*IDN?")) # Set to constant resistance mode inst.write(":SOURCE:FUNCTION RESISTANCE") # Set to 3 Ohms inst.write(":SOURCE:RESISTANCE:LEVEL:IMMEDIATE 3.0") # Enable electronic load inst.write(":SOURCE:INPUT:STATE On") # Wait for value to stabilize time.sleep(2) # Measure! print("Voltage: ", inst.query(":MEASURE:VOLTAGE?").strip()) print("Current: ", inst.query(":MEASURE:CURRENT?").strip()) print("Power: ", inst.query(":MEASURE:POWER?").strip())
This will print, for example:
RIGOL TECHNOLOGIES,DL3021,DL3A204800938,00.01.05.00.01 Voltage: 2.885810 Current: 0.961862 Power: 2.775752
with some power supply attached of course.
Where to find SCPI / LXI commands for the Rigol DL3021?
See the Rigol DL3000 programming manual.
How to fix st-flash ERROR common.c: stlink_flash_loader_run(0x8000000) failed! == -1
Problem:
While flashing an STM32 using st-flash
using a command like
st-flash write build/firmware.bin 0x8000000
you see an error message like
2022-02-12T01:31:34 ERROR flash_loader.c: flash loader run error 2022-02-12T01:31:34 ERROR common.c: stlink_flash_loader_run(0x8000000) failed! == -1
See below for a full error log
Solution
Most likely your STM32 is locked (readout protection). Use OpenOCD to unlock it, see How to unlock STM32F0x using OpenOCD for an example. Adjust to your STM32 family as needed.
Full st-flash
log
st-flash 1.6.1 2022-02-12T01:31:34 INFO common.c: F0xx small: 4 KiB SRAM, 16 KiB flash in at least 1 KiB pages. file build/mom.bin md5 checksum: da211df7131de9de15f3b6c7a96176dd, stlink checksum: 0x000d0d03 2022-02-12T01:31:34 INFO common.c: Attempting to write 11108 (0x2b64) bytes to stm32 address: 134217728 (0x8000000) 2022-02-12T01:31:34 INFO common.c: Flash page at addr: 0x08000000 erased 2022-02-12T01:31:34 INFO common.c: Flash page at addr: 0x08000400 erased 2022-02-12T01:31:34 INFO common.c: Flash page at addr: 0x08000800 erased 2022-02-12T01:31:34 INFO common.c: Flash page at addr: 0x08000c00 erased 2022-02-12T01:31:34 INFO common.c: Flash page at addr: 0x08001000 erased 2022-02-12T01:31:34 INFO common.c: Flash page at addr: 0x08001400 erased 2022-02-12T01:31:34 INFO common.c: Flash page at addr: 0x08001800 erased 2022-02-12T01:31:34 INFO common.c: Flash page at addr: 0x08001c00 erased 2022-02-12T01:31:34 INFO common.c: Flash page at addr: 0x08002000 erased 2022-02-12T01:31:34 INFO common.c: Flash page at addr: 0x08002400 erased 2022-02-12T01:31:34 INFO common.c: Flash page at addr: 0x08002800 erased 2022-02-12T01:31:34 INFO common.c: Finished erasing 11 pages of 1024 (0x400) bytes 2022-02-12T01:31:34 INFO common.c: Starting Flash write for VL/F0/F3/F1_XL core id 2022-02-12T01:31:34 INFO flash_loader.c: Successfully loaded flash loader in sram 2022-02-12T01:31:34 ERROR flash_loader.c: flash loader run error 2022-02-12T01:31:34 ERROR common.c: stlink_flash_loader_run(0x8000000) failed! == -1 stlink_fwrite_flash() == -1
How to flash .bin to STM32 using st-flash
You can use st-flash
like this to flash a firmware file to the STM32:
st-flash write build/firmware.bin 0x8000000
How to lock STM32F0 using OpenOCD (readout protection)
openocd -f interface/stlink-v2.cfg -f target/stm32f0x.cfg -c "init" -c "halt" -c "stm32f1x lock 0" -c "reset halt" -c "exit"
This will activate flash readout protection level 1 which means you won’t be able to readout or re-write the flash. You can still perform a chip erase which will clear the readout protection – for example to flash a new firmware.
How to unlock STM32F0x using OpenOCD
openocd -f interface/stlink-v2.cfg -f target/stm32f0x.cfg -c "init" -c "halt" -c "stm32f1x unlock 0" -c "reset halt" -c "exit"
After that, you need to physically remove power from the device in order for the reset to take effect.
Note the stm32f1x
is no typo. OpenOCD uses the same backend for STM32F1x and STM32F0x.
Example output:
Open On-Chip Debugger 0.11.0-rc2 Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html WARNING: interface/stlink-v2.cfg is deprecated, please switch to interface/stlink.cfg Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'. Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD Info : clock speed 1000 kHz Info : STLINK V2J24S4 (API v2) VID:PID 0483:3748 Info : Target voltage: 3.296172 Info : stm32f0x.cpu: hardware has 4 breakpoints, 2 watchpoints Info : starting gdb server for stm32f0x.cpu on 3333 Info : Listening on port 3333 for gdb connections Info : device id = 0x10006444 Info : flash size = 16kbytes stm32x unlocked. INFO: a reset or power cycle is required for the new settings to take effect. Info : Unable to match requested speed 1000 kHz, using 950 kHz Info : Unable to match requested speed 1000 kHz, using 950 kHz target halted due to debug-request, current mode: Thread xPSR: 0xc1000000 pc: 0x080000c0 msp: 0x20000400
What pin pitch does the Raspberry Pi DSI display connector / cable have?
The Raspberry Pi DSI display connector (for example the DSI display cable that comes with the Raspberry Pi 7″ display) has a pin pitch of 1.0mm:
How to install tailscale on Raspberry Pi
Just use the official install command from the tailscale website:
curl -fsSL https://tailscale.com/install.sh | sh
Which way to mount the Raspberry Pi DSI display cable for the Raspberry Pi 7″ display
First, mount the Raspberry Pi on top of the display PCB on the back of the display.
On the bottom (display) PCB, the silver contacts of the cable should be at the top (facing the Raspberry Pi):
On the Raspberry Pi, the silver contacts should face towards the USB connectors:
Overall, it should look like this:
How to enable OctoPi WiFi connection on boot
First, install OctoPi to the SD card – for example, using rpi-imager
: How to install OctoPi using rpi-imager
Open the boot
partition on the OctoPi SD card and create a file wpa_supplicant.conf
there, with the following content:
country=de update_config=1 ctrl_interface=/var/run/wpa_supplicant network={ scan_ssid=1 ssid="MyWifi" psk="abc123abc" }
Always set the correct country code at the top ! If you don’t set it correctly, it won’t work!
Set ssid
to the name of the wireless network.
Set psk
to the wifi password.
How to install OctoPi using rpi-imager
First open rpi-imager
:
then select Choose OS
Sroll down to Other specific-purpose OS (do not click on Other general-purpose OS, even though it sounds similar!)
Click on Other specific-purpose OS:
Now click on 3D printing:
Click on OctoPi:
Now click on OctoPi (stable):
Now click on Choose Storage to select the SD card you want to write the image to:
Click on the correct device to select it – double check to make sure you have selected the correct device !
Now click Write to download the image and write it to the SD card:
and now grab a coffee since it will take a couple of minutes to write:
How long is the Raspberry Pi DSI display cable?
The DSI display cable that comes with the Raspberry Pi 7″ display is 10cm (100mm) long:
How many pins does the Raspberry Pi display DSI cable have?
The Rasbperry Pi DSI connector / cable has 15 pins:
How to enable Raspberry Pi (Raspbian) WiFi connection on boot
Open the boot
partition on the Rasbian SD card and create a file wpa_supplicant.conf
there, with the following content:
country=de update_config=1 ctrl_interface=/var/run/wpa_supplicant network={ scan_ssid=1 ssid="MyWifi" psk="abc123abc" }
Always set the country code at the top ! If you don’t set it correctly, it won’t work!
Set ssid
to the name of the wireless network.
Set psk
to the wifi password.
How to fix apt E: Unable to locate package rpi-imager
Problem:
While trying to install rpi-imager
using
sudo apt install rpi-imager
you see this error message:
Reading package lists... Done Building dependency tree Reading state information... Done No apt package "rpi-imager", but there is a snap with that name. Try "snap install rpi-imager" E: Unable to locate package rpi-imager
Solution:
sudo apt -y install rpi-imager
only works on Raspbian. On Ubuntu etc, you can install rpi-imager
using
sudo snap install rpi-imager
Then start it using
rpi-imager