First, we’ll walk through the HW setup. More specifically, the portion of the diagram below that connects the two green boxes and the USB connection from the Host System to the FT232. This is a fairly simple setup. The HW consists of the Raspberry Pi 4, a FT232H breakout board, 6 jumper wires and a USB-C cable.
** WARNING **: There should be no power connected to the Raspberry Pi 4 and NO USB connected to the FT232 board while hooking up the Jumper wires. Hook these up first. This will be safer for you and the HW. There are no high voltages here, but doing this with the power off is always a good idea.
Probably the most complicated part of this is soldering the pin headers onto the FT232 board. However, I will not cover the soldering of the pin headers.
The headers can be oriented toward either side of the board. The picture below is my setup. I put the headers ‘under side’ of the board and mounted the board in a ‘dead roach’ configuration (on its back with the pins/legs up). Installing the FT232 board on a breadboard is another option you might consider. In this photo, the raspberry pi is mounted on an oak plank and the FT232 board is held in place with standoffs.

The HW setup is simply connecting the 6 jumper wires from the FT232 Breakout board to the Raspberry Pi 4. From the Table below we are hooking up the following
- D0 to Pin 22 RPI4 J8
- D1 to Pin 37 RPI4 J8
- D2 to Pin 18 RPI4 J8
- D3 to Pin 13 RPI4 J8
- C0 to Pin 15 RPI4 J8
- GND to Pin 39 RPI4 J8

Once again, you should do this before connecting power or a USB cable.
| AdaFruit Board PIN Name | FT232H Pin Name | JTAG Function | RPI 4 GPIO | RPI 4 J8 Pin |
| D0 | ADBUS0 | TCK | GPIO 25 | Pin 22 |
| D1 | ADBUS1 | TDI | GPIO 26 | Pin 37 |
| D2 | ADBUS2 | TD0 | GPIO 24 | Pin 18 |
| D3 | ADBUS3 | TMS | GPIO 27 | Pin 13 |
| D4 | ADBUS4 | GPIO | Not Connected | |
| D5 | ADBUS5 | GPIO | Not Connected | |
| D6 | ADBUS6 | GPIO | Not Connected | |
| D7 | ADBUS7 | GPIO | Not Connected | |
| C0 | ACBUS0 | /TRST | GPIO 22 | Pin 15 |
| C1 | ACBUS1 | /SRST | No Connected | |
| C2 | ACBUS2 | GPIO | Not Connected | |
| C3 | ACBUS3 | GPIO | Not Connected | |
| C4 | ACBUS4 | GPIO | Not Connected | |
| C5 | ACBUS5 | GPIO | Not Connected | |
| C6 | ACBUS6 | GPIO | Not Connected | |
| C7 | ACBUS7 | GPIO | Not Connected | |
| C8 | ACBUS8 | func defined | Not Connected | |
| C9 | ACBUS9 | func defined | Not Connected | |
| GND | GND | GND | GND | Pin 39 |
Once these 6 wires are connected, you can connect USB-C cable between the FT232 and your PC. The AdaFruit FT232 board has two sockets on it, the image blow is of the USB-C connector.

Although the FT232 uses a USB-C connector, this is just a regular USB connection and you can use a USB-C to USB-C or USB-C to USB-A cable. Connecting the cable to your computer should be something you are already comfortable with.
Here is another image of my setup with the USB attached.

For information about connecting power to the Raspberry Pi 4, please consult the documentation that came with your Raspberry Pi 4.



Many embedded systems must react or respond to events in a well defined, limited amount of time. We call these real-time computing systems. While efficient code design is always important, most computer programs do not face real-time constraints. For most applications, the exact execution time does not define success or failure as long as the program generates the expected results. If a block of code executes in X milliseconds or Y milliseconds, as long as the code provides the correct output. For example, most users don’t care if a disc drive system responds to a read request in 0.5 milliseconds or 0.55 milliseconds, as long as the program returns the correct data. Similarly, if your embedded system is monitoring the temperature of a cooler and turning on and off a refrigeration system to maintain temperature, it probably doesn’t matter if the control system checks the temperature every 5 seconds or every 10 seconds.
Ask John or Jane Doe off the street for a definition of Bare Metal and you would likely hear about AC/DC crossed with the Full Monte. In embedded systems parlance, Bare Metal refers to systems that run on the hardware platform without the support of a commercial operating system. Bare Metal systems make up the vast majority of applications in the real world. Running programs native on the CPU or micro-controller creates some interesting challenges that developers don’t face when they have the support of an operating system.
For some who are new to bare metal, this may sound like an existential philosophical question, but trust me, it’s not. In fact, this is a question that I often use as an interview question. Or maybe better said, what happens and what needs to happen before main(). While some details are platform-dependent, the process is similar for most systems. After power-up, the processor starts execution at some known address. In ARM’s case, it starts by securing the reset exception/reset vector and runs the code at that program address.
The CPU or micro-controller in any embedded system provides the foundation for the entire design. The selection must satisfy all the design requirements listed in the Introduction. There are literally thousands of options for CPUs. Designers typically pay close attention to new offerings from chip manufacturers.
Firmware is a hardware-specific program that is closely coupled to the hardware and essential for proper operation of the system. It is stored on the hardware portion of the system and is loaded when the system is powered on. The firmware programs must be compiled (translated) into chip level instructions (machine code) that is specific to the hardware platform. Because we are talking about compact systems optimized for a specific application, the firmware typically only contains the logic required to complete the required task. 
Let’s be honest, for most, the phrase Embedded System does not elicit much excitement…which is unfortunate. This somewhat sterile term is used to describe a broad category of computer applications that are an integral part of our everyday lives. For me, embedded systems represent some of the most exciting computer engineering applications where the proverbial computing ‘rubber’ hits the real-world ‘road.’