libopencm3 and FreeRTOS projects using the STM32F103C8T6 MCU by Warren Gay
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Warren Gay f1a9d5d9e4
Merge pull request #12 from mikebern/fix-timer-registers
7 months ago
hse Minor corrections 1 year ago
hsi Should not be included 1 year ago
libopencm3 @ 3922cc7d3e Added missing subdir 1 year ago
mco_pll2 Minor corrections 1 year ago
miniblink Trimmed comments, modified 2 years ago
rtos added a reference (pull req url) for contex 8 months ago
stlink @ 8b5aad70d8 Renamed usbcust as usbbulk 2 years ago
uart Fixed to use C-style comments 2 years ago
uarthwfc Fixed to use C-style comments 2 years ago
.gitignore Ignore products of builds 2 years ago
.gitmodules Update 2 years ago
LICENSE Initial commit 2 years ago
Makefile Makefile: build only libopencm3_stm32f1.a 1 year ago
Makefile.incl Makefile.incl: use dependency files 1 year ago Added BOM 7 months ago
stm32f103c8t6.ld Initial 2 years ago

Project stm32f103c8t6

This is the source code for the book:

Beginning STM32 : Developing with FreeRTOS, libopencm3 and GCC

ISBN: 978-1-4842-3623-9 Soft cover
      978-1-4842-3624-6 eBook

This git repo contains libopencm3 and FreeRTOS+libopencm3 projects. This provides a ready development environment for those who want to apply the economical STM32F103 to using libopencm3 alone or in concert with FreeRTOS.


No Windows based IDE environments are used or implied! Cygwin, Linux, MacOS and *BSD environments are suitable.

This project exists to bring several components together in a manner that just works for the STM32F103.


The top level defines the environment common to libopencm3 mainly, and used by FreeRTOS builds in the ./rtos subdirectory.

At the top level directory, projects like ./miniblink use libopencm3 only (they do NOT use FreeRTOS).

The subdirectory ./rtos contains projects that do use FreeRTOS (and libopencm3).

    |- LICENSE
    |- libopencm3/          git submodule
    |- stm32f103c8t6.ld
    |- Makefile             makes all top-level projects
    |- Makefile.incl        rules for make file builds
    |- miniblink/           simple blink: libopencm3 only
    |   |- *                miniblink files
    |- uart/                UART example (no flow control)
    |   |- *        
    |- uarthwfc/            UART example with hardware flow control
        |- *
    |- rtos/                FreeRTOS projects
        |- FreeRTOSv10.0.0  Unzipped FreeRTOS sources (you create this)
        |- Makefile         Used for creating new rtos projects
        |- Makefile.rtos    Rules for rtos project builds
        |- src/
        |   |- *            Files used for project creation
        |- libwwg
        |   |- Makefile
        |   |- include/*.h
        |   |- src/*.c
        |   |- libwwg.a
        |- blinky           Test FreeRTOS project
        |   |- *            Blinky project related files
        |   |- rtos
        |       |- *        RTOS Support files for blinky
        |- uart3            Another project..
        |   |- *
        |   |- rtos
        |       |- *
        |- usbcdc           USB CDC Demo
            |- etc.


0a. It will be assumed here that you have your cross compiler
    toolchain installed. In Makefile.incl you'll see references
    to a PREFIX variable. This defaults to arm-none-eabi so that
    gcc for example will be arm-none-eabi-gcc etc. If your 
    prefix differs, edit Makefile.incl at the top level to
    match, or use the shell: export PREFIX=whatever

0b. It is also assumed that you have the st-link command installed
    on your system. You may need to download and install it. 
    Google is your friend.

1.  If you didn't use a --recursive git clone, then you need to make
    sure that libopencm3 is fetched now. From the top level apply
    one of:

        $ git submodule update --init --recursive   # First time

        $ git submodule update --recursive          # Subsequent

2.  Go into ./libopencm3 and type "make". This should build the 
    static libraries that will be needed. Any issues there should
    go to the libopencm3 community.

3.  For FreeRTOS, cd into ./rtos and unzip your FreeRTOS download
    there. It should create a subdirectory FreeRTOSv10.0.0 or 
    similar. If the release differs, you'll need to change the
    variable assignment in rtos/Makefile FREERTOS ?= ....
    to match, or use the shell: export FREERTOS=whatever

4.  Do NOT compile FreeRTOS, since portions of it will be copied
    to your project subdirectory for further customization. Each
    project is capable of running a different FreeRTOS configuration.

5.  At the top level, do a "make" so that the libwwg and other
    projects get built.  Do a "make clobber" first, if you need
    to rebuild.

All of this is explained in detail in the book.


After the prerequisites have been met:

Going into ./miniblink and:

$ make
$ make flash

should build and flash your example program. Flashing assumes the use of the st-link (v2) command.

Or go into ./rtos/blink:

$ make
$ make flash

will build your FreeRTOS blink example.

If you are encountering make errors, then try forcing the use of Gnu make (it may be installed as “gmake”).


1. cd ./rtos
2. make -f PROJECT=name
3. cd ./name
4. Tweak and build

See ./rtos/ for more details.


All files covered by this repo (except those copied from libopencm3 and FreeRTOS, or otherwise marked), are covered by the GNU Lesser General Public License Version 3. See the file named LICENSE.

Bill of Materials for Book:

  1. ST-Link V2 Programmer
  2. Breadboard
  3. Dupont (Jumper) Wires
  4. 0.1 uF Bypass caps (for use on breadboard)
  5. USB TTL serial adapter
  6. Power supply (on eBay MB102 Solderless Breadboard Power Supply Module 3.3 and 5V switchable)
  7. Small assortment of LEDs
  8. 220 ohm or SIP-9 resistor at 220 ohms for several LEDs
  9. Get 3 x STM32 units if you want to do the full CAN project, but you can skimp with two if necessary.
  10. Winbond W25Q32/W25Q64 flash chip (DIP)
  11. PCF8574 GPIO extender (DIP)
  12. OLED using SSD1306 controller (four wire SPI only, eBay)
  13. RC servo(s) and/or scope (to control a servo)
  14. RC servo controller(s) or 555 timer circuit to generate PWM to be read
  15. Optional: Scope for examining clock signals for one chapter