Bluepill Page: Difference between revisions

From bibbleWiki
Jump to navigation Jump to search
(Created page with "=Introduction= This page is for the STM32F103C8T6 or Bluepill =Counterfeit Pills= Most of the boards bought of Aliexpress are fake and as such have issues. The ST-Link v2 appears to have issues. =Arduino IDE= To get these to work in Arduino I needed to follow the guides which refer to using https://dan.drown.org/stm32duino/package_STM32duino_index.json This is added to the Additional Board Manager URL and allows you to use '''Generic STM32F103C6/fake STM32F103C8'''...")
 
Line 66: Line 66:
}
}
</syntaxhighlight>
</syntaxhighlight>
==Cargo==
Here is the toml on the 20-Jan-2024, thanks Mikhail
<syntaxhighlight lang="toml">
[package]
name = "rustpill"
version = "0.1.0"
authors = ["Mikhail Perov <bthkn@icloud.com>"]
edition = "2021"
description = "Rust STM32 hello world"
[dependencies]
cortex-m = "0.7.2"
cortex-m-rt = "0.7.3"
cortex-m-semihosting = "0.5.0"
embedded-hal = "1.0.0"
nb = "1.0.0"
panic-halt = "0.2.0"
[dependencies.stm32f1xx-hal]
version = "0.10.0"
features = ["rt", "stm32f103", "medium"]
</syntaxhighlight>
==Memory.x==
Possibly the reason it did not work previously but either way the FLASH and RAM have been change to cater for the fact this is a conterfeit
<syntaxhighlight lang="txt">
/* STM32F103C8T6 */
MEMORY
{
  FLASH : ORIGIN = 0x08000000, LENGTH = 32K
  RAM : ORIGIN = 0x20000000, LENGTH = 10K
}
/* This is where the call stack will be allocated. */
/* The stack is of the full descending type. */
/* NOTE Do NOT modify `_stack_start` unless you know what you are doing */
/* _stack_start = ORIGIN(RAM) + LENGTH(RAM); */
</syntaxhighlight>
==Cargo Config==
<syntaxhighlight lang="toml">
[target.thumbv7m-none-eabi]
runner = "arm-none-eabi-gdb -x openocd.gdb"
rustflags = [
  # LLD (shipped with the Rust toolchain) is used as the default linker
  "-C", "link-arg=-Tlink.x",
]
[build]
target = "thumbv7m-none-eabi" # Cortex-M3
</syntaxhighlight>
==Running===
Here is my openocd config
<syntaxhighlight lang="tcl">
# This is an genericBoard board with a single STM32F103C6Tx chip
#
# Generated by STM32CubeIDE
# Take care that such file, as generated, may be overridden without any early notice. Please have a look to debug launch configuration setup(s)
source [find interface/stlink-dap.cfg]
set WORKAREASIZE 0x2800
transport select "dapdirect_swd"
set CHIPNAME STM32F103C6Tx
set BOARDNAME genericBoard
# Enable debug when in low power modes
set ENABLE_LOW_POWER 1
# Stop Watchdog counters when halt
set STOP_WATCHDOG 1
# STlink Debug clock frequency
set CLOCK_FREQ 4000
# Reset configuration;shutdown"
# use software system reset if reset done
reset_config none
set CONNECT_UNDER_RESET 0
set CORE_RESET 0
# ACCESS PORT NUMBER
set AP_NUM 0
# GDB PORT
set GDB_PORT 3333
# BCTM CPU variables
source [find target/stm32f1x.cfg]
</syntaxhighlight>
Plug in the ST-Link v2 and to run the example (remember not much flash)
    cargo build --release
    cargo run --release
On the debugger you run
    openocd  -f start.cfg

Revision as of 05:23, 20 January 2024

Introduction

This page is for the STM32F103C8T6 or Bluepill

Counterfeit Pills

Most of the boards bought of Aliexpress are fake and as such have issues. The ST-Link v2 appears to have issues.

Arduino IDE

To get these to work in Arduino I needed to follow the guides which refer to using

   https://dan.drown.org/stm32duino/package_STM32duino_index.json

This is added to the Additional Board Manager URL and allows you to use Generic STM32F103C6/fake STM32F103C8

Rust

Took a while to get this going. It is quite easy once you know.

Code

//! Blinks an LED
//!
//! This assumes that a LED is connected to pc13 as is the case on the blue pill board.
//!
//! Note: Without additional hardware, PC13 should not be used to drive an LED, see page 5.1.2 of
//! the reference manual for an explanation. This is not an issue on the blue pill.

#![deny(unsafe_code)]
#![no_std]
#![no_main]

use panic_halt as _;

use nb::block;

use cortex_m_rt::entry;
use stm32f1xx_hal::{pac, prelude::*, timer::Timer};

#[entry]
fn main() -> ! {
    // Get access to the core peripherals from the cortex-m crate
    let cp = cortex_m::Peripherals::take().unwrap();
    // Get access to the device specific peripherals from the peripheral access crate
    let dp = pac::Peripherals::take().unwrap();

    // Take ownership over the raw flash and rcc devices and convert them into the corresponding
    // HAL structs
    let mut flash = dp.FLASH.constrain();
    let rcc = dp.RCC.constrain();

    // Freeze the configuration of all the clocks in the system and store the frozen frequencies in
    // `clocks`
    let clocks = rcc.cfgr.freeze(&mut flash.acr);

    // Acquire the GPIOC peripheral
    let mut gpioc = dp.GPIOC.split();

    // Configure gpio C pin 13 as a push-pull output. The `crh` register is passed to the function
    // in order to configure the port. For pins 0-7, crl should be passed instead.
    let mut led = gpioc.pc13.into_push_pull_output(&mut gpioc.crh);
    // Configure the syst timer to trigger an update every second
    let mut timer = Timer::syst(cp.SYST, &clocks).counter_hz();
    timer.start(1.Hz()).unwrap();

    // Wait for the timer to trigger an update and change the state of the LED
    loop {
        block!(timer.wait()).unwrap();
        block!(timer.wait()).unwrap();
        block!(timer.wait()).unwrap();
        led.set_high();
        block!(timer.wait()).unwrap();
        led.set_low();
    }
}

Cargo

Here is the toml on the 20-Jan-2024, thanks Mikhail

[package]
name = "rustpill"
version = "0.1.0"
authors = ["Mikhail Perov <bthkn@icloud.com>"]
edition = "2021"
description = "Rust STM32 hello world"

[dependencies]
cortex-m = "0.7.2"
cortex-m-rt = "0.7.3"
cortex-m-semihosting = "0.5.0"
embedded-hal = "1.0.0"
nb = "1.0.0"
panic-halt = "0.2.0"

[dependencies.stm32f1xx-hal]
version = "0.10.0"
features = ["rt", "stm32f103", "medium"]

Memory.x

Possibly the reason it did not work previously but either way the FLASH and RAM have been change to cater for the fact this is a conterfeit

/* STM32F103C8T6 */
MEMORY
{
  FLASH : ORIGIN = 0x08000000, LENGTH = 32K
  RAM : ORIGIN = 0x20000000, LENGTH = 10K
}

/* This is where the call stack will be allocated. */
/* The stack is of the full descending type. */
/* NOTE Do NOT modify `_stack_start` unless you know what you are doing */
/* _stack_start = ORIGIN(RAM) + LENGTH(RAM); */

Cargo Config

[target.thumbv7m-none-eabi]
runner = "arm-none-eabi-gdb -x openocd.gdb"

rustflags = [
  # LLD (shipped with the Rust toolchain) is used as the default linker
  "-C", "link-arg=-Tlink.x",
]

[build] 
target = "thumbv7m-none-eabi" # Cortex-M3

Running=

Here is my openocd config

# This is an genericBoard board with a single STM32F103C6Tx chip
#
# Generated by STM32CubeIDE
# Take care that such file, as generated, may be overridden without any early notice. Please have a look to debug launch configuration setup(s)

source [find interface/stlink-dap.cfg]


set WORKAREASIZE 0x2800

transport select "dapdirect_swd"

set CHIPNAME STM32F103C6Tx
set BOARDNAME genericBoard

# Enable debug when in low power modes
set ENABLE_LOW_POWER 1

# Stop Watchdog counters when halt
set STOP_WATCHDOG 1

# STlink Debug clock frequency
set CLOCK_FREQ 4000

# Reset configuration;shutdown"
# use software system reset if reset done
reset_config none
set CONNECT_UNDER_RESET 0
set CORE_RESET 0

# ACCESS PORT NUMBER
set AP_NUM 0
# GDB PORT
set GDB_PORT 3333

# BCTM CPU variables

source [find target/stm32f1x.cfg]

Plug in the ST-Link v2 and to run the example (remember not much flash)

   cargo build --release 
   cargo run --release

On the debugger you run

   openocd   -f start.cfg