From bc91e3b4a62a71e33e4dcc83edcc95499bd240f5 Mon Sep 17 00:00:00 2001
From: Berthier Lemieux
Date: Sun, 14 Jun 2020 09:06:52 +0300
Subject: [PATCH 1/4] Updates
---
src/start/hardware.md | 8 ++++----
src/start/registers.md | 7 +++++--
2 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/src/start/hardware.md b/src/start/hardware.md
index ba339479..d8b23076 100644
--- a/src/start/hardware.md
+++ b/src/start/hardware.md
@@ -135,7 +135,7 @@ $ cat openocd.cfg
# interfaces. At any time only one interface should be commented out.
# Revision C (newer revision)
-source [find interface/stlink-v2-1.cfg]
+source [find interface/stlink.cfg]
# Revision A and B (older revisions)
# source [find interface/stlink-v2.cfg]
@@ -284,14 +284,14 @@ You can now exit GDB using the `quit` command.
```
Debugging now requires a few more steps so we have packed all those steps into a
-single GDB script named `openocd.gdb`.
+single GDB script named `openocd.gdb`. The file was created during the `cargo generate` step, and should work without any modifications. Let's have a peak:
``` console
$ cat openocd.gdb
```
``` text
-target remote :3333
+target extended-remote :3333
# print demangled symbols
set print asm-demangle on
@@ -309,7 +309,7 @@ load
stepi
```
-Now running ` -x openocd.gdb $program` will immediately connect GDB to
+Now running ` -x openocd.gdb target/thumbv7em-none-eabihf/debug/examples/hello` will immediately connect GDB to
OpenOCD, enable semihosting, load the program and start the process.
Alternatively, you can turn ` -x openocd.gdb` into a custom runner to make
diff --git a/src/start/registers.md b/src/start/registers.md
index 9ab16b64..63c892b9 100644
--- a/src/start/registers.md
+++ b/src/start/registers.md
@@ -22,12 +22,15 @@ You may well find that the code you need to access the peripherals in your micro
Let's look at the SysTick peripheral that's common to all Cortex-M based micro-controllers. We can find a pretty low-level API in the [cortex-m] crate, and we can use it like this:
```rust,ignore
+#![no_std]
+#![no_main]
use cortex_m::peripheral::{syst, Peripherals};
use cortex_m_rt::entry;
+extern crate panic_halt;
#[entry]
fn main() -> ! {
- let mut peripherals = Peripherals::take().unwrap();
+ let peripherals = Peripherals::take().unwrap();
let mut systick = peripherals.SYST;
systick.set_clock_source(syst::SystClkSource::Core);
systick.set_reload(1_000);
@@ -41,7 +44,7 @@ fn main() -> ! {
}
```
-The functions on the `SYST` struct map pretty closely to the functionality defined by the ARM Technical Reference Manual for this peripheral. There's nothing in this API about 'delaying for X milliseconds' - we have to crudely implement that ourselves using a `while` loop. Note that we can't access our `SYST` struct until we have called `Peripherals::take()` - this is a special routine that guarantees that there is only one `SYST` structure in our entire program. For more on that, see the [Peripherals] section.
+The code above will wait for 1000 milliseconds. The functions on the `SYST` struct map pretty closely to the functionality defined by the ARM Technical Reference Manual for this peripheral. There's nothing in this API about 'delaying for X milliseconds' - we have to crudely implement that ourselves using a `while` loop. Note that we can't access our `SYST` struct until we have called `Peripherals::take()` - this is a special routine that guarantees that there is only one `SYST` structure in our entire program. For more on that, see the [Peripherals] section.
[Peripherals]: ../peripherals/index.md
From 4a0b1022540962a80e695a83ff42f7d67a3a011f Mon Sep 17 00:00:00 2001
From: Berthier Lemieux
Date: Sun, 14 Jun 2020 10:10:27 +0300
Subject: [PATCH 2/4] Board crates
---
src/assets/crates.png | Bin 0 -> 11522 bytes
src/start/registers.md | 16 +++++++++++++---
2 files changed, 13 insertions(+), 3 deletions(-)
create mode 100644 src/assets/crates.png
diff --git a/src/assets/crates.png b/src/assets/crates.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5898301de7bf69a9ad75a311f5a2cbb0c17bb95
GIT binary patch
literal 11522
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⪻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
mNdVdq)DF>7@aw+-
+
+
* Micro-architecture Crate - This sort of crate handles any useful routines common to the processor core your microcontroller is using, as well as any peripherals that are common to all micro-controllers that use that particular type of processor core. For example the [cortex-m] crate gives you functions to enable and disable interrupts, which are the same for all Cortex-M based micro-controllers. It also gives you access to the 'SysTick' peripheral included with all Cortex-M based micro-controllers.
* Peripheral Access Crate (PAC) - This sort of crate is a thin wrapper over the various memory-wrapper registers defined for your particular part-number of micro-controller you are using. For example, [tm4c123x] for the Texas Instruments Tiva-C TM4C123 series, or [stm32f30x] for the ST-Micro STM32F30x series. Here, you'll be interacting with the registers directly, following each peripheral's operating instructions given in your micro-controller's Technical Reference Manual.
@@ -15,9 +18,17 @@ You may well find that the code you need to access the peripherals in your micro
[embedded-hal]: https://crates.io/crates/embedded-hal
[Portability]: ../portability/index.md
[F3]: https://crates.io/crates/f3
+[Discovery]: https://rust-embedded.github.io/discovery/
+## Board Crate
-## Starting at the bottom
+A board crate is the perfect starting point, if you're new to embedded Rust. They nicely abstracts the HW details that might be overwelming when starting studying this subject, and makes standard tasks easy, like turning a LED on or off. The functionality they exposes varies a lot between boards. Since this book aims at staying hardware agnostic, the board crates won't be covered by this book.
+
+If you want to experiment with the STM32F3DISCOVERY board, it is highly recommmand to take a look at the [F3] board crate, which provides functionality to blink the board LEDs, access its compass, bluetooth and more. The [Discovery] book offers a great introduction to the [F3] board crate.
+
+But if you're working on a system that doesn't yet have dedicated board crate, or you need functionality not provided by existing crates, read on as we start from the bottom, with the micro-architecture crates.
+
+## Micro-architecture crate
Let's look at the SysTick peripheral that's common to all Cortex-M based micro-controllers. We can find a pretty low-level API in the [cortex-m] crate, and we can use it like this:
@@ -43,8 +54,7 @@ fn main() -> ! {
loop {}
}
```
-
-The code above will wait for 1000 milliseconds. The functions on the `SYST` struct map pretty closely to the functionality defined by the ARM Technical Reference Manual for this peripheral. There's nothing in this API about 'delaying for X milliseconds' - we have to crudely implement that ourselves using a `while` loop. Note that we can't access our `SYST` struct until we have called `Peripherals::take()` - this is a special routine that guarantees that there is only one `SYST` structure in our entire program. For more on that, see the [Peripherals] section.
+The functions on the `SYST` struct map pretty closely to the functionality defined by the ARM Technical Reference Manual for this peripheral. There's nothing in this API about 'delaying for X milliseconds' - we have to crudely implement that ourselves using a `while` loop. Note that we can't access our `SYST` struct until we have called `Peripherals::take()` - this is a special routine that guarantees that there is only one `SYST` structure in our entire program. For more on that, see the [Peripherals] section.
[Peripherals]: ../peripherals/index.md
From 95559087c442d9ed0f945898f827be4a3a93fcb4 Mon Sep 17 00:00:00 2001
From: Berthier Lemieux
Date: Mon, 15 Jun 2020 22:20:07 +0300
Subject: [PATCH 3/4] Fixed comments from review
---
src/start/registers.md | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/start/registers.md b/src/start/registers.md
index ef1a104b..1bb80daf 100644
--- a/src/start/registers.md
+++ b/src/start/registers.md
@@ -10,21 +10,21 @@ You may well find that the code you need to access the peripherals in your micro
* Micro-architecture Crate - This sort of crate handles any useful routines common to the processor core your microcontroller is using, as well as any peripherals that are common to all micro-controllers that use that particular type of processor core. For example the [cortex-m] crate gives you functions to enable and disable interrupts, which are the same for all Cortex-M based micro-controllers. It also gives you access to the 'SysTick' peripheral included with all Cortex-M based micro-controllers.
* Peripheral Access Crate (PAC) - This sort of crate is a thin wrapper over the various memory-wrapper registers defined for your particular part-number of micro-controller you are using. For example, [tm4c123x] for the Texas Instruments Tiva-C TM4C123 series, or [stm32f30x] for the ST-Micro STM32F30x series. Here, you'll be interacting with the registers directly, following each peripheral's operating instructions given in your micro-controller's Technical Reference Manual.
* HAL Crate - These crates offer a more user-friendly API for your particular processor, often by implementing some common traits defined in [embedded-hal]. For example, this crate might offer a `Serial` struct, with a constructor that takes an appropriate set of GPIO pins and a baud rate, and offers some sort of `write_byte` function for sending data. See the chapter on [Portability] for more information on [embedded-hal].
-* Board Crate - These crates go one step further than a HAL Crate by pre-configuring various peripherals and GPIO pins to suit the specific developer kit or board you are using, such as [F3] for the STM32F3DISCOVERY board.
+* Board Crate - These crates go one step further than a HAL Crate by pre-configuring various peripherals and GPIO pins to suit the specific developer kit or board you are using, such as [stm32f3-discovery] for the STM32F3DISCOVERY board.
[cortex-m]: https://crates.io/crates/cortex-m
[tm4c123x]: https://crates.io/crates/tm4c123x
[stm32f30x]: https://crates.io/crates/stm32f30x
[embedded-hal]: https://crates.io/crates/embedded-hal
[Portability]: ../portability/index.md
-[F3]: https://crates.io/crates/f3
+[stm32f3-discovery]: https://crates.io/crates/stm32f3-discovery
[Discovery]: https://rust-embedded.github.io/discovery/
## Board Crate
A board crate is the perfect starting point, if you're new to embedded Rust. They nicely abstracts the HW details that might be overwelming when starting studying this subject, and makes standard tasks easy, like turning a LED on or off. The functionality they exposes varies a lot between boards. Since this book aims at staying hardware agnostic, the board crates won't be covered by this book.
-If you want to experiment with the STM32F3DISCOVERY board, it is highly recommmand to take a look at the [F3] board crate, which provides functionality to blink the board LEDs, access its compass, bluetooth and more. The [Discovery] book offers a great introduction to the [F3] board crate.
+If you want to experiment with the STM32F3DISCOVERY board, it is highly recommmand to take a look at the [stm32f3-discovery] board crate, which provides functionality to blink the board LEDs, access its compass, bluetooth and more. The [Discovery] book offers a great introduction to the use of a board crate.
But if you're working on a system that doesn't yet have dedicated board crate, or you need functionality not provided by existing crates, read on as we start from the bottom, with the micro-architecture crates.
@@ -37,7 +37,7 @@ Let's look at the SysTick peripheral that's common to all Cortex-M based micro-c
#![no_main]
use cortex_m::peripheral::{syst, Peripherals};
use cortex_m_rt::entry;
-extern crate panic_halt;
+use panic_halt as _;
#[entry]
fn main() -> ! {
@@ -66,7 +66,7 @@ We won't get very far with our embedded software development if we restrict ours
#![no_std]
#![no_main]
-extern crate panic_halt; // panic handler
+use panic_halt as _;
use cortex_m_rt::entry;
use tm4c123x;
@@ -142,7 +142,7 @@ Let's see an example:
#![no_std]
#![no_main]
-extern crate panic_halt; // panic handler
+use panic_halt as _;
use cortex_m_rt::entry;
use tm4c123x_hal as hal;
From 4920c17ebd9196990ac3695c9036de0044343587 Mon Sep 17 00:00:00 2001
From: Berthier Lemieux
Date: Tue, 16 Jun 2020 08:41:45 +0300
Subject: [PATCH 4/4] Removed surperflous newline.
---
src/start/registers.md | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/start/registers.md b/src/start/registers.md
index b43b36fa..7540e60b 100644
--- a/src/start/registers.md
+++ b/src/start/registers.md
@@ -66,7 +66,6 @@ We won't get very far with our embedded software development if we restrict ours
#![no_std]
#![no_main]
-
use panic_halt as _; // panic handler
use cortex_m_rt::entry;