Bluepill Page

From bibbleWiki
Revision as of 05:16, 20 January 2024 by Iwiseman (talk | contribs) (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'''...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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();
    }
}