commit
						d3bba80288
					
				@ -0,0 +1,39 @@ | 
				
			||||
# Temporary files | 
				
			||||
 | 
				
			||||
*.bak | 
				
			||||
*.lnp | 
				
			||||
*.iex | 
				
			||||
*.hex | 
				
			||||
*.elf | 
				
			||||
*.axf | 
				
			||||
*.htm | 
				
			||||
*.lnp | 
				
			||||
*.lst | 
				
			||||
*.plg | 
				
			||||
*.tra | 
				
			||||
*.o | 
				
			||||
*.map | 
				
			||||
*.d | 
				
			||||
*.dep | 
				
			||||
*.disasm | 
				
			||||
*.bin | 
				
			||||
*.log | 
				
			||||
 | 
				
			||||
*.pro.* | 
				
			||||
 | 
				
			||||
# Backup files | 
				
			||||
 | 
				
			||||
*.bak | 
				
			||||
*~ | 
				
			||||
 | 
				
			||||
# Keil temporary files | 
				
			||||
 | 
				
			||||
*.uvguix.* | 
				
			||||
/RTE/ | 
				
			||||
 | 
				
			||||
# DS-5 temporary files | 
				
			||||
 | 
				
			||||
/.externalToolBuilders | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/trash/ | 
				
			||||
@ -0,0 +1,143 @@ | 
				
			||||
DEFS		= -DSTM32L1
 | 
				
			||||
 | 
				
			||||
FP_FLAGS	?= -msoft-float
 | 
				
			||||
ARCH_FLAGS	= -mthumb -mcpu=cortex-m3 $(FP_FLAGS) -mfix-cortex-m3-ldrd
 | 
				
			||||
 | 
				
			||||
LDSCRIPT    = stm32l100rc.ld
 | 
				
			||||
 | 
				
			||||
################################################################
 | 
				
			||||
 | 
				
			||||
# Main file
 | 
				
			||||
BINARY      = main
 | 
				
			||||
 | 
				
			||||
INCL_DIRS   = . lib source
 | 
				
			||||
SRC_DIR     = source
 | 
				
			||||
 | 
				
			||||
STARTUP_SCRIPT = startup_stm32l100xc.s
 | 
				
			||||
 | 
				
			||||
OBJS += $(BINARY).o $(STARTUP_SCRIPT:.s=.o)
 | 
				
			||||
OBJS += lib/gpio.o
 | 
				
			||||
OBJS += lib/systick.o
 | 
				
			||||
 | 
				
			||||
################################################################
 | 
				
			||||
 | 
				
			||||
JUNK            = *.o *.d *.elf *.bin *.hex *.srec *.list *.map *.dis *.disasm
 | 
				
			||||
 | 
				
			||||
###############################################################################
 | 
				
			||||
###############################################################################
 | 
				
			||||
###############################################################################
 | 
				
			||||
 | 
				
			||||
# Be silent per default, but 'make V=1' will show all compiler calls.
 | 
				
			||||
ifneq ($(V),1) | 
				
			||||
  Q     := @
 | 
				
			||||
  NULL  := 2>/dev/null
 | 
				
			||||
endif | 
				
			||||
 | 
				
			||||
###############################################################################
 | 
				
			||||
# Executables
 | 
				
			||||
 | 
				
			||||
PREFIX  ?= arm-none-eabi
 | 
				
			||||
 | 
				
			||||
CC      := $(PREFIX)-gcc
 | 
				
			||||
CXX     := $(PREFIX)-g++
 | 
				
			||||
LD      := $(PREFIX)-gcc
 | 
				
			||||
AR      := $(PREFIX)-ar
 | 
				
			||||
AS      := $(PREFIX)-as
 | 
				
			||||
OBJCOPY := $(PREFIX)-objcopy
 | 
				
			||||
OBJDUMP := $(PREFIX)-objdump
 | 
				
			||||
GDB     := $(PREFIX)-gdb
 | 
				
			||||
STFLASH := $(shell which st-flash)
 | 
				
			||||
 | 
				
			||||
###############################################################################
 | 
				
			||||
 | 
				
			||||
# For CMSIS compatibility
 | 
				
			||||
DEFS          += -D__weak="__attribute__((weak))" -D__packed="__attribute__((__packed__))"
 | 
				
			||||
 | 
				
			||||
###############################################################################
 | 
				
			||||
# C flags
 | 
				
			||||
 | 
				
			||||
CFLAGS      += -Os -ggdb -std=gnu99 -Wfatal-errors
 | 
				
			||||
CFLAGS      += -Wall -Wextra -Wshadow
 | 
				
			||||
CFLAGS      += -Wwrite-strings -Wold-style-definition -Winline -Wmissing-noreturn -Wstrict-prototypes
 | 
				
			||||
CFLAGS      += -Wredundant-decls -Wfloat-equal -Wsign-compare
 | 
				
			||||
CFLAGS      += -fno-common -ffunction-sections -fdata-sections -Wunused-function
 | 
				
			||||
CFLAGS      += -MD
 | 
				
			||||
CFLAGS      += $(INCL_DIRS:%=-I%) $(DEFS)
 | 
				
			||||
 | 
				
			||||
###############################################################################
 | 
				
			||||
# Linker flags
 | 
				
			||||
 | 
				
			||||
LDFLAGS     += --static -specs=nano.specs -lm -lc
 | 
				
			||||
#LDFLAGS     += -L$(OCM3_LIB_DIR)
 | 
				
			||||
LDFLAGS     += -T$(LDSCRIPT)
 | 
				
			||||
LDFLAGS     += -Wl,-Map=$(*).map
 | 
				
			||||
LDFLAGS     += -Wl,--gc-sections
 | 
				
			||||
 | 
				
			||||
###############################################################################
 | 
				
			||||
# Used libraries
 | 
				
			||||
 | 
				
			||||
LDLIBS		+= -lm
 | 
				
			||||
LDLIBS		+= -Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group
 | 
				
			||||
 | 
				
			||||
###############################################################################
 | 
				
			||||
###############################################################################
 | 
				
			||||
###############################################################################
 | 
				
			||||
 | 
				
			||||
.SUFFIXES: .elf .bin .hex .srec .list .map .images | 
				
			||||
.SECONDEXPANSION: | 
				
			||||
.SECONDARY: | 
				
			||||
 | 
				
			||||
all: elf | 
				
			||||
 | 
				
			||||
ttyusb: | 
				
			||||
	gtkterm -s 115200 -p /dev/ttyUSB0
 | 
				
			||||
 | 
				
			||||
ttyacm: | 
				
			||||
	gtkterm -p /dev/ttyACM0
 | 
				
			||||
 | 
				
			||||
elf: $(BINARY).elf | 
				
			||||
bin: $(BINARY).bin | 
				
			||||
hex: $(BINARY).hex | 
				
			||||
srec: $(BINARY).srec | 
				
			||||
list: $(BINARY).list | 
				
			||||
 | 
				
			||||
images: $(BINARY).images | 
				
			||||
flash: $(BINARY).flash | 
				
			||||
 | 
				
			||||
dis: $(BINARY).elf | 
				
			||||
	$(Q)$(OBJDUMP) -dS $(BINARY).elf -j .text -j .isr_vector > $(BINARY).dis
 | 
				
			||||
 | 
				
			||||
%.images: %.bin %.hex %.srec %.list %.map | 
				
			||||
 | 
				
			||||
%.bin: %.elf | 
				
			||||
	$(Q)$(OBJCOPY) -Obinary $(*).elf $(*).bin
 | 
				
			||||
 | 
				
			||||
%.hex: %.elf | 
				
			||||
	$(Q)$(OBJCOPY) -Oihex $(*).elf $(*).hex
 | 
				
			||||
 | 
				
			||||
%.srec: %.elf | 
				
			||||
	$(Q)$(OBJCOPY) -Osrec $(*).elf $(*).srec
 | 
				
			||||
 | 
				
			||||
%.list: %.elf | 
				
			||||
	$(Q)$(OBJDUMP) -S $(*).elf > $(*).list
 | 
				
			||||
 | 
				
			||||
%.elf %.map: $(OBJS) | 
				
			||||
	$(Q)$(LD) $(LDFLAGS) $(ARCH_FLAGS) $(OBJS) $(LDLIBS) -o $(*).elf
 | 
				
			||||
 | 
				
			||||
%.o: %.c | 
				
			||||
	$(Q)$(CC) $(CFLAGS) $(ARCH_FLAGS) -o $(*).o -c $(*).c
 | 
				
			||||
 | 
				
			||||
%.o: %.s | 
				
			||||
	$(Q)$(CC) $(CFLAGS) $(ARCH_FLAGS) -o $(*).o -c $(*).s
 | 
				
			||||
 | 
				
			||||
clean: | 
				
			||||
	$(Q)$(RM) $(JUNK)
 | 
				
			||||
	$(Q)cd lib && $(RM) $(JUNK)
 | 
				
			||||
 | 
				
			||||
%.flash: %.bin | 
				
			||||
	@printf "  FLASH  $<\n"
 | 
				
			||||
	$(Q)$(STFLASH) write $(*).bin 0x8000000
 | 
				
			||||
 | 
				
			||||
.PHONY: images clean elf bin hex srec list dis ttyusb ttyacm | 
				
			||||
 | 
				
			||||
-include $(OBJS:.o=.d) | 
				
			||||
@ -0,0 +1,66 @@ | 
				
			||||
#pragma once | 
				
			||||
 | 
				
			||||
/* Part of this file is based on libopencm3 */ | 
				
			||||
 | 
				
			||||
#include <stdint.h> | 
				
			||||
#include <stdbool.h> | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/* Generic memory-mapped I/O accessor functions */ | 
				
			||||
#define MMIO8(addr)     (*(volatile uint8_t *)(addr)) | 
				
			||||
#define MMIO16(addr)        (*(volatile uint16_t *)(addr)) | 
				
			||||
#define MMIO32(addr)        (*(volatile uint32_t *)(addr)) | 
				
			||||
#define MMIO64(addr)        (*(volatile uint64_t *)(addr)) | 
				
			||||
 | 
				
			||||
/* Generic bit-band I/O accessor functions */ | 
				
			||||
#define BBIO_SRAM(addr, bit) \ | 
				
			||||
	MMIO32((((uint32_t)addr) & 0x0FFFFF) * 32 + 0x22000000 + (bit) * 4) | 
				
			||||
 | 
				
			||||
#define BBIO_PERIPH(addr, bit) \ | 
				
			||||
	MMIO32((((uint32_t)addr) & 0x0FFFFF) * 32 + 0x42000000 + (bit) * 4) | 
				
			||||
 | 
				
			||||
// i...iterator, m...mask, count...nr of bits
 | 
				
			||||
#define BitFieldLoop(i, m, count) for (uint32_t i = 0, m = 1; i < count; m <<= 1, i++) | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#define BIT0  (1<<0) | 
				
			||||
#define BIT1  (1<<1) | 
				
			||||
#define BIT2  (1<<2) | 
				
			||||
#define BIT3  (1<<3) | 
				
			||||
#define BIT4  (1<<4) | 
				
			||||
#define BIT5  (1<<5) | 
				
			||||
#define BIT6  (1<<6) | 
				
			||||
#define BIT7  (1<<7) | 
				
			||||
#define BIT8  (1<<8) | 
				
			||||
#define BIT9  (1<<9) | 
				
			||||
#define BIT10 (1<<10) | 
				
			||||
#define BIT11 (1<<11) | 
				
			||||
#define BIT12 (1<<12) | 
				
			||||
#define BIT13 (1<<13) | 
				
			||||
#define BIT14 (1<<14) | 
				
			||||
#define BIT15 (1<<15) | 
				
			||||
#define BIT16 (1<<16) | 
				
			||||
#define BIT17 (1<<17) | 
				
			||||
#define BIT18 (1<<18) | 
				
			||||
#define BIT19 (1<<19) | 
				
			||||
#define BIT20 (1<<20) | 
				
			||||
#define BIT21 (1<<21) | 
				
			||||
#define BIT22 (1<<22) | 
				
			||||
#define BIT23 (1<<23) | 
				
			||||
#define BIT24 (1<<24) | 
				
			||||
#define BIT25 (1<<25) | 
				
			||||
#define BIT26 (1<<26) | 
				
			||||
#define BIT27 (1<<27) | 
				
			||||
#define BIT28 (1<<28) | 
				
			||||
#define BIT29 (1<<29) | 
				
			||||
#define BIT30 (1<<30) | 
				
			||||
#define BIT31 (1<<31) | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#include "defs_base.h" | 
				
			||||
#include "defs_gpio.h" | 
				
			||||
#include "defs_rcc.h" | 
				
			||||
#include "defs_flash.h" | 
				
			||||
#include "defs_systick.h" | 
				
			||||
#include "defs_usart.h" | 
				
			||||
@ -0,0 +1,100 @@ | 
				
			||||
#pragma once | 
				
			||||
 | 
				
			||||
#include "common.h" | 
				
			||||
 | 
				
			||||
// AUTHOR : Ondrej Hruska
 | 
				
			||||
// DATE   : 12/2015
 | 
				
			||||
// DESCR  : Base library file. This file must be included before any other library
 | 
				
			||||
//          files. This file defines memory map and base addresses of peripherals.
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#define FLASH_BASE            0x08000000                 // FLASH base address in the alias region
 | 
				
			||||
#define SRAM_BASE             0x20000000                 // SRAM base address in the alias region
 | 
				
			||||
#define PERIPH_BASE           0x40000000                 // Peripheral base address in the alias region
 | 
				
			||||
 | 
				
			||||
#define SRAM_BB_BASE          (SRAM_BASE   + 0x02000000) // SRAM base address in the bit-band region
 | 
				
			||||
#define PERIPH_BB_BASE        (PERIPH_BASE + 0x02000000) // Peripheral base address in the bit-band region
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
// ------------------------- System Config Blocks -----------------------------
 | 
				
			||||
 | 
				
			||||
#define _SCS_BASE             0xE000E000                 // System Control Space base
 | 
				
			||||
#define _SCB                  (_SCS_BASE + 0x0D00)       // System Control Block base
 | 
				
			||||
#define _NVIC                 (_SCS_BASE + 0x0100)       // Nested Interrupt Vector Controller base
 | 
				
			||||
#define _OB                   0x1FF80000                 // FLASH Option Bytes base address
 | 
				
			||||
#define _AES                  0x50060000                 // Encryption module
 | 
				
			||||
#define _FSMC                 0xA0000000                 // External Memory Control base
 | 
				
			||||
#define _DBGMCU               0xE0042000                 // Debug MCU registers base address
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
// ----------------------------- Peripherals ----------------------------------
 | 
				
			||||
 | 
				
			||||
// *** Peripheral bus bases ***
 | 
				
			||||
#define _APB1                  PERIPH_BASE               // Advanced Peripheral Bus 1 base
 | 
				
			||||
#define _APB2                 (PERIPH_BASE + 0x10000)    // Advanced Peripheral Bus 2 base
 | 
				
			||||
#define _AHB                  (PERIPH_BASE + 0x20000)    // Advanced High-speed Bus base
 | 
				
			||||
 | 
				
			||||
// *** Peripheral Bus 1 devices ***
 | 
				
			||||
 | 
				
			||||
#define _TIM2                 (_APB1 + 0x0000)           // Timer bases
 | 
				
			||||
#define _TIM3                 (_APB1 + 0x0400) | 
				
			||||
#define _TIM4                 (_APB1 + 0x0800) | 
				
			||||
#define _TIM5                 (_APB1 + 0x0C00) | 
				
			||||
#define _TIM6                 (_APB1 + 0x1000) | 
				
			||||
#define _TIM7                 (_APB1 + 0x1400) | 
				
			||||
 | 
				
			||||
#define _LCD                  (_APB1 + 0x2400)           // LCD controller base
 | 
				
			||||
#define _RTC                  (_APB1 + 0x2800)           // RTC base
 | 
				
			||||
 | 
				
			||||
#define _WWDG                 (_APB1 + 0x2C00)           // Window Watchdog base
 | 
				
			||||
#define _IWDG                 (_APB1 + 0x3000)           // Independent Watchdog base
 | 
				
			||||
 | 
				
			||||
#define _SPI2                 (_APB1 + 0x3800)           // SPI base
 | 
				
			||||
#define _SPI3                 (_APB1 + 0x3C00) | 
				
			||||
 | 
				
			||||
#define _USART2               (_APB1 + 0x4400)           // USART base
 | 
				
			||||
#define _USART3               (_APB1 + 0x4800) | 
				
			||||
 | 
				
			||||
#define _UART4                (_APB1 + 0x4C00)           // UART base (?)
 | 
				
			||||
#define _UART5                (_APB1 + 0x5000) | 
				
			||||
 | 
				
			||||
#define _I2C1                 (_APB1 + 0x5400)           // I2C base
 | 
				
			||||
#define _I2C2                 (_APB1 + 0x5800) | 
				
			||||
 | 
				
			||||
#define _PWR                  (_APB1 + 0x7000)           // Power Control block base
 | 
				
			||||
#define _DAC                  (_APB1 + 0x7400)           // D/A config base
 | 
				
			||||
#define _COMP                 (_APB1 + 0x7C00)           // Analog Comparator base
 | 
				
			||||
#define _RI                   (_APB1 + 0x7C04)           // Routing Interface base (analog pin connections)
 | 
				
			||||
#define _OPAMP                (_APB1 + 0x7C5C)           // OpAmp config base
 | 
				
			||||
 | 
				
			||||
#define _USB                  (_APB1 + 0x5C00)           // USB registers base
 | 
				
			||||
 | 
				
			||||
// *** Peripheral Bus 2 devices ***
 | 
				
			||||
 | 
				
			||||
#define _TIM9                 (_APB2 + 0x0800)           // Timer base
 | 
				
			||||
#define _TIM10                (_APB2 + 0x0C00) | 
				
			||||
#define _TIM11                (_APB2 + 0x1000) | 
				
			||||
 | 
				
			||||
#define _SYSCFG               (_APB2 + 0x0000)           // System config block base
 | 
				
			||||
#define _EXTI                 (_APB2 + 0x0400)           // External interrupt settings base
 | 
				
			||||
 | 
				
			||||
#define _ADC1                 (_APB2 + 0x2400)           // A/D 1
 | 
				
			||||
#define _ADCC                 (_APB2 + 0x2700)           // common A/D registers base
 | 
				
			||||
 | 
				
			||||
#define _SDIO                 (_APB2 + 0x2C00)           // SD host
 | 
				
			||||
#define _SPI1                 (_APB2 + 0x3000)           // SPI
 | 
				
			||||
#define _USART1               (_APB2 + 0x3800) | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
// *** High Speed Bus devices ***
 | 
				
			||||
 | 
				
			||||
#define _GPIO                 (_AHB + 0x0000)            // GPIO block base
 | 
				
			||||
 | 
				
			||||
#define _CRC                  (_AHB + 0x3000)            // CRC module base
 | 
				
			||||
#define _RCC                  (_AHB + 0x3800)            // Reset and Clock Config base
 | 
				
			||||
 | 
				
			||||
#define _DMA1                 (_AHB + 0x6000)            // DMA control base
 | 
				
			||||
#define _DMA2                 (_AHB + 0x6400) | 
				
			||||
 | 
				
			||||
#define _FLASH                (_AHB + 0x3C00)            // FLASH control base
 | 
				
			||||
@ -0,0 +1,115 @@ | 
				
			||||
#pragma once | 
				
			||||
 | 
				
			||||
#include "common.h" | 
				
			||||
 | 
				
			||||
// AUTHOR : Ondrej Hruska
 | 
				
			||||
// DATE   : 12/2015
 | 
				
			||||
// DESCR  : Control registers and bit masks for FLASH control
 | 
				
			||||
//
 | 
				
			||||
//                FLASH, DATA EEPROM and Option Bytes Registers
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//****************************************************************************
 | 
				
			||||
//*
 | 
				
			||||
//*                               REGISTERS
 | 
				
			||||
//*
 | 
				
			||||
//****************************************************************************
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
// FLASH registers
 | 
				
			||||
 | 
				
			||||
#define FLASH_ACR           MMIO32(_FLASH + 0x00) // Access control register,
 | 
				
			||||
#define FLASH_PECR          MMIO32(_FLASH + 0x04) // Program/erase control register,
 | 
				
			||||
#define FLASH_PDKEYR        MMIO32(_FLASH + 0x08) // Power down key register,
 | 
				
			||||
#define FLASH_PEKEYR        MMIO32(_FLASH + 0x0c) // Program/erase key register,
 | 
				
			||||
#define FLASH_PRGKEYR       MMIO32(_FLASH + 0x10) // Program memory key register,
 | 
				
			||||
#define FLASH_OPTKEYR       MMIO32(_FLASH + 0x14) // Option byte key register,
 | 
				
			||||
#define FLASH_SR            MMIO32(_FLASH + 0x18) // Status register,
 | 
				
			||||
#define FLASH_OBR           MMIO32(_FLASH + 0x1c) // Option byte register,
 | 
				
			||||
#define FLASH_WRPR          MMIO32(_FLASH + 0x20) // Write protection register,
 | 
				
			||||
#define FLASH_WRPR1         MMIO32(_FLASH + 0x28) // Write protection register 1,
 | 
				
			||||
#define FLASH_WRPR2         MMIO32(_FLASH + 0x2C) // Write protection register 2,
 | 
				
			||||
 | 
				
			||||
// FLASH option bytes (maybe incorrect, not tested)
 | 
				
			||||
 | 
				
			||||
#define OB_RDP              MMIO32(_OB + 0x00) // Read protection register,
 | 
				
			||||
#define OB_USER             MMIO32(_OB + 0x04) // user register,
 | 
				
			||||
#define OB_WRP01            MMIO32(_OB + 0x08) // write protection register 0 1,
 | 
				
			||||
#define OB_WRP23            MMIO32(_OB + 0x0C) // write protection register 2 3,
 | 
				
			||||
#define OB_WRP45            MMIO32(_OB + 0x10) // write protection register 4 5,
 | 
				
			||||
#define OB_WRP67            MMIO32(_OB + 0x14) // write protection register 6 7,
 | 
				
			||||
#define OB_WRP89            MMIO32(_OB + 0x18) // write protection register 8 9,
 | 
				
			||||
#define OB_WRP1011          MMIO32(_OB + 0x1C) // write protection register 10 11,
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//****************************************************************************
 | 
				
			||||
//*
 | 
				
			||||
//*                       BIT MASKS AND DEFINITIONS
 | 
				
			||||
//*
 | 
				
			||||
//****************************************************************************
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//******************  Bit definition for FLASH_ACR register  *****************
 | 
				
			||||
#define FLASH_ACR_LATENCY                   0x00000001        // Latency
 | 
				
			||||
#define FLASH_ACR_PRFTEN                    0x00000002        // Prefetch Buffer Enable
 | 
				
			||||
#define FLASH_ACR_ACC64                     0x00000004        // Access 64 bits
 | 
				
			||||
#define FLASH_ACR_SLEEP_PD                  0x00000008        // Flash mode during sleep mode
 | 
				
			||||
#define FLASH_ACR_RUN_PD                    0x00000010        // Flash mode during RUN mode
 | 
				
			||||
 | 
				
			||||
//******************  Bit definition for FLASH_PECR register  *****************
 | 
				
			||||
#define FLASH_PECR_PELOCK                    0x00000001        // FLASH_PECR and Flash data Lock
 | 
				
			||||
#define FLASH_PECR_PRGLOCK                   0x00000002        // Program matrix Lock
 | 
				
			||||
#define FLASH_PECR_OPTLOCK                   0x00000004        // Option byte matrix Lock
 | 
				
			||||
#define FLASH_PECR_PROG                      0x00000008        // Program matrix selection
 | 
				
			||||
#define FLASH_PECR_DATA                      0x00000010        // Data matrix selection
 | 
				
			||||
#define FLASH_PECR_FTDW                      0x00000100        // Fixed Time Data write for Word/Half Word/Byte programming
 | 
				
			||||
#define FLASH_PECR_ERASE                     0x00000200        // Page erasing mode
 | 
				
			||||
#define FLASH_PECR_FPRG                      0x00000400        // Fast Page/Half Page programming mode
 | 
				
			||||
#define FLASH_PECR_PARALLBANK                0x00008000        // Parallel Bank mode
 | 
				
			||||
#define FLASH_PECR_EOPIE                     0x00010000        // End of programming interrupt
 | 
				
			||||
#define FLASH_PECR_ERRIE                     0x00020000        // Error interrupt
 | 
				
			||||
#define FLASH_PECR_OBL_LAUNCH                0x00040000        // Launch the option byte loading
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for FLASH_PDKEYR register  *****************
 | 
				
			||||
#define FLASH_PDKEYR_PDKEYR                 0xFFFFFFFF       // FLASH_PEC and data matrix Key
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for FLASH_PEKEYR register  *****************
 | 
				
			||||
#define FLASH_PEKEYR_PEKEYR                 0xFFFFFFFF       // FLASH_PEC and data matrix Key
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for FLASH_PRGKEYR register  *****************
 | 
				
			||||
#define FLASH_PRGKEYR_PRGKEYR               0xFFFFFFFF        // Program matrix Key
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for FLASH_OPTKEYR register  *****************
 | 
				
			||||
#define FLASH_OPTKEYR_OPTKEYR               0xFFFFFFFF        // Option bytes matrix Key
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for FLASH_SR register  ******************
 | 
				
			||||
#define FLASH_SR_BSY                        0x00000001        // Busy
 | 
				
			||||
#define FLASH_SR_EOP                        0x00000002        // End Of Programming
 | 
				
			||||
#define FLASH_SR_ENHV                       0x00000004        // End of high voltage
 | 
				
			||||
#define FLASH_SR_READY                      0x00000008        // Flash ready after low power mode
 | 
				
			||||
 | 
				
			||||
#define FLASH_SR_WRPERR                     0x00000100        // Write protected error
 | 
				
			||||
#define FLASH_SR_PGAERR                     0x00000200        // Programming Alignment Error
 | 
				
			||||
#define FLASH_SR_SIZERR                     0x00000400        // Size error
 | 
				
			||||
#define FLASH_SR_OPTVERR                    0x00000800        // Option validity error
 | 
				
			||||
#define FLASH_SR_OPTVERRUSR                 0x00001000        // Option User validity error
 | 
				
			||||
#define FLASH_SR_RDERR                      0x00002000        // Read protected error
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for FLASH_OBR register  ******************
 | 
				
			||||
#define FLASH_OBR_RDPRT                     0x000000AA        // Read Protection
 | 
				
			||||
#define FLASH_OBR_SPRMOD                    0x00000100        // Selection of protection mode of WPRi bits  (available only in STM32L1xx Medium-density Plus devices)
 | 
				
			||||
#define FLASH_OBR_BOR_LEV                   0x000F0000        // BOR_LEV[3:0] Brown Out Reset Threshold Level
 | 
				
			||||
#define FLASH_OBR_IWDG_SW                   0x00100000        // IWDG_SW
 | 
				
			||||
#define FLASH_OBR_nRST_STOP                 0x00200000        // nRST_STOP
 | 
				
			||||
#define FLASH_OBR_nRST_STDBY                0x00400000        // nRST_STDBY
 | 
				
			||||
#define FLASH_OBR_BFB2                      0x00800000        // BFB2(available only in STM32L1xx High-density devices)
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for FLASH_WRPR register  *****************
 | 
				
			||||
#define FLASH_WRPR_WRP                      0xFFFFFFFF        // Write Protection bits
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for FLASH_WRPR1 register  ****************
 | 
				
			||||
#define FLASH_WRPR1_WRP                     0xFFFFFFFF        // Write Protection bits (available only in STM32L1xx  Medium-density Plus and High-density devices)
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for FLASH_WRPR2 register  ****************
 | 
				
			||||
#define FLASH_WRPR2_WRP                     0xFFFFFFFF        // Write Protection bits (available only in STM32L1xx High-density devices)
 | 
				
			||||
@ -0,0 +1,117 @@ | 
				
			||||
#pragma once | 
				
			||||
 | 
				
			||||
#include "common.h" | 
				
			||||
 | 
				
			||||
// AUTHOR : Ondrej Hruska
 | 
				
			||||
// DATE   : 10/2015
 | 
				
			||||
// DESCR  : Control registers and bit masks for GPIO
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
// offsets
 | 
				
			||||
#define GPIO_MODER_offs    0x00  // GPIOA pin mode register,
 | 
				
			||||
#define GPIO_OTYPER_offs   0x04  // GPIOA output type register,
 | 
				
			||||
#define GPIO_OSPEEDR_offs  0x08  // GPIOA output speed register,
 | 
				
			||||
#define GPIO_PUPDR_offs    0x0C  // GPIOA pull-up/pull-down register,
 | 
				
			||||
#define GPIO_IDR_offs      0x10  // GPIOA input data register,
 | 
				
			||||
#define GPIO_ODR_offs      0x14  // GPIOA output data register,
 | 
				
			||||
#define GPIO_BSRR_offs     0x18  // GPIOA bit set/reset register,
 | 
				
			||||
#define GPIO_LCKR_offs     0x1C  // GPIOA configuration lock register,
 | 
				
			||||
#define GPIO_AFR_offs      0x20  // GPIOA alternate function register,
 | 
				
			||||
#define GPIO_BRR_offs      0x28  // GPIOA bit reset register,
 | 
				
			||||
 | 
				
			||||
#define GPIOA              (_GPIO + 0x0000) | 
				
			||||
#define GPIOB              (_GPIO + 0x0400) | 
				
			||||
#define GPIOC              (_GPIO + 0x0800) | 
				
			||||
#define GPIOD              (_GPIO + 0x0C00) | 
				
			||||
#define GPIOE              (_GPIO + 0x1000) | 
				
			||||
#define GPIOH              (_GPIO + 0x1400) | 
				
			||||
#define GPIOF              (_GPIO + 0x1800) | 
				
			||||
#define GPIOG              (_GPIO + 0x1C00) | 
				
			||||
 | 
				
			||||
#define GPIOA_MODER         MMIO32(GPIOA + 0x00)              // GPIOA pin mode register,
 | 
				
			||||
#define GPIOA_OTYPER        MMIO32(GPIOA + 0x04)              // GPIOA output type register,
 | 
				
			||||
#define GPIOA_OSPEEDR       MMIO32(GPIOA + 0x08)              // GPIOA output speed register,
 | 
				
			||||
#define GPIOA_PUPDR         MMIO32(GPIOA + 0x0C)              // GPIOA pull-up/pull-down register,
 | 
				
			||||
#define GPIOA_IDR           MMIO32(GPIOA + 0x10)              // GPIOA input data register,
 | 
				
			||||
#define GPIOA_ODR           MMIO32(GPIOA + 0x14)              // GPIOA output data register,
 | 
				
			||||
#define GPIOA_BSRR          MMIO32(GPIOA + 0x18)              // GPIOA bit set/reset register,
 | 
				
			||||
#define GPIOA_LCKR          MMIO32(GPIOA + 0x1C)              // GPIOA configuration lock register,
 | 
				
			||||
#define GPIOA_AFR           MMIO64(GPIOA + 0x20)               // GPIOA alternate function register,
 | 
				
			||||
#define GPIOA_BRR           MMIO32(GPIOA + 0x28)              // GPIOA bit reset register,
 | 
				
			||||
 | 
				
			||||
#define GPIOB_MODER         MMIO32(GPIOB + 0x00)              // GPIOB pin mode register,
 | 
				
			||||
#define GPIOB_OTYPER        MMIO32(GPIOB + 0x04)              // GPIOB output type register,
 | 
				
			||||
#define GPIOB_OSPEEDR       MMIO32(GPIOB + 0x08)              // GPIOB output speed register,
 | 
				
			||||
#define GPIOB_PUPDR         MMIO32(GPIOB + 0x0C)              // GPIOB pull-up/pull-down register,
 | 
				
			||||
#define GPIOB_IDR           MMIO32(GPIOB + 0x10)              // GPIOB input data register,
 | 
				
			||||
#define GPIOB_ODR           MMIO32(GPIOB + 0x14)              // GPIOB output data register,
 | 
				
			||||
#define GPIOB_BSRR          MMIO32(GPIOB + 0x18)              // GPIOB bit set/reset register,
 | 
				
			||||
#define GPIOB_LCKR          MMIO32(GPIOB + 0x1C)              // GPIOB configuration lock register,
 | 
				
			||||
#define GPIOB_AFR           MMIO64(GPIOB + 0x20)              // GPIOB alternate function low register,
 | 
				
			||||
#define GPIOB_BRR           MMIO32(GPIOB + 0x28)              // GPIOB bit reset register,
 | 
				
			||||
 | 
				
			||||
#define GPIOC_MODER         MMIO32(GPIOC + 0x00)              // GPIOC pin mode register,
 | 
				
			||||
#define GPIOC_OTYPER        MMIO32(GPIOC + 0x04)              // GPIOC output type register,
 | 
				
			||||
#define GPIOC_OSPEEDR       MMIO32(GPIOC + 0x08)              // GPIOC output speed register,
 | 
				
			||||
#define GPIOC_PUPDR         MMIO32(GPIOC + 0x0C)              // GPIOC pull-up/pull-down register,
 | 
				
			||||
#define GPIOC_IDR           MMIO32(GPIOC + 0x10)              // GPIOC input data register,
 | 
				
			||||
#define GPIOC_ODR           MMIO32(GPIOC + 0x14)              // GPIOC output data register,
 | 
				
			||||
#define GPIOC_BSRR          MMIO32(GPIOC + 0x18)              // GPIOC bit set/reset register,
 | 
				
			||||
#define GPIOC_LCKR          MMIO32(GPIOC + 0x1C)              // GPIOC configuration lock register,
 | 
				
			||||
#define GPIOC_AFR           MMIO64(GPIOC + 0x20)              // GPIOC alternate function low register,
 | 
				
			||||
#define GPIOC_BRR           MMIO32(GPIOC + 0x28)              // GPIOC bit reset register,
 | 
				
			||||
 | 
				
			||||
#define GPIOD_MODER         MMIO32(GPIOD + 0x00)              // GPIOD pin mode register,
 | 
				
			||||
#define GPIOD_OTYPER        MMIO32(GPIOD + 0x04)              // GPIOD output type register,
 | 
				
			||||
#define GPIOD_OSPEEDR       MMIO32(GPIOD + 0x08)              // GPIOD output speed register,
 | 
				
			||||
#define GPIOD_PUPDR         MMIO32(GPIOD + 0x0C)              // GPIOD pull-up/pull-down register,
 | 
				
			||||
#define GPIOD_IDR           MMIO32(GPIOD + 0x10)              // GPIOD input data register,
 | 
				
			||||
#define GPIOD_ODR           MMIO32(GPIOD + 0x14)              // GPIOD output data register,
 | 
				
			||||
#define GPIOD_BSRR          MMIO32(GPIOD + 0x18)              // GPIOD bit set/reset register,
 | 
				
			||||
#define GPIOD_LCKR          MMIO32(GPIOD + 0x1C)              // GPIOD configuration lock register,
 | 
				
			||||
#define GPIOD_AFR           MMIO64(GPIOD + 0x20)              // GPIOD alternate function low register,
 | 
				
			||||
#define GPIOD_BRR           MMIO32(GPIOD + 0x28)              // GPIOD bit reset register,
 | 
				
			||||
 | 
				
			||||
#define GPIOE_MODER         MMIO32(GPIOE + 0x00)              // GPIOE pin mode register,
 | 
				
			||||
#define GPIOE_OTYPER        MMIO32(GPIOE + 0x04)              // GPIOE output type register,
 | 
				
			||||
#define GPIOE_OSPEEDR       MMIO32(GPIOE + 0x08)              // GPIOE output speed register,
 | 
				
			||||
#define GPIOE_PUPDR         MMIO32(GPIOE + 0x0C)              // GPIOE pull-up/pull-down register,
 | 
				
			||||
#define GPIOE_IDR           MMIO32(GPIOE + 0x10)              // GPIOE input data register,
 | 
				
			||||
#define GPIOE_ODR           MMIO32(GPIOE + 0x14)              // GPIOE output data register,
 | 
				
			||||
#define GPIOE_BSRR          MMIO32(GPIOE + 0x18)              // GPIOE bit set/reset register,
 | 
				
			||||
#define GPIOE_LCKR          MMIO32(GPIOE + 0x1C)              // GPIOE configuration lock register,
 | 
				
			||||
#define GPIOE_AFR           MMIO64(GPIOE + 0x20)              // GPIOE alternate function low register,
 | 
				
			||||
#define GPIOE_BRR           MMIO32(GPIOE + 0x28)              // GPIOE bit reset register,
 | 
				
			||||
 | 
				
			||||
#define GPIOF_MODER         MMIO32(GPIOF + 0x00)              // GPIOF pin mode register,
 | 
				
			||||
#define GPIOF_OTYPER        MMIO32(GPIOF + 0x04)              // GPIOF output type register,
 | 
				
			||||
#define GPIOF_OSPEEDR       MMIO32(GPIOF + 0x08)              // GPIOF output speed register,
 | 
				
			||||
#define GPIOF_PUPDR         MMIO32(GPIOF + 0x0C)              // GPIOF pull-up/pull-down register,
 | 
				
			||||
#define GPIOF_IDR           MMIO32(GPIOF + 0x10)              // GPIOF input data register,
 | 
				
			||||
#define GPIOF_ODR           MMIO32(GPIOF + 0x14)              // GPIOF output data register,
 | 
				
			||||
#define GPIOF_BSRR          MMIO32(GPIOF + 0x18)              // GPIOF bit set/reset register,
 | 
				
			||||
#define GPIOF_LCKR          MMIO32(GPIOF + 0x1C)              // GPIOF configuration lock register,
 | 
				
			||||
#define GPIOF_AFR           MMIO64(GPIOF + 0x20)              // GPIOF alternate function low register,
 | 
				
			||||
#define GPIOF_BRR           MMIO32(GPIOF + 0x28)              // GPIOF bit reset register,
 | 
				
			||||
 | 
				
			||||
#define GPIOG_MODER         MMIO32(GPIOG + 0x00)              // GPIOG pin mode register,
 | 
				
			||||
#define GPIOG_OTYPER        MMIO32(GPIOG + 0x04)              // GPIOG output type register,
 | 
				
			||||
#define GPIOG_OSPEEDR       MMIO32(GPIOG + 0x08)              // GPIOG output speed register,
 | 
				
			||||
#define GPIOG_PUPDR         MMIO32(GPIOG + 0x0C)              // GPIOG pull-up/pull-down register,
 | 
				
			||||
#define GPIOG_IDR           MMIO32(GPIOG + 0x10)              // GPIOG input data register,
 | 
				
			||||
#define GPIOG_ODR           MMIO32(GPIOG + 0x14)              // GPIOG output data register,
 | 
				
			||||
#define GPIOG_BSRR          MMIO32(GPIOG + 0x18)              // GPIOG bit set/reset register,
 | 
				
			||||
#define GPIOG_LCKR          MMIO32(GPIOG + 0x1C)              // GPIOG configuration lock register,
 | 
				
			||||
#define GPIOG_AFR           MMIO64(GPIOG + 0x20)              // GPIOG alternate function low register,
 | 
				
			||||
#define GPIOG_BRR           MMIO32(GPIOG + 0x28)              // GPIOG bit reset register,
 | 
				
			||||
 | 
				
			||||
#define GPIOH_MODER         MMIO32(GPIOH + 0x00)              // GPIOH pin mode register,
 | 
				
			||||
#define GPIOH_OTYPER        MMIO32(GPIOH + 0x04)              // GPIOH output type register,
 | 
				
			||||
#define GPIOH_OSPEEDR       MMIO32(GPIOH + 0x08)              // GPIOH output speed register,
 | 
				
			||||
#define GPIOH_PUPDR         MMIO32(GPIOH + 0x0C)              // GPIOH pull-up/pull-down register,
 | 
				
			||||
#define GPIOH_IDR           MMIO32(GPIOH + 0x10)              // GPIOH input data register,
 | 
				
			||||
#define GPIOH_ODR           MMIO32(GPIOH + 0x14)              // GPIOH output data register,
 | 
				
			||||
#define GPIOH_BSRR          MMIO32(GPIOH + 0x18)              // GPIOH bit set/reset register,
 | 
				
			||||
#define GPIOH_LCKR          MMIO32(GPIOH + 0x1C)              // GPIOH configuration lock register,
 | 
				
			||||
#define GPIOH_AFR           MMIO64(GPIOH + 0x20)              // GPIOH alternate function low register,
 | 
				
			||||
#define GPIOH_BRR           MMIO32(GPIOH + 0x28)              // GPIOH bit reset register,
 | 
				
			||||
@ -0,0 +1,373 @@ | 
				
			||||
#pragma once | 
				
			||||
 | 
				
			||||
#include "common.h" | 
				
			||||
 | 
				
			||||
// RCC registers
 | 
				
			||||
 | 
				
			||||
#define RCC_CR              MMIO32(_RCC + 0x00) // RCC clock control register,
 | 
				
			||||
#define RCC_ICSCR           MMIO32(_RCC + 0x04) // RCC Internal clock sources calibration register,
 | 
				
			||||
#define RCC_CFGR            MMIO32(_RCC + 0x08) // RCC Clock configuration register,
 | 
				
			||||
#define RCC_CIR             MMIO32(_RCC + 0x0C) // RCC Clock interrupt register,
 | 
				
			||||
#define RCC_AHBRSTR         MMIO32(_RCC + 0x10) // RCC AHB peripheral reset register,
 | 
				
			||||
#define RCC_APB2RSTR        MMIO32(_RCC + 0x14) // RCC APB2 peripheral reset register,
 | 
				
			||||
#define RCC_APB1RSTR        MMIO32(_RCC + 0x18) // RCC APB1 peripheral reset register,
 | 
				
			||||
#define RCC_AHBENR          MMIO32(_RCC + 0x1C) // RCC AHB peripheral clock enable register,
 | 
				
			||||
#define RCC_APB2ENR         MMIO32(_RCC + 0x20) // RCC APB2 peripheral clock enable register,
 | 
				
			||||
#define RCC_APB1ENR         MMIO32(_RCC + 0x24) // RCC APB1 peripheral clock enable register,
 | 
				
			||||
#define RCC_AHBLPENR        MMIO32(_RCC + 0x28) // RCC AHB peripheral clock enable in low power mode register,
 | 
				
			||||
#define RCC_APB2LPENR       MMIO32(_RCC + 0x2C) // RCC APB2 peripheral clock enable in low power mode register,
 | 
				
			||||
#define RCC_APB1LPENR       MMIO32(_RCC + 0x30) // RCC APB1 peripheral clock enable in low power mode register,
 | 
				
			||||
#define RCC_CSR             MMIO32(_RCC + 0x34) // RCC Control/status register,
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//****************************************************************************
 | 
				
			||||
//*
 | 
				
			||||
//*                       BIT MASKS AND DEFINITIONS
 | 
				
			||||
//*
 | 
				
			||||
//****************************************************************************
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//*******************  Bit definition for RCC_CR register  *******************
 | 
				
			||||
#define RCC_CR_HSION                        0x00000001        // Internal High Speed clock enable
 | 
				
			||||
#define RCC_CR_HSIRDY                       0x00000002        // Internal High Speed clock ready flag
 | 
				
			||||
 | 
				
			||||
#define RCC_CR_MSION                        0x00000100        // Internal Multi Speed clock enable
 | 
				
			||||
#define RCC_CR_MSIRDY                       0x00000200        // Internal Multi Speed clock ready flag
 | 
				
			||||
 | 
				
			||||
#define RCC_CR_HSEON                        0x00010000        // External High Speed clock enable
 | 
				
			||||
#define RCC_CR_HSERDY                       0x00020000        // External High Speed clock ready flag
 | 
				
			||||
#define RCC_CR_HSEBYP                       0x00040000        // External High Speed clock Bypass
 | 
				
			||||
 | 
				
			||||
#define RCC_CR_PLLON                        0x01000000        // PLL enable
 | 
				
			||||
#define RCC_CR_PLLRDY                       0x02000000        // PLL clock ready flag
 | 
				
			||||
#define RCC_CR_CSSON                        0x10000000        // Clock Security System enable
 | 
				
			||||
 | 
				
			||||
#define RCC_CR_RTCPRE                       0x60000000        // RTC/LCD Prescaler
 | 
				
			||||
 | 
				
			||||
// prescaler levels
 | 
				
			||||
#define RCC_CR_RTCPRE_DIV2                     0x00000000 | 
				
			||||
#define RCC_CR_RTCPRE_DIV4                     0x20000000 | 
				
			||||
#define RCC_CR_RTCPRE_DIV8                     0x40000000 | 
				
			||||
#define RCC_CR_RTCPRE_DIV16                    0x60000000 | 
				
			||||
 | 
				
			||||
//*******************  Bit definition for RCC_ICSCR register  ****************
 | 
				
			||||
#define RCC_ICSCR_HSICAL                    0x000000FF        // Internal High Speed clock Calibration
 | 
				
			||||
#define RCC_ICSCR_HSITRIM                   0x00001F00        // Internal High Speed clock trimming
 | 
				
			||||
 | 
				
			||||
#define RCC_ICSCR_MSIRANGE                  0x0000E000        // Internal Multi Speed clock Range
 | 
				
			||||
#define RCC_ICSCR_MSIRANGE_0                0x00000000        // Internal Multi Speed clock Range 65.536 KHz
 | 
				
			||||
#define RCC_ICSCR_MSIRANGE_1                0x00002000        // Internal Multi Speed clock Range 131.072 KHz
 | 
				
			||||
#define RCC_ICSCR_MSIRANGE_2                0x00004000        // Internal Multi Speed clock Range 262.144 KHz
 | 
				
			||||
#define RCC_ICSCR_MSIRANGE_3                0x00006000        // Internal Multi Speed clock Range 524.288 KHz
 | 
				
			||||
#define RCC_ICSCR_MSIRANGE_4                0x00008000        // Internal Multi Speed clock Range 1.048 MHz
 | 
				
			||||
#define RCC_ICSCR_MSIRANGE_5                0x0000A000        // Internal Multi Speed clock Range 2.097 MHz
 | 
				
			||||
#define RCC_ICSCR_MSIRANGE_6                0x0000C000        // Internal Multi Speed clock Range 4.194 MHz
 | 
				
			||||
#define RCC_ICSCR_MSICAL                    0x00FF0000        // Internal Multi Speed clock Calibration
 | 
				
			||||
#define RCC_ICSCR_MSITRIM                   0xFF000000        // Internal Multi Speed clock trimming
 | 
				
			||||
 | 
				
			||||
//*******************  Bit definition for RCC_CFGR register  *****************
 | 
				
			||||
#define RCC_CFGR_SW                         0x00000003        // SW[1:0] bits (System clock Switch)
 | 
				
			||||
 | 
				
			||||
// SW configuration
 | 
				
			||||
#define RCC_CFGR_SW_MSI                     0x00000000        // MSI selected as system clock
 | 
				
			||||
#define RCC_CFGR_SW_HSI                     0x00000001        // HSI selected as system clock
 | 
				
			||||
#define RCC_CFGR_SW_HSE                     0x00000002        // HSE selected as system clock
 | 
				
			||||
#define RCC_CFGR_SW_PLL                     0x00000003        // PLL selected as system clock
 | 
				
			||||
 | 
				
			||||
#define RCC_CFGR_SWS                        0x0000000C        // SWS[1:0] bits (System Clock Switch Status)
 | 
				
			||||
 | 
				
			||||
// SWS configuration
 | 
				
			||||
#define RCC_CFGR_SWS_MSI                    0x00000000        // MSI oscillator used as system clock
 | 
				
			||||
#define RCC_CFGR_SWS_HSI                    0x00000004        // HSI oscillator used as system clock
 | 
				
			||||
#define RCC_CFGR_SWS_HSE                    0x00000008        // HSE oscillator used as system clock
 | 
				
			||||
#define RCC_CFGR_SWS_PLL                    0x0000000C        // PLL used as system clock
 | 
				
			||||
 | 
				
			||||
#define RCC_CFGR_HPRE                       0x000000F0        // HPRE[3:0] bits (AHB prescaler)
 | 
				
			||||
 | 
				
			||||
// HPRE configuration
 | 
				
			||||
#define RCC_CFGR_HPRE_DIV1                  0x00000000        // SYSCLK not divided
 | 
				
			||||
#define RCC_CFGR_HPRE_DIV2                  0x00000080        // SYSCLK divided by 2
 | 
				
			||||
#define RCC_CFGR_HPRE_DIV4                  0x00000090        // SYSCLK divided by 4
 | 
				
			||||
#define RCC_CFGR_HPRE_DIV8                  0x000000A0        // SYSCLK divided by 8
 | 
				
			||||
#define RCC_CFGR_HPRE_DIV16                 0x000000B0        // SYSCLK divided by 16
 | 
				
			||||
#define RCC_CFGR_HPRE_DIV64                 0x000000C0        // SYSCLK divided by 64
 | 
				
			||||
#define RCC_CFGR_HPRE_DIV128                0x000000D0        // SYSCLK divided by 128
 | 
				
			||||
#define RCC_CFGR_HPRE_DIV256                0x000000E0        // SYSCLK divided by 256
 | 
				
			||||
#define RCC_CFGR_HPRE_DIV512                0x000000F0        // SYSCLK divided by 512
 | 
				
			||||
 | 
				
			||||
#define RCC_CFGR_PPRE1                      0x00000700        // PRE1[2:0] bits (APB1 prescaler)
 | 
				
			||||
 | 
				
			||||
// PPRE1 configuration
 | 
				
			||||
#define RCC_CFGR_PPRE1_DIV1                 0x00000000        // HCLK not divided
 | 
				
			||||
#define RCC_CFGR_PPRE1_DIV2                 0x00000400        // HCLK divided by 2
 | 
				
			||||
#define RCC_CFGR_PPRE1_DIV4                 0x00000500        // HCLK divided by 4
 | 
				
			||||
#define RCC_CFGR_PPRE1_DIV8                 0x00000600        // HCLK divided by 8
 | 
				
			||||
#define RCC_CFGR_PPRE1_DIV16                0x00000700        // HCLK divided by 16
 | 
				
			||||
 | 
				
			||||
#define RCC_CFGR_PPRE2                      0x00003800        // PRE2[2:0] bits (APB2 prescaler)
 | 
				
			||||
 | 
				
			||||
// PPRE2 configuration
 | 
				
			||||
#define RCC_CFGR_PPRE2_DIV1                 0x00000000        // HCLK not divided
 | 
				
			||||
#define RCC_CFGR_PPRE2_DIV2                 0x00002000        // HCLK divided by 2
 | 
				
			||||
#define RCC_CFGR_PPRE2_DIV4                 0x00002800        // HCLK divided by 4
 | 
				
			||||
#define RCC_CFGR_PPRE2_DIV8                 0x00003000        // HCLK divided by 8
 | 
				
			||||
#define RCC_CFGR_PPRE2_DIV16                0x00003800        // HCLK divided by 16
 | 
				
			||||
 | 
				
			||||
// PLL entry clock source
 | 
				
			||||
#define RCC_CFGR_PLLSRC                     0x00010000        // PLL entry clock source
 | 
				
			||||
 | 
				
			||||
#define RCC_CFGR_PLLSRC_HSI                 0x00000000        // HSI as PLL entry clock source
 | 
				
			||||
#define RCC_CFGR_PLLSRC_HSE                 0x00010000        // HSE as PLL entry clock source
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#define RCC_CFGR_PLLMUL                     0x003C0000        // PLLMUL[3:0] bits (PLL multiplication factor)
 | 
				
			||||
 | 
				
			||||
// PLLMUL configuration
 | 
				
			||||
#define RCC_CFGR_PLLMUL3                    0x00000000        // PLL input clock * 3
 | 
				
			||||
#define RCC_CFGR_PLLMUL4                    0x00040000        // PLL input clock * 4
 | 
				
			||||
#define RCC_CFGR_PLLMUL6                    0x00080000        // PLL input clock * 6
 | 
				
			||||
#define RCC_CFGR_PLLMUL8                    0x000C0000        // PLL input clock * 8
 | 
				
			||||
#define RCC_CFGR_PLLMUL12                   0x00100000        // PLL input clock * 12
 | 
				
			||||
#define RCC_CFGR_PLLMUL16                   0x00140000        // PLL input clock * 16
 | 
				
			||||
#define RCC_CFGR_PLLMUL24                   0x00180000        // PLL input clock * 24
 | 
				
			||||
#define RCC_CFGR_PLLMUL32                   0x001C0000        // PLL input clock * 32
 | 
				
			||||
#define RCC_CFGR_PLLMUL48                   0x00200000        // PLL input clock * 48
 | 
				
			||||
 | 
				
			||||
// PLLDIV configuration
 | 
				
			||||
#define RCC_CFGR_PLLDIV                     0x00C00000        // PLLDIV[1:0] bits (PLL Output Division)
 | 
				
			||||
 | 
				
			||||
// PLLDIV configuration
 | 
				
			||||
#define RCC_CFGR_PLLDIV1                    0x00000000        // PLL clock output = CKVCO / 1
 | 
				
			||||
#define RCC_CFGR_PLLDIV2                    0x00400000        // PLL clock output = CKVCO / 2
 | 
				
			||||
#define RCC_CFGR_PLLDIV3                    0x00800000        // PLL clock output = CKVCO / 3
 | 
				
			||||
#define RCC_CFGR_PLLDIV4                    0x00C00000        // PLL clock output = CKVCO / 4
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#define RCC_CFGR_MCOSEL                     0x07000000        // MCO[2:0] bits (Microcontroller Clock Output)
 | 
				
			||||
 | 
				
			||||
// MCO configuration
 | 
				
			||||
#define RCC_CFGR_MCO_NOCLOCK                0x00000000        // No clock
 | 
				
			||||
#define RCC_CFGR_MCO_SYSCLK                 0x01000000        // System clock selected
 | 
				
			||||
#define RCC_CFGR_MCO_HSI                    0x02000000        // Internal 16 MHz RC oscillator clock selected
 | 
				
			||||
#define RCC_CFGR_MCO_MSI                    0x03000000        // Internal Medium Speed RC oscillator clock selected
 | 
				
			||||
#define RCC_CFGR_MCO_HSE                    0x04000000        // External 1-25 MHz oscillator clock selected
 | 
				
			||||
#define RCC_CFGR_MCO_PLL                    0x05000000        // PLL clock divided
 | 
				
			||||
#define RCC_CFGR_MCO_LSI                    0x06000000        // LSI selected
 | 
				
			||||
#define RCC_CFGR_MCO_LSE                    0x07000000        // LSE selected
 | 
				
			||||
 | 
				
			||||
#define RCC_CFGR_MCOPRE                     0x70000000        // MCOPRE[2:0] bits (Microcontroller Clock Output Prescaler)
 | 
				
			||||
 | 
				
			||||
// MCO Prescaler configuration
 | 
				
			||||
#define RCC_CFGR_MCO_DIV1                   0x00000000        // MCO Clock divided by 1
 | 
				
			||||
#define RCC_CFGR_MCO_DIV2                   0x10000000        // MCO Clock divided by 2
 | 
				
			||||
#define RCC_CFGR_MCO_DIV4                   0x20000000        // MCO Clock divided by 4
 | 
				
			||||
#define RCC_CFGR_MCO_DIV8                   0x30000000        // MCO Clock divided by 8
 | 
				
			||||
#define RCC_CFGR_MCO_DIV16                  0x40000000        // MCO Clock divided by 16
 | 
				
			||||
 | 
				
			||||
// ******************  Bit definition for RCC_CIR register  *******************
 | 
				
			||||
#define RCC_CIR_LSIRDYF                     0x00000001        // LSI Ready Interrupt flag
 | 
				
			||||
#define RCC_CIR_LSERDYF                     0x00000002        // LSE Ready Interrupt flag
 | 
				
			||||
#define RCC_CIR_HSIRDYF                     0x00000004        // HSI Ready Interrupt flag
 | 
				
			||||
#define RCC_CIR_HSERDYF                     0x00000008        // HSE Ready Interrupt flag
 | 
				
			||||
#define RCC_CIR_PLLRDYF                     0x00000010        // PLL Ready Interrupt flag
 | 
				
			||||
#define RCC_CIR_MSIRDYF                     0x00000020        // MSI Ready Interrupt flag
 | 
				
			||||
#define RCC_CIR_LSECSS                      0x00000040        // LSE CSS Interrupt flag
 | 
				
			||||
#define RCC_CIR_CSSF                        0x00000080        // Clock Security System Interrupt flag
 | 
				
			||||
 | 
				
			||||
#define RCC_CIR_LSIRDYIE                    0x00000100        // LSI Ready Interrupt Enable
 | 
				
			||||
#define RCC_CIR_LSERDYIE                    0x00000200        // LSE Ready Interrupt Enable
 | 
				
			||||
#define RCC_CIR_HSIRDYIE                    0x00000400        // HSI Ready Interrupt Enable
 | 
				
			||||
#define RCC_CIR_HSERDYIE                    0x00000800        // HSE Ready Interrupt Enable
 | 
				
			||||
#define RCC_CIR_PLLRDYIE                    0x00001000        // PLL Ready Interrupt Enable
 | 
				
			||||
#define RCC_CIR_MSIRDYIE                    0x00002000        // MSI Ready Interrupt Enable
 | 
				
			||||
#define RCC_CIR_LSECSSIE                    0x00004000        // LSE CSS Interrupt Enable
 | 
				
			||||
 | 
				
			||||
#define RCC_CIR_LSIRDYC                     0x00010000        // LSI Ready Interrupt Clear
 | 
				
			||||
#define RCC_CIR_LSERDYC                     0x00020000        // LSE Ready Interrupt Clear
 | 
				
			||||
#define RCC_CIR_HSIRDYC                     0x00040000        // HSI Ready Interrupt Clear
 | 
				
			||||
#define RCC_CIR_HSERDYC                     0x00080000        // HSE Ready Interrupt Clear
 | 
				
			||||
#define RCC_CIR_PLLRDYC                     0x00100000        // PLL Ready Interrupt Clear
 | 
				
			||||
#define RCC_CIR_MSIRDYC                     0x00200000        // MSI Ready Interrupt Clear
 | 
				
			||||
#define RCC_CIR_LSECSSC                     0x00400000        // LSE CSS Interrupt Clear
 | 
				
			||||
#define RCC_CIR_CSSC                        0x00800000        // Clock Security System Interrupt Clear
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//****************  Bit definition for RCC_AHBRSTR register  *****************
 | 
				
			||||
#define RCC_AHBRSTR_GPIOARST                0x00000001        // GPIO port A reset
 | 
				
			||||
#define RCC_AHBRSTR_GPIOBRST                0x00000002        // GPIO port B reset
 | 
				
			||||
#define RCC_AHBRSTR_GPIOCRST                0x00000004        // GPIO port C reset
 | 
				
			||||
#define RCC_AHBRSTR_GPIODRST                0x00000008        // GPIO port D reset
 | 
				
			||||
#define RCC_AHBRSTR_GPIOERST                0x00000010        // GPIO port E reset
 | 
				
			||||
#define RCC_AHBRSTR_GPIOHRST                0x00000020        // GPIO port H reset
 | 
				
			||||
#define RCC_AHBRSTR_GPIOFRST                0x00000040        // GPIO port F reset
 | 
				
			||||
#define RCC_AHBRSTR_GPIOGRST                0x00000080        // GPIO port G reset
 | 
				
			||||
#define RCC_AHBRSTR_CRCRST                  0x00001000        // CRC reset
 | 
				
			||||
#define RCC_AHBRSTR_FLITFRST                0x00008000        // FLITF reset
 | 
				
			||||
#define RCC_AHBRSTR_DMA1RST                 0x01000000        // DMA1 reset
 | 
				
			||||
#define RCC_AHBRSTR_DMA2RST                 0x02000000        // DMA2 reset
 | 
				
			||||
#define RCC_AHBRSTR_AESRST                  0x08000000        // AES reset
 | 
				
			||||
#define RCC_AHBRSTR_FSMCRST                 0x40000000        // FSMC reset
 | 
				
			||||
 | 
				
			||||
//****************  Bit definition for RCC_APB2RSTR register  ****************
 | 
				
			||||
#define RCC_APB2RSTR_SYSCFGRST              0x00000001        // System Configuration SYSCFG reset
 | 
				
			||||
#define RCC_APB2RSTR_TIM9RST                0x00000004        // TIM9 reset
 | 
				
			||||
#define RCC_APB2RSTR_TIM10RST               0x00000008        // TIM10 reset
 | 
				
			||||
#define RCC_APB2RSTR_TIM11RST               0x00000010        // TIM11 reset
 | 
				
			||||
#define RCC_APB2RSTR_ADC1RST                0x00000200        // ADC1 reset
 | 
				
			||||
#define RCC_APB2RSTR_SDIORST                0x00000800        // SDIO reset
 | 
				
			||||
#define RCC_APB2RSTR_SPI1RST                0x00001000        // SPI1 reset
 | 
				
			||||
#define RCC_APB2RSTR_USART1RST              0x00004000        // USART1 reset
 | 
				
			||||
 | 
				
			||||
//****************  Bit definition for RCC_APB1RSTR register  ****************
 | 
				
			||||
#define RCC_APB1RSTR_TIM2RST                0x00000001        // Timer 2 reset
 | 
				
			||||
#define RCC_APB1RSTR_TIM3RST                0x00000002        // Timer 3 reset
 | 
				
			||||
#define RCC_APB1RSTR_TIM4RST                0x00000004        // Timer 4 reset
 | 
				
			||||
#define RCC_APB1RSTR_TIM5RST                0x00000008        // Timer 5 reset
 | 
				
			||||
#define RCC_APB1RSTR_TIM6RST                0x00000010        // Timer 6 reset
 | 
				
			||||
#define RCC_APB1RSTR_TIM7RST                0x00000020        // Timer 7 reset
 | 
				
			||||
#define RCC_APB1RSTR_LCDRST                 0x00000200        // LCD reset
 | 
				
			||||
#define RCC_APB1RSTR_WWDGRST                0x00000800        // Window Watchdog reset
 | 
				
			||||
#define RCC_APB1RSTR_SPI2RST                0x00004000        // SPI 2 reset
 | 
				
			||||
#define RCC_APB1RSTR_SPI3RST                0x00008000        // SPI 3 reset
 | 
				
			||||
#define RCC_APB1RSTR_USART2RST              0x00020000        // USART 2 reset
 | 
				
			||||
#define RCC_APB1RSTR_USART3RST              0x00040000        // USART 3 reset
 | 
				
			||||
#define RCC_APB1RSTR_UART4RST               0x00080000        // UART 4 reset
 | 
				
			||||
#define RCC_APB1RSTR_UART5RST               0x00100000        // UART 5 reset
 | 
				
			||||
#define RCC_APB1RSTR_I2C1RST                0x00200000        // I2C 1 reset
 | 
				
			||||
#define RCC_APB1RSTR_I2C2RST                0x00400000        // I2C 2 reset
 | 
				
			||||
#define RCC_APB1RSTR_USBRST                 0x00800000        // USB reset
 | 
				
			||||
#define RCC_APB1RSTR_PWRRST                 0x10000000        // Power interface reset
 | 
				
			||||
#define RCC_APB1RSTR_DACRST                 0x20000000        // DAC interface reset
 | 
				
			||||
#define RCC_APB1RSTR_COMPRST                0x80000000        // Comparator interface reset
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for RCC_AHBENR register  *****************
 | 
				
			||||
#define RCC_AHBENR_GPIOAEN                  0x00000001        // GPIO port A clock enable
 | 
				
			||||
#define RCC_AHBENR_GPIOBEN                  0x00000002        // GPIO port B clock enable
 | 
				
			||||
#define RCC_AHBENR_GPIOCEN                  0x00000004        // GPIO port C clock enable
 | 
				
			||||
#define RCC_AHBENR_GPIODEN                  0x00000008        // GPIO port D clock enable
 | 
				
			||||
#define RCC_AHBENR_GPIOEEN                  0x00000010        // GPIO port E clock enable
 | 
				
			||||
#define RCC_AHBENR_GPIOHEN                  0x00000020        // GPIO port H clock enable
 | 
				
			||||
#define RCC_AHBENR_GPIOFEN                  0x00000040        // GPIO port F clock enable
 | 
				
			||||
#define RCC_AHBENR_GPIOGEN                  0x00000080        // GPIO port G clock enable
 | 
				
			||||
#define RCC_AHBENR_CRCEN                    0x00001000        // CRC clock enable
 | 
				
			||||
#define RCC_AHBENR_FLITFEN                  0x00008000        // FLITF clock enable (has effect only when the Flash memory is in power down mode)
 | 
				
			||||
#define RCC_AHBENR_DMA1EN                   0x01000000        // DMA1 clock enable
 | 
				
			||||
#define RCC_AHBENR_DMA2EN                   0x02000000        // DMA2 clock enable
 | 
				
			||||
#define RCC_AHBENR_AESEN                    0x08000000        // AES clock enable
 | 
				
			||||
#define RCC_AHBENR_FSMCEN                   0x40000000        // FSMC clock enable
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for RCC_APB2ENR register  ****************
 | 
				
			||||
#define RCC_APB2ENR_SYSCFGEN                0x00000001         // System Configuration SYSCFG clock enable
 | 
				
			||||
#define RCC_APB2ENR_TIM9EN                  0x00000004         // TIM9 interface clock enable
 | 
				
			||||
#define RCC_APB2ENR_TIM10EN                 0x00000008         // TIM10 interface clock enable
 | 
				
			||||
#define RCC_APB2ENR_TIM11EN                 0x00000010         // TIM11 Timer clock enable
 | 
				
			||||
#define RCC_APB2ENR_ADC1EN                  0x00000200         // ADC1 clock enable
 | 
				
			||||
#define RCC_APB2ENR_SDIOEN                  0x00000800         // SDIO clock enable
 | 
				
			||||
#define RCC_APB2ENR_SPI1EN                  0x00001000         // SPI1 clock enable
 | 
				
			||||
#define RCC_APB2ENR_USART1EN                0x00004000         // USART1 clock enable
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//****************  Bit definition for RCC_APB1ENR register  *****************
 | 
				
			||||
#define RCC_APB1ENR_TIM2EN                  0x00000001        // Timer 2 clock enabled
 | 
				
			||||
#define RCC_APB1ENR_TIM3EN                  0x00000002        // Timer 3 clock enable
 | 
				
			||||
#define RCC_APB1ENR_TIM4EN                  0x00000004        // Timer 4 clock enable
 | 
				
			||||
#define RCC_APB1ENR_TIM5EN                  0x00000008        // Timer 5 clock enable
 | 
				
			||||
#define RCC_APB1ENR_TIM6EN                  0x00000010        // Timer 6 clock enable
 | 
				
			||||
#define RCC_APB1ENR_TIM7EN                  0x00000020        // Timer 7 clock enable
 | 
				
			||||
#define RCC_APB1ENR_LCDEN                   0x00000200        // LCD clock enable
 | 
				
			||||
#define RCC_APB1ENR_WWDGEN                  0x00000800        // Window Watchdog clock enable
 | 
				
			||||
#define RCC_APB1ENR_SPI2EN                  0x00004000        // SPI 2 clock enable
 | 
				
			||||
#define RCC_APB1ENR_SPI3EN                  0x00008000        // SPI 3 clock enable
 | 
				
			||||
#define RCC_APB1ENR_USART2EN                0x00020000        // USART 2 clock enable
 | 
				
			||||
#define RCC_APB1ENR_USART3EN                0x00040000        // USART 3 clock enable
 | 
				
			||||
#define RCC_APB1ENR_UART4EN                 0x00080000        // UART 4 clock enable
 | 
				
			||||
#define RCC_APB1ENR_UART5EN                 0x00100000        // UART 5 clock enable
 | 
				
			||||
#define RCC_APB1ENR_I2C1EN                  0x00200000        // I2C 1 clock enable
 | 
				
			||||
#define RCC_APB1ENR_I2C2EN                  0x00400000        // I2C 2 clock enable
 | 
				
			||||
#define RCC_APB1ENR_USBEN                   0x00800000        // USB clock enable
 | 
				
			||||
#define RCC_APB1ENR_PWREN                   0x10000000        // Power interface clock enable
 | 
				
			||||
#define RCC_APB1ENR_DACEN                   0x20000000        // DAC interface clock enable
 | 
				
			||||
#define RCC_APB1ENR_COMPEN                  0x80000000        // Comparator interface clock enable
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for RCC_AHBLPENR register  ***************
 | 
				
			||||
#define RCC_AHBLPENR_GPIOALPEN              0x00000001        // GPIO port A clock enabled in sleep mode
 | 
				
			||||
#define RCC_AHBLPENR_GPIOBLPEN              0x00000002        // GPIO port B clock enabled in sleep mode
 | 
				
			||||
#define RCC_AHBLPENR_GPIOCLPEN              0x00000004        // GPIO port C clock enabled in sleep mode
 | 
				
			||||
#define RCC_AHBLPENR_GPIODLPEN              0x00000008        // GPIO port D clock enabled in sleep mode
 | 
				
			||||
#define RCC_AHBLPENR_GPIOELPEN              0x00000010        // GPIO port E clock enabled in sleep mode
 | 
				
			||||
#define RCC_AHBLPENR_GPIOHLPEN              0x00000020        // GPIO port H clock enabled in sleep mode
 | 
				
			||||
#define RCC_AHBLPENR_GPIOFLPEN              0x00000040        // GPIO port F clock enabled in sleep mode
 | 
				
			||||
#define RCC_AHBLPENR_GPIOGLPEN              0x00000080        // GPIO port G clock enabled in sleep mode
 | 
				
			||||
#define RCC_AHBLPENR_CRCLPEN                0x00001000        // CRC clock enabled in sleep mode
 | 
				
			||||
#define RCC_AHBLPENR_FLITFLPEN              0x00008000        // Flash Interface clock enabled in sleep mode (has effect only when the Flash memory is in power down mode)
 | 
				
			||||
#define RCC_AHBLPENR_SRAMLPEN               0x00010000        // SRAM clock enabled in sleep mode
 | 
				
			||||
#define RCC_AHBLPENR_DMA1LPEN               0x01000000        // DMA1 clock enabled in sleep mode
 | 
				
			||||
#define RCC_AHBLPENR_DMA2LPEN               0x02000000        // DMA2 clock enabled in sleep mode
 | 
				
			||||
#define RCC_AHBLPENR_AESLPEN                0x08000000        // AES clock enabled in sleep mode
 | 
				
			||||
#define RCC_AHBLPENR_FSMCLPEN               0x40000000        // FSMC clock enabled in sleep mode
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for RCC_APB2LPENR register  **************
 | 
				
			||||
#define RCC_APB2LPENR_SYSCFGLPEN            0x00000001         // System Configuration SYSCFG clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB2LPENR_TIM9LPEN              0x00000004         // TIM9 interface clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB2LPENR_TIM10LPEN             0x00000008         // TIM10 interface clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB2LPENR_TIM11LPEN             0x00000010         // TIM11 Timer clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB2LPENR_ADC1LPEN              0x00000200         // ADC1 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB2LPENR_SDIOLPEN              0x00000800         // SDIO clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB2LPENR_SPI1LPEN              0x00001000         // SPI1 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB2LPENR_USART1LPEN            0x00004000         // USART1 clock enabled in sleep mode
 | 
				
			||||
 | 
				
			||||
//****************  Bit definition for RCC_APB1LPENR register  ***************
 | 
				
			||||
#define RCC_APB1LPENR_TIM2LPEN              0x00000001        // Timer 2 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_TIM3LPEN              0x00000002        // Timer 3 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_TIM4LPEN              0x00000004        // Timer 4 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_TIM5LPEN              0x00000008        // Timer 5 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_TIM6LPEN              0x00000010        // Timer 6 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_TIM7LPEN              0x00000020        // Timer 7 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_LCDLPEN               0x00000200        // LCD clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_WWDGLPEN              0x00000800        // Window Watchdog clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_SPI2LPEN              0x00004000        // SPI 2 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_SPI3LPEN              0x00008000        // SPI 3 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_USART2LPEN            0x00020000        // USART 2 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_USART3LPEN            0x00040000        // USART 3 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_UART4LPEN             0x00080000        // UART 4 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_UART5LPEN             0x00100000        // UART 5 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_I2C1LPEN              0x00200000        // I2C 1 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_I2C2LPEN              0x00400000        // I2C 2 clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_USBLPEN               0x00800000        // USB clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_PWRLPEN               0x10000000        // Power interface clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_DACLPEN               0x20000000        // DAC interface clock enabled in sleep mode
 | 
				
			||||
#define RCC_APB1LPENR_COMPLPEN              0x80000000        // Comparator interface clock enabled in sleep mode
 | 
				
			||||
 | 
				
			||||
//******************  Bit definition for RCC_CSR register  *******************
 | 
				
			||||
#define RCC_CSR_LSION                      0x00000001        // Internal Low Speed oscillator enable
 | 
				
			||||
#define RCC_CSR_LSIRDY                     0x00000002        // Internal Low Speed oscillator Ready
 | 
				
			||||
 | 
				
			||||
#define RCC_CSR_LSEON                      0x00000100        // External Low Speed oscillator enable
 | 
				
			||||
#define RCC_CSR_LSERDY                     0x00000200        // External Low Speed oscillator Ready
 | 
				
			||||
#define RCC_CSR_LSEBYP                     0x00000400        // External Low Speed oscillator Bypass
 | 
				
			||||
#define RCC_CSR_LSECSSON                   0x00000800        // External Low Speed oscillator CSS Enable
 | 
				
			||||
#define RCC_CSR_LSECSSD                    0x00001000        // External Low Speed oscillator CSS Detected
 | 
				
			||||
 | 
				
			||||
#define RCC_CSR_RTCSEL                     0x00030000        // RTCSEL[1:0] bits (RTC clock source selection)
 | 
				
			||||
#define RCC_CSR_RTCSEL_0                   0x00010000        // Bit 0
 | 
				
			||||
#define RCC_CSR_RTCSEL_1                   0x00020000        // Bit 1
 | 
				
			||||
 | 
				
			||||
// RTC congiguration
 | 
				
			||||
#define RCC_CSR_RTCSEL_NOCLOCK             0x00000000        // No clock
 | 
				
			||||
#define RCC_CSR_RTCSEL_LSE                 0x00010000        // LSE oscillator clock used as RTC clock
 | 
				
			||||
#define RCC_CSR_RTCSEL_LSI                 0x00020000        // LSI oscillator clock used as RTC clock
 | 
				
			||||
#define RCC_CSR_RTCSEL_HSE                 0x00030000        // HSE oscillator clock divided by 2, 4, 8 or 16 by RTCPRE used as RTC clock
 | 
				
			||||
 | 
				
			||||
#define RCC_CSR_RTCEN                      0x00400000        // RTC clock enable
 | 
				
			||||
#define RCC_CSR_RTCRST                     0x00800000        // RTC reset
 | 
				
			||||
 | 
				
			||||
#define RCC_CSR_RMVF                       0x01000000        // Remove reset flag
 | 
				
			||||
#define RCC_CSR_OBLRSTF                    0x02000000        // Option Bytes Loader reset flag
 | 
				
			||||
#define RCC_CSR_PINRSTF                    0x04000000        // PIN reset flag
 | 
				
			||||
#define RCC_CSR_PORRSTF                    0x08000000        // POR/PDR reset flag
 | 
				
			||||
#define RCC_CSR_SFTRSTF                    0x10000000        // Software Reset flag
 | 
				
			||||
#define RCC_CSR_IWDGRSTF                   0x20000000        // Independent Watchdog reset flag
 | 
				
			||||
#define RCC_CSR_WWDGRSTF                   0x40000000        // Window watchdog reset flag
 | 
				
			||||
#define RCC_CSR_LPWRRSTF                   0x80000000        // Low-Power reset flag
 | 
				
			||||
@ -0,0 +1,57 @@ | 
				
			||||
#pragma once | 
				
			||||
 | 
				
			||||
#include "common.h" | 
				
			||||
 | 
				
			||||
// AUTHOR : Ondrej Hruska
 | 
				
			||||
// DATE   : 12/2015
 | 
				
			||||
// DESCR  : Control registers and bit masks for SysTick
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//****************************************************************************
 | 
				
			||||
//*
 | 
				
			||||
//*                               REGISTERS
 | 
				
			||||
//*
 | 
				
			||||
//****************************************************************************
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
#define SysTick_CSR           MMIO32(_SCS_BASE + 0x010)        // (R/W) SysTick Control and Status Register
 | 
				
			||||
#define SysTick_RELOAD        MMIO32(_SCS_BASE + 0x014)        // (R/W) SysTick Reload Value Register
 | 
				
			||||
#define SysTick_VAL           MMIO32(_SCS_BASE + 0x018)        // (R/W) SysTick Current Value Register
 | 
				
			||||
#define SysTick_CALIB         MMIO32(_SCS_BASE + 0x01C)        // (R/ ) SysTick Calibration Value Register
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//****************************************************************************
 | 
				
			||||
//*
 | 
				
			||||
//*                       BIT MASKS AND DEFINITIONS
 | 
				
			||||
//*
 | 
				
			||||
//****************************************************************************
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//****************  Bit definition for SysTick_CSR register  ****************
 | 
				
			||||
 | 
				
			||||
#define SysTick_CSR_ENABLE                 0x00000001    // Counter enable
 | 
				
			||||
#define SysTick_CSR_TICKINT                0x00000002    // Enable interrupt when counter reaches zero
 | 
				
			||||
#define SysTick_CSR_CLKSOURCE              0x00000004    // Clock source (0 - external, 1 - core clock)
 | 
				
			||||
 | 
				
			||||
#define SysTick_CSR_CLKSOURCE_CORE         0x00000004    // Clock source - core clock
 | 
				
			||||
#define SysTick_CSR_CLKSOURCE_DIV8         0x00000000    // Clock source - core clock / 8
 | 
				
			||||
 | 
				
			||||
#define SysTick_CSR_COUNTFLAG              0x00010000    // Count Flag (only if interrupt is disabled)
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//****************  Bit definition for SysTick_LOAD register  ****************
 | 
				
			||||
 | 
				
			||||
#define SysTick_RELOAD_MASK                0x00FFFFFF    // Reload value used when the counter reaches 0
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//****************  Bit definition for SysTick_VAL register  *****************
 | 
				
			||||
 | 
				
			||||
#define SysTick_VAL_MASK                   0x00FFFFFF    // Current value at the time the register is accessed
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//****************  Bit definition for SysTick_CALIB register  ***************
 | 
				
			||||
 | 
				
			||||
#define SysTick_CALIB_TENMS                0x00FFFFFF    // Reload value to use for 10ms timing
 | 
				
			||||
#define SysTick_CALIB_SKEW                 0x40000000    // Calibration value is not exactly 10 ms
 | 
				
			||||
#define SysTick_CALIB_NOREF                0x80000000    // The reference clock is not provided
 | 
				
			||||
@ -0,0 +1,149 @@ | 
				
			||||
// AUTHOR : Ondrej Hruska
 | 
				
			||||
// DATE   : 12/2015
 | 
				
			||||
// DESCR  : Control registers and bit masks for USART
 | 
				
			||||
//
 | 
				
			||||
//      Universal Synchronous Asynchronous Receiver Transmitter (USART)
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//****************************************************************************
 | 
				
			||||
//*
 | 
				
			||||
//*                               REGISTERS
 | 
				
			||||
//*
 | 
				
			||||
//****************************************************************************
 | 
				
			||||
 | 
				
			||||
// USART 1
 | 
				
			||||
 | 
				
			||||
#define USART1_SR           MMIO32(_USART1 + 0x00) // USART1 Status register,
 | 
				
			||||
#define USART1_DR           MMIO32(_USART1 + 0x04) // USART1 Data register,
 | 
				
			||||
#define USART1_BRR          MMIO32(_USART1 + 0x08) // USART1 Baud rate register,
 | 
				
			||||
#define USART1_CR1          MMIO32(_USART1 + 0x0C) // USART1 Control register 1,
 | 
				
			||||
#define USART1_CR2          MMIO32(_USART1 + 0x10) // USART1 Control register 2,
 | 
				
			||||
#define USART1_CR3          MMIO32(_USART1 + 0x14) // USART1 Control register 3,
 | 
				
			||||
#define USART1_GTPR         MMIO32(_USART1 + 0x18) // USART1 Guard time and prescaler register,
 | 
				
			||||
 | 
				
			||||
// USART 2
 | 
				
			||||
 | 
				
			||||
#define USART2_SR         MMIO32(_USART2 + 0x00) // USART2 Status register,
 | 
				
			||||
#define USART2_DR         MMIO32(_USART2 + 0x04) // USART2 Data register,
 | 
				
			||||
#define USART2_BRR        MMIO32(_USART2 + 0x08) // USART2 Baud rate register,
 | 
				
			||||
#define USART2_CR1        MMIO32(_USART2 + 0x0C) // USART2 Control register 1,
 | 
				
			||||
#define USART2_CR2        MMIO32(_USART2 + 0x10) // USART2 Control register 2,
 | 
				
			||||
#define USART2_CR3        MMIO32(_USART2 + 0x14) // USART2 Control register 3,
 | 
				
			||||
#define USART2_GTPR       MMIO32(_USART2 + 0x18) // USART2 Guard time and prescaler register,
 | 
				
			||||
 | 
				
			||||
// USART 3
 | 
				
			||||
 | 
				
			||||
#define USART3_SR         MMIO32(_USART3 + 0x00) // USART3 Status register,
 | 
				
			||||
#define USART3_DR         MMIO32(_USART3 + 0x04) // USART3 Data register,
 | 
				
			||||
#define USART3_BRR        MMIO32(_USART3 + 0x08) // USART3 Baud rate register,
 | 
				
			||||
#define USART3_CR1        MMIO32(_USART3 + 0x0C) // USART3 Control register 1,
 | 
				
			||||
#define USART3_CR2        MMIO32(_USART3 + 0x10) // USART3 Control register 2,
 | 
				
			||||
#define USART3_CR3        MMIO32(_USART3 + 0x14) // USART3 Control register 3,
 | 
				
			||||
#define USART3_GTPR       MMIO32(_USART3 + 0x18) // USART3 Guard time and prescaler register,
 | 
				
			||||
 | 
				
			||||
// USART 4
 | 
				
			||||
 | 
				
			||||
#define UART4_SR          MMIO32(_UART4 + 0x00) // UART4 Status register,
 | 
				
			||||
#define UART4_DR          MMIO32(_UART4 + 0x04) // UART4 Data register,
 | 
				
			||||
#define UART4_BRR         MMIO32(_UART4 + 0x08) // UART4 Baud rate register,
 | 
				
			||||
#define UART4_CR1         MMIO32(_UART4 + 0x0C) // UART4 Control register 1,
 | 
				
			||||
#define UART4_CR2         MMIO32(_UART4 + 0x10) // UART4 Control register 2,
 | 
				
			||||
#define UART4_CR3         MMIO32(_UART4 + 0x14) // UART4 Control register 3,
 | 
				
			||||
#define UART4_GTPR        MMIO32(_UART4 + 0x18) // UART4 Guard time and prescaler register,
 | 
				
			||||
 | 
				
			||||
// USART 5
 | 
				
			||||
 | 
				
			||||
#define UART5_SR          MMIO32(_UART5 + 0x00) // UART5 Status register,
 | 
				
			||||
#define UART5_DR          MMIO32(_UART5 + 0x04) // UART5 Data register,
 | 
				
			||||
#define UART5_BRR         MMIO32(_UART5 + 0x08) // UART5 Baud rate register,
 | 
				
			||||
#define UART5_CR1         MMIO32(_UART5 + 0x0C) // UART5 Control register 1,
 | 
				
			||||
#define UART5_CR2         MMIO32(_UART5 + 0x10) // UART5 Control register 2,
 | 
				
			||||
#define UART5_CR3         MMIO32(_UART5 + 0x14) // UART5 Control register 3,
 | 
				
			||||
#define UART5_GTPR        MMIO32(_UART5 + 0x18) // UART5 Guard time and prescaler register,
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//****************************************************************************
 | 
				
			||||
//*
 | 
				
			||||
//*                       BIT MASKS AND DEFINITIONS
 | 
				
			||||
//*
 | 
				
			||||
//****************************************************************************
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
//******************  Bit definition for USART_SR register  ******************
 | 
				
			||||
#define USART_SR_PE                         0x0001            // Parity Error
 | 
				
			||||
#define USART_SR_FE                         0x0002            // Framing Error
 | 
				
			||||
#define USART_SR_NE                         0x0004            // Noise Error Flag
 | 
				
			||||
#define USART_SR_ORE                        0x0008            // OverRun Error
 | 
				
			||||
#define USART_SR_IDLE                       0x0010            // IDLE line detected
 | 
				
			||||
#define USART_SR_RXNE                       0x0020            // Read Data Register Not Empty
 | 
				
			||||
#define USART_SR_TC                         0x0040            // Transmission Complete
 | 
				
			||||
#define USART_SR_TXE                        0x0080            // Transmit Data Register Empty
 | 
				
			||||
#define USART_SR_LBD                        0x0100            // LIN Break Detection Flag
 | 
				
			||||
#define USART_SR_CTS                        0x0200            // CTS Flag
 | 
				
			||||
 | 
				
			||||
//******************  Bit definition for USART_DR register  ******************
 | 
				
			||||
#define USART_DR_DR                         0x01FF            // Data value
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for USART_BRR register  ******************
 | 
				
			||||
#define USART_BRR_DIV_FRACTION              0x000F            // Fraction of USARTDIV
 | 
				
			||||
#define USART_BRR_DIV_MANTISSA              0xFFF0            // Mantissa of USARTDIV
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for USART_CR1 register  ******************
 | 
				
			||||
#define USART_CR1_SBK                       0x0001            // Send Break
 | 
				
			||||
#define USART_CR1_RWU                       0x0002            // Receiver wakeup
 | 
				
			||||
#define USART_CR1_RE                        0x0004            // Receiver Enable
 | 
				
			||||
#define USART_CR1_TE                        0x0008            // Transmitter Enable
 | 
				
			||||
#define USART_CR1_IDLEIE                    0x0010            // IDLE Interrupt Enable
 | 
				
			||||
#define USART_CR1_RXNEIE                    0x0020            // RXNE Interrupt Enable
 | 
				
			||||
#define USART_CR1_TCIE                      0x0040            // Transmission Complete Interrupt Enable
 | 
				
			||||
#define USART_CR1_TXEIE                     0x0080            // PE Interrupt Enable
 | 
				
			||||
#define USART_CR1_PEIE                      0x0100            // PE Interrupt Enable
 | 
				
			||||
#define USART_CR1_PS                        0x0200            // Parity Selection
 | 
				
			||||
#define USART_CR1_PCE                       0x0400            // Parity Control Enable
 | 
				
			||||
#define USART_CR1_WAKE                      0x0800            // Wakeup method
 | 
				
			||||
#define USART_CR1_M                         0x1000            // Word length
 | 
				
			||||
#define USART_CR1_UE                        0x2000            // USART Enable
 | 
				
			||||
#define USART_CR1_OVER8                     0x8000            // Oversampling by 8-bit mode
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for USART_CR2 register  ******************
 | 
				
			||||
#define USART_CR2_ADD                       0x000F            // Address of the USART node
 | 
				
			||||
#define USART_CR2_LBDL                      0x0020            // LIN Break Detection Length
 | 
				
			||||
#define USART_CR2_LBDIE                     0x0040            // LIN Break Detection Interrupt Enable
 | 
				
			||||
#define USART_CR2_LBCL                      0x0100            // Last Bit Clock pulse
 | 
				
			||||
#define USART_CR2_CPHA                      0x0200            // Clock Phase
 | 
				
			||||
#define USART_CR2_CPOL                      0x0400            // Clock Polarity
 | 
				
			||||
#define USART_CR2_CLKEN                     0x0800            // Clock Enable
 | 
				
			||||
 | 
				
			||||
#define USART_CR2_STOP                      0x3000            // STOP[1:0] bits (STOP bits)
 | 
				
			||||
#define USART_CR2_STOP_0                    0x1000            // Bit 0
 | 
				
			||||
#define USART_CR2_STOP_1                    0x2000            // Bit 1
 | 
				
			||||
 | 
				
			||||
#define USART_CR2_LINEN                     0x4000            // LIN mode enable
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for USART_CR3 register  ******************
 | 
				
			||||
#define USART_CR3_EIE                       0x0001            // Error Interrupt Enable
 | 
				
			||||
#define USART_CR3_IREN                      0x0002            // IrDA mode Enable
 | 
				
			||||
#define USART_CR3_IRLP                      0x0004            // IrDA Low-Power
 | 
				
			||||
#define USART_CR3_HDSEL                     0x0008            // Half-Duplex Selection
 | 
				
			||||
#define USART_CR3_NACK                      0x0010            // Smartcard NACK enable
 | 
				
			||||
#define USART_CR3_SCEN                      0x0020            // Smartcard mode enable
 | 
				
			||||
#define USART_CR3_DMAR                      0x0040            // DMA Enable Receiver
 | 
				
			||||
#define USART_CR3_DMAT                      0x0080            // DMA Enable Transmitter
 | 
				
			||||
#define USART_CR3_RTSE                      0x0100            // RTS Enable
 | 
				
			||||
#define USART_CR3_CTSE                      0x0200            // CTS Enable
 | 
				
			||||
#define USART_CR3_CTSIE                     0x0400            // CTS Interrupt Enable
 | 
				
			||||
#define USART_CR3_ONEBIT                    0x0800            // One sample bit method enable
 | 
				
			||||
 | 
				
			||||
//*****************  Bit definition for USART_GTPR register  *****************
 | 
				
			||||
#define USART_GTPR_PSC                      0x00FF            // PSC[7:0] bits (Prescaler value)
 | 
				
			||||
#define USART_GTPR_PSC_0                    0x0001            // Bit 0
 | 
				
			||||
#define USART_GTPR_PSC_1                    0x0002            // Bit 1
 | 
				
			||||
#define USART_GTPR_PSC_2                    0x0004            // Bit 2
 | 
				
			||||
#define USART_GTPR_PSC_3                    0x0008            // Bit 3
 | 
				
			||||
#define USART_GTPR_PSC_4                    0x0010            // Bit 4
 | 
				
			||||
#define USART_GTPR_PSC_5                    0x0020            // Bit 5
 | 
				
			||||
#define USART_GTPR_PSC_6                    0x0040            // Bit 6
 | 
				
			||||
#define USART_GTPR_PSC_7                    0x0080            // Bit 7
 | 
				
			||||
 | 
				
			||||
#define USART_GTPR_GT                       0xFF00            // Guard time value
 | 
				
			||||
@ -0,0 +1,61 @@ | 
				
			||||
#include "common.h" | 
				
			||||
#include "gpio.h" | 
				
			||||
 | 
				
			||||
static uint32_t rcc_gpio_mask(uint32_t gpio) | 
				
			||||
{ | 
				
			||||
	switch (gpio) { | 
				
			||||
		case GPIOA: return RCC_AHBENR_GPIOAEN; | 
				
			||||
		case GPIOB: return RCC_AHBENR_GPIOBEN; | 
				
			||||
		case GPIOC: return RCC_AHBENR_GPIOCEN; | 
				
			||||
		case GPIOD: return RCC_AHBENR_GPIODEN; | 
				
			||||
		case GPIOE: return RCC_AHBENR_GPIOEEN; | 
				
			||||
		case GPIOF: return RCC_AHBENR_GPIOFEN; | 
				
			||||
		case GPIOG: return RCC_AHBENR_GPIOGEN; | 
				
			||||
		case GPIOH: return RCC_AHBENR_GPIOHEN; | 
				
			||||
		default: return 0; | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void gpio_enable(uint32_t gpio) | 
				
			||||
{ | 
				
			||||
	RCC_AHBENR |= rcc_gpio_mask(gpio); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void gpio_disable(uint32_t gpio) | 
				
			||||
{ | 
				
			||||
	RCC_AHBENR &= ~rcc_gpio_mask(gpio); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void gpio_set_af(uint32_t gpio, uint32_t pins, enum GPIO_AF af) | 
				
			||||
{ | 
				
			||||
	gpio_enable(gpio); | 
				
			||||
 | 
				
			||||
	volatile uint32_t *moder = (uint32_t *) gpio + GPIO_MODER_offs; | 
				
			||||
	volatile uint64_t *afr = (uint64_t *) gpio + GPIO_AFR_offs; | 
				
			||||
 | 
				
			||||
	BitFieldLoop(i, m, 16) { | 
				
			||||
		if (pins & m) { | 
				
			||||
			*moder &= ~(0b11 << i * 2); | 
				
			||||
			*moder |= 0b10 << i * 2; | 
				
			||||
 | 
				
			||||
			*afr &= ~(0xF << i * 4); | 
				
			||||
			*afr |= af << i * 4; | 
				
			||||
		} | 
				
			||||
	}; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void gpio_set_mode(uint32_t gpio, uint32_t pins, enum GPIO_MODE mode) | 
				
			||||
{ | 
				
			||||
	volatile uint32_t *moder = (uint32_t *) gpio + GPIO_MODER_offs; | 
				
			||||
 | 
				
			||||
	BitFieldLoop(i, m, 16) { | 
				
			||||
		if (pins & m) { | 
				
			||||
			*moder &= ~(0b11 << i * 2); | 
				
			||||
			*moder |= mode << i * 2; | 
				
			||||
		} | 
				
			||||
	}; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,60 @@ | 
				
			||||
#pragma once | 
				
			||||
 | 
				
			||||
#include "common.h" | 
				
			||||
 | 
				
			||||
enum GPIO_MODE { | 
				
			||||
	MODER_INPUT = 0, | 
				
			||||
	MODER_OUTPUT = 1, | 
				
			||||
	MODER_AF = 2, | 
				
			||||
	MODER_ANALOG = 3, | 
				
			||||
}; | 
				
			||||
 | 
				
			||||
enum GPIO_AF { | 
				
			||||
	AF0 = 0, | 
				
			||||
	AF1 = 1, | 
				
			||||
	AF2 = 2, | 
				
			||||
	AF3 = 3, | 
				
			||||
	AF4 = 4, | 
				
			||||
	AF5 = 5, | 
				
			||||
	AF6 = 6, | 
				
			||||
	AF7 = 7, | 
				
			||||
	AF8 = 8, | 
				
			||||
	AF9 = 9, | 
				
			||||
	AF10 = 10, | 
				
			||||
	AF11 = 11, | 
				
			||||
	AF12 = 12, | 
				
			||||
	AF13 = 13, | 
				
			||||
	AF14 = 14, | 
				
			||||
	AF15 = 15, | 
				
			||||
}; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/**
 | 
				
			||||
 * Enable GPIO in RCC | 
				
			||||
 * @param gpio GPIO base | 
				
			||||
 */ | 
				
			||||
void gpio_enable(uint32_t gpio); | 
				
			||||
 | 
				
			||||
/**
 | 
				
			||||
 * Disable GPIO in RCC | 
				
			||||
 * @param gpio GPIO base | 
				
			||||
 */ | 
				
			||||
void gpio_disable(uint32_t gpio); | 
				
			||||
 | 
				
			||||
/**
 | 
				
			||||
 * Set GPIO AF (writes MODER and AFR). | 
				
			||||
 * Also enables the port if disabled in RCC. | 
				
			||||
 * @param gpio GPIO base | 
				
			||||
 * @param pins pins bitmask | 
				
			||||
 * @param af alternate function 0..15 | 
				
			||||
 */ | 
				
			||||
void gpio_set_af(uint32_t gpio, uint32_t pins, enum GPIO_AF af); | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/**
 | 
				
			||||
 * Set pins mode (writes MODER) | 
				
			||||
 * @param gpio GPIO base | 
				
			||||
 * @param pins pins bitmask | 
				
			||||
 * @param mode mode to set | 
				
			||||
 */ | 
				
			||||
void gpio_set_mode(uint32_t gpio, uint32_t pins, enum GPIO_MODE mode); | 
				
			||||
@ -0,0 +1,20 @@ | 
				
			||||
#include "systick.h" | 
				
			||||
 | 
				
			||||
void systick_setup(uint32_t prescaller) | 
				
			||||
{ | 
				
			||||
	SysTick_CSR = (SysTick_CSR & ~SysTick_CSR_CLKSOURCE) | SysTick_CSR_CLKSOURCE_CORE; | 
				
			||||
	SysTick_RELOAD = prescaller; | 
				
			||||
	SysTick_CSR |= SysTick_CSR_TICKINT | SysTick_CSR_ENABLE; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void systick_enable(void) | 
				
			||||
{ | 
				
			||||
	SysTick_CSR |= SysTick_CSR_ENABLE; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void systick_disable(void) | 
				
			||||
{ | 
				
			||||
	SysTick_CSR &= ~SysTick_CSR_ENABLE; | 
				
			||||
} | 
				
			||||
@ -0,0 +1,20 @@ | 
				
			||||
#pragma once | 
				
			||||
#include "common.h" | 
				
			||||
 | 
				
			||||
// don't forget to implement the handler:
 | 
				
			||||
// void SysTick_Handler(void)
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/**
 | 
				
			||||
 * Set up and start systick | 
				
			||||
 * @param prescaller divider (eg. for 1ms @ 16MHz: 16000) | 
				
			||||
 */ | 
				
			||||
void systick_setup(uint32_t prescaller); | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** Enable (start) systick */ | 
				
			||||
void systick_enable(void); | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** Disable (stop) systick */ | 
				
			||||
void systick_disable(void); | 
				
			||||
@ -0,0 +1,89 @@ | 
				
			||||
#include <common.h> | 
				
			||||
#include <gpio.h> | 
				
			||||
#include <systick.h> | 
				
			||||
 | 
				
			||||
 | 
				
			||||
static void init_gpios(void) | 
				
			||||
{ | 
				
			||||
	gpio_enable(GPIOA); | 
				
			||||
	gpio_enable(GPIOB); | 
				
			||||
	gpio_enable(GPIOC); | 
				
			||||
 | 
				
			||||
	gpio_set_mode(GPIOC, BIT8 | BIT9, MODER_OUTPUT); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
static void init_clock(void) | 
				
			||||
{ | 
				
			||||
	// Flash timing - 64-bit access, pre-fetch, latency = 1
 | 
				
			||||
	FLASH_ACR |= FLASH_ACR_ACC64; // Cannot write both at once
 | 
				
			||||
	FLASH_ACR |= FLASH_ACR_PRFTEN | FLASH_ACR_LATENCY; | 
				
			||||
 | 
				
			||||
	// Power on HSI (runs from MSI on start)
 | 
				
			||||
	RCC_CR |= RCC_CR_HSION; | 
				
			||||
 | 
				
			||||
	// Wait for HSIRDY
 | 
				
			||||
	while (!(RCC_CR & RCC_CR_HSIRDY)); | 
				
			||||
 | 
				
			||||
	// Select HSI as the core clock source
 | 
				
			||||
	RCC_CFGR &= ~RCC_CFGR_SW; | 
				
			||||
	RCC_CFGR |= RCC_CFGR_SW_HSI; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
static void init_usart(void) | 
				
			||||
{ | 
				
			||||
	gpio_set_af(GPIOC, BIT10 | BIT11, AF7); | 
				
			||||
 | 
				
			||||
	// USART at C11, C12
 | 
				
			||||
	RCC_APB1ENR |= RCC_APB1ENR_USART3EN; | 
				
			||||
 | 
				
			||||
	// RATE 9600Bd 104.1875 (see datasheet for reference)8.6875
 | 
				
			||||
	// 0x00683 ... 9600
 | 
				
			||||
	USART3_BRR = 0x0008A;  // 115200
 | 
				
			||||
 | 
				
			||||
	// USART enable
 | 
				
			||||
	USART3_CR1 = USART_CR1_UE | USART_CR1_RE | USART_CR1_TE; | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
/** Called before main() */ | 
				
			||||
void SystemInit(void) | 
				
			||||
{ | 
				
			||||
	init_clock(); | 
				
			||||
	systick_setup(16000); | 
				
			||||
	init_gpios(); | 
				
			||||
	init_usart(); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
static uint32_t time = 0; | 
				
			||||
 | 
				
			||||
/** IRQ */ | 
				
			||||
void SysTick_Handler(void) | 
				
			||||
{ | 
				
			||||
	time++; | 
				
			||||
	if (time == 500) { | 
				
			||||
		time = 0; | 
				
			||||
		GPIOC_ODR ^= BIT9; | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
void delay(void) | 
				
			||||
{ | 
				
			||||
	for (int i = 0; i < 100000; i++) { | 
				
			||||
		__asm__("nop"); | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
 | 
				
			||||
 | 
				
			||||
int main(void) | 
				
			||||
{ | 
				
			||||
	while (1) { | 
				
			||||
		delay(); | 
				
			||||
		GPIOC_ODR ^= BIT8; | 
				
			||||
	} | 
				
			||||
} | 
				
			||||
@ -0,0 +1,34 @@ | 
				
			||||
TEMPLATE = app | 
				
			||||
CONFIG += console | 
				
			||||
CONFIG -= app_bundle | 
				
			||||
CONFIG -= qt | 
				
			||||
 | 
				
			||||
INCLUDEPATH += \ | 
				
			||||
	lib \ | 
				
			||||
	/usr/arm-none-eabi/include | 
				
			||||
 | 
				
			||||
DEFINES += STM32F3 __ARM_ARCH_7M__ ARM_MATH_CM4 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
DISTFILES += \ | 
				
			||||
	Makefile \ | 
				
			||||
    style.astylerc \ | 
				
			||||
    startup_stm32l100xc.s \ | 
				
			||||
    stm32l100rc.ld | 
				
			||||
 | 
				
			||||
SOURCES += \ | 
				
			||||
    main.c \ | 
				
			||||
    lib/gpio.c \ | 
				
			||||
    lib/systick.c | 
				
			||||
 | 
				
			||||
HEADERS += \ | 
				
			||||
    lib/common.h \ | 
				
			||||
    lib/defs_base.h \ | 
				
			||||
    lib/defs_flash.h \ | 
				
			||||
    lib/defs_gpio.h \ | 
				
			||||
    lib/defs_rcc.h \ | 
				
			||||
    lib/gpio.h \ | 
				
			||||
    lib/defs_systick.h \ | 
				
			||||
    lib/systick.h \ | 
				
			||||
    lib/defs_usart.h | 
				
			||||
 | 
				
			||||
@ -0,0 +1,418 @@ | 
				
			||||
/** | 
				
			||||
  ****************************************************************************** | 
				
			||||
  * @file      startup_stm32l100xc.s
 | 
				
			||||
  * @author    MCD Application Team
 | 
				
			||||
  * @version   V2.1.2
 | 
				
			||||
  * @date      09-October-2015
 | 
				
			||||
  * @brief     STM32L100XC Devices vector table for 
 | 
				
			||||
  *            Atollic toolchain. | 
				
			||||
  *            This module performs: | 
				
			||||
  *                - Set the initial SP | 
				
			||||
  *                - Set the initial PC == Reset_Handler, | 
				
			||||
  *                - Set the vector table entries with the exceptions ISR address | 
				
			||||
  *                - Configure the clock system | 
				
			||||
  *                - Branches to main in the C library (which eventually | 
				
			||||
  *                  calls main()). | 
				
			||||
  *            After Reset the Cortex-M3 processor is in Thread mode, | 
				
			||||
  *            priority is Privileged, and the Stack is set to Main. | 
				
			||||
  ****************************************************************************** | 
				
			||||
  * | 
				
			||||
  * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
 | 
				
			||||
  * | 
				
			||||
  * Redistribution and use in source and binary forms, with or without modification, | 
				
			||||
  * are permitted provided that the following conditions are met: | 
				
			||||
  *   1. Redistributions of source code must retain the above copyright notice, | 
				
			||||
  *      this list of conditions and the following disclaimer. | 
				
			||||
  *   2. Redistributions in binary form must reproduce the above copyright notice, | 
				
			||||
  *      this list of conditions and the following disclaimer in the documentation | 
				
			||||
  *      and/or other materials provided with the distribution. | 
				
			||||
  *   3. Neither the name of STMicroelectronics nor the names of its contributors | 
				
			||||
  *      may be used to endorse or promote products derived from this software | 
				
			||||
  *      without specific prior written permission. | 
				
			||||
  * | 
				
			||||
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
				
			||||
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
				
			||||
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 
				
			||||
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | 
				
			||||
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
				
			||||
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | 
				
			||||
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 | 
				
			||||
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 
				
			||||
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
				
			||||
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
				
			||||
  * | 
				
			||||
  ****************************************************************************** | 
				
			||||
  */ | 
				
			||||
 | 
				
			||||
  .syntax unified
 | 
				
			||||
  .cpu cortex-m3 | 
				
			||||
  .fpu softvfp
 | 
				
			||||
  .thumb | 
				
			||||
 | 
				
			||||
.global g_pfnVectors
 | 
				
			||||
.global Default_Handler
 | 
				
			||||
 | 
				
			||||
/* start address for the initialization values of the .data section. | 
				
			||||
defined in linker script */ | 
				
			||||
.word _sidata
 | 
				
			||||
/* start address for the .data section. defined in linker script */ | 
				
			||||
.word _sdata
 | 
				
			||||
/* end address for the .data section. defined in linker script */ | 
				
			||||
.word _edata
 | 
				
			||||
/* start address for the .bss section. defined in linker script */ | 
				
			||||
.word _sbss
 | 
				
			||||
/* end address for the .bss section. defined in linker script */ | 
				
			||||
.word _ebss
 | 
				
			||||
 | 
				
			||||
.equ  BootRAM, 0xF108F85F | 
				
			||||
/** | 
				
			||||
 * @brief  This is the code that gets called when the processor first
 | 
				
			||||
 *          starts execution following a reset event. Only the absolutely | 
				
			||||
 *          necessary set is performed, after which the application | 
				
			||||
 *          supplied main() routine is called. | 
				
			||||
 * @param  None
 | 
				
			||||
 * @retval : None
 | 
				
			||||
*/ | 
				
			||||
 | 
				
			||||
  .section .text.Reset_Handler | 
				
			||||
  .weak Reset_Handler
 | 
				
			||||
  .type Reset_Handler, %function | 
				
			||||
Reset_Handler: | 
				
			||||
 | 
				
			||||
/* Copy the data segment initializers from flash to SRAM */ | 
				
			||||
  movs r1, #0 | 
				
			||||
  b LoopCopyDataInit | 
				
			||||
 | 
				
			||||
CopyDataInit: | 
				
			||||
  ldr r3, =_sidata | 
				
			||||
  ldr r3, [r3, r1] | 
				
			||||
  str r3, [r0, r1] | 
				
			||||
  adds r1, r1, #4 | 
				
			||||
 | 
				
			||||
LoopCopyDataInit: | 
				
			||||
  ldr r0, =_sdata | 
				
			||||
  ldr r3, =_edata | 
				
			||||
  adds r2, r0, r1 | 
				
			||||
  cmp r2, r3 | 
				
			||||
  bcc CopyDataInit | 
				
			||||
  ldr r2, =_sbss | 
				
			||||
  b LoopFillZerobss | 
				
			||||
/* Zero fill the bss segment. */ | 
				
			||||
FillZerobss: | 
				
			||||
  movs r3, #0 | 
				
			||||
  str r3, [r2], #4 | 
				
			||||
 | 
				
			||||
LoopFillZerobss: | 
				
			||||
  ldr r3, = _ebss | 
				
			||||
  cmp r2, r3 | 
				
			||||
  bcc FillZerobss | 
				
			||||
 | 
				
			||||
/* Call the clock system intitialization function.*/ | 
				
			||||
    bl  SystemInit | 
				
			||||
/* Call static constructors */ | 
				
			||||
    bl __libc_init_array | 
				
			||||
/* Call the application's entry point.*/ | 
				
			||||
  bl main | 
				
			||||
  bx lr | 
				
			||||
.size Reset_Handler, .-Reset_Handler | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * @brief  This is the code that gets called when the processor receives an
 | 
				
			||||
 *         unexpected interrupt.  This simply enters an infinite loop, preserving | 
				
			||||
 *         the system state for examination by a debugger. | 
				
			||||
 * | 
				
			||||
 * @param  None
 | 
				
			||||
 * @retval : None
 | 
				
			||||
*/ | 
				
			||||
    .section .text.Default_Handler,"ax",%progbits | 
				
			||||
Default_Handler: | 
				
			||||
Infinite_Loop: | 
				
			||||
  b Infinite_Loop | 
				
			||||
  .size Default_Handler, .-Default_Handler | 
				
			||||
/****************************************************************************** | 
				
			||||
* | 
				
			||||
* The minimal vector table for a Cortex M3.  Note that the proper constructs | 
				
			||||
* must be placed on this to ensure that it ends up at physical address | 
				
			||||
* 0x0000.0000. | 
				
			||||
* | 
				
			||||
******************************************************************************/ | 
				
			||||
   .section .isr_vector,"a",%progbits | 
				
			||||
  .type g_pfnVectors, %object | 
				
			||||
  .size g_pfnVectors, .-g_pfnVectors | 
				
			||||
 | 
				
			||||
 | 
				
			||||
g_pfnVectors: | 
				
			||||
  .word _estack
 | 
				
			||||
  .word Reset_Handler
 | 
				
			||||
  .word NMI_Handler
 | 
				
			||||
  .word HardFault_Handler
 | 
				
			||||
  .word MemManage_Handler
 | 
				
			||||
  .word BusFault_Handler
 | 
				
			||||
  .word UsageFault_Handler
 | 
				
			||||
  .word 0
 | 
				
			||||
  .word 0
 | 
				
			||||
  .word 0
 | 
				
			||||
  .word 0
 | 
				
			||||
  .word SVC_Handler
 | 
				
			||||
  .word DebugMon_Handler
 | 
				
			||||
  .word 0
 | 
				
			||||
  .word PendSV_Handler
 | 
				
			||||
  .word SysTick_Handler
 | 
				
			||||
  .word WWDG_IRQHandler
 | 
				
			||||
  .word PVD_IRQHandler
 | 
				
			||||
  .word TAMPER_STAMP_IRQHandler
 | 
				
			||||
  .word RTC_WKUP_IRQHandler
 | 
				
			||||
  .word FLASH_IRQHandler
 | 
				
			||||
  .word RCC_IRQHandler
 | 
				
			||||
  .word EXTI0_IRQHandler
 | 
				
			||||
  .word EXTI1_IRQHandler
 | 
				
			||||
  .word EXTI2_IRQHandler
 | 
				
			||||
  .word EXTI3_IRQHandler
 | 
				
			||||
  .word EXTI4_IRQHandler
 | 
				
			||||
  .word DMA1_Channel1_IRQHandler
 | 
				
			||||
  .word DMA1_Channel2_IRQHandler
 | 
				
			||||
  .word DMA1_Channel3_IRQHandler
 | 
				
			||||
  .word DMA1_Channel4_IRQHandler
 | 
				
			||||
  .word DMA1_Channel5_IRQHandler
 | 
				
			||||
  .word DMA1_Channel6_IRQHandler
 | 
				
			||||
  .word DMA1_Channel7_IRQHandler
 | 
				
			||||
  .word ADC1_IRQHandler
 | 
				
			||||
  .word USB_HP_IRQHandler
 | 
				
			||||
  .word USB_LP_IRQHandler
 | 
				
			||||
  .word DAC_IRQHandler
 | 
				
			||||
  .word COMP_IRQHandler
 | 
				
			||||
  .word EXTI9_5_IRQHandler
 | 
				
			||||
  .word LCD_IRQHandler
 | 
				
			||||
  .word TIM9_IRQHandler
 | 
				
			||||
  .word TIM10_IRQHandler
 | 
				
			||||
  .word TIM11_IRQHandler
 | 
				
			||||
  .word TIM2_IRQHandler
 | 
				
			||||
  .word TIM3_IRQHandler
 | 
				
			||||
  .word TIM4_IRQHandler
 | 
				
			||||
  .word I2C1_EV_IRQHandler
 | 
				
			||||
  .word I2C1_ER_IRQHandler
 | 
				
			||||
  .word I2C2_EV_IRQHandler
 | 
				
			||||
  .word I2C2_ER_IRQHandler
 | 
				
			||||
  .word SPI1_IRQHandler
 | 
				
			||||
  .word SPI2_IRQHandler
 | 
				
			||||
  .word USART1_IRQHandler
 | 
				
			||||
  .word USART2_IRQHandler
 | 
				
			||||
  .word USART3_IRQHandler
 | 
				
			||||
  .word EXTI15_10_IRQHandler
 | 
				
			||||
  .word RTC_Alarm_IRQHandler
 | 
				
			||||
  .word USB_FS_WKUP_IRQHandler
 | 
				
			||||
  .word TIM6_IRQHandler
 | 
				
			||||
  .word TIM7_IRQHandler
 | 
				
			||||
  .word 0
 | 
				
			||||
  .word 0
 | 
				
			||||
  .word SPI3_IRQHandler
 | 
				
			||||
  .word 0
 | 
				
			||||
  .word 0
 | 
				
			||||
  .word DMA2_Channel1_IRQHandler
 | 
				
			||||
  .word DMA2_Channel2_IRQHandler
 | 
				
			||||
  .word DMA2_Channel3_IRQHandler
 | 
				
			||||
  .word DMA2_Channel4_IRQHandler
 | 
				
			||||
  .word DMA2_Channel5_IRQHandler
 | 
				
			||||
  .word 0
 | 
				
			||||
  .word COMP_ACQ_IRQHandler
 | 
				
			||||
  .word 0
 | 
				
			||||
  .word 0
 | 
				
			||||
  .word 0
 | 
				
			||||
  .word 0
 | 
				
			||||
  .word 0
 | 
				
			||||
  .word BootRAM          /* @0x108. This is for boot in RAM mode for 
 | 
				
			||||
                            STM32L100XC devices. */ | 
				
			||||
 | 
				
			||||
/******************************************************************************* | 
				
			||||
* | 
				
			||||
* Provide weak aliases for each Exception handler to the Default_Handler. | 
				
			||||
* As they are weak aliases, any function with the same name will override | 
				
			||||
* this definition. | 
				
			||||
* | 
				
			||||
*******************************************************************************/ | 
				
			||||
 | 
				
			||||
  .weak NMI_Handler
 | 
				
			||||
  .thumb_set NMI_Handler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak HardFault_Handler
 | 
				
			||||
  .thumb_set HardFault_Handler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak MemManage_Handler
 | 
				
			||||
  .thumb_set MemManage_Handler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak BusFault_Handler
 | 
				
			||||
  .thumb_set BusFault_Handler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak UsageFault_Handler
 | 
				
			||||
  .thumb_set UsageFault_Handler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak SVC_Handler
 | 
				
			||||
  .thumb_set SVC_Handler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak DebugMon_Handler
 | 
				
			||||
  .thumb_set DebugMon_Handler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak PendSV_Handler
 | 
				
			||||
  .thumb_set PendSV_Handler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak SysTick_Handler
 | 
				
			||||
  .thumb_set SysTick_Handler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak WWDG_IRQHandler
 | 
				
			||||
  .thumb_set WWDG_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak PVD_IRQHandler
 | 
				
			||||
  .thumb_set PVD_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak TAMPER_STAMP_IRQHandler
 | 
				
			||||
  .thumb_set TAMPER_STAMP_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak RTC_WKUP_IRQHandler
 | 
				
			||||
  .thumb_set RTC_WKUP_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak FLASH_IRQHandler
 | 
				
			||||
  .thumb_set FLASH_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak RCC_IRQHandler
 | 
				
			||||
  .thumb_set RCC_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak EXTI0_IRQHandler
 | 
				
			||||
  .thumb_set EXTI0_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak EXTI1_IRQHandler
 | 
				
			||||
  .thumb_set EXTI1_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak EXTI2_IRQHandler
 | 
				
			||||
  .thumb_set EXTI2_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak EXTI3_IRQHandler
 | 
				
			||||
  .thumb_set EXTI3_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak EXTI4_IRQHandler
 | 
				
			||||
  .thumb_set EXTI4_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak DMA1_Channel1_IRQHandler
 | 
				
			||||
  .thumb_set DMA1_Channel1_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak DMA1_Channel2_IRQHandler
 | 
				
			||||
  .thumb_set DMA1_Channel2_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak DMA1_Channel3_IRQHandler
 | 
				
			||||
  .thumb_set DMA1_Channel3_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak DMA1_Channel4_IRQHandler
 | 
				
			||||
  .thumb_set DMA1_Channel4_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak DMA1_Channel5_IRQHandler
 | 
				
			||||
  .thumb_set DMA1_Channel5_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak DMA1_Channel6_IRQHandler
 | 
				
			||||
  .thumb_set DMA1_Channel6_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak DMA1_Channel7_IRQHandler
 | 
				
			||||
  .thumb_set DMA1_Channel7_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak ADC1_IRQHandler
 | 
				
			||||
  .thumb_set ADC1_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak USB_HP_IRQHandler
 | 
				
			||||
  .thumb_set USB_HP_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak USB_LP_IRQHandler
 | 
				
			||||
  .thumb_set USB_LP_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak DAC_IRQHandler
 | 
				
			||||
  .thumb_set DAC_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak COMP_IRQHandler
 | 
				
			||||
  .thumb_set COMP_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak EXTI9_5_IRQHandler
 | 
				
			||||
  .thumb_set EXTI9_5_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak LCD_IRQHandler
 | 
				
			||||
  .thumb_set LCD_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak TIM9_IRQHandler
 | 
				
			||||
  .thumb_set TIM9_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak TIM10_IRQHandler
 | 
				
			||||
  .thumb_set TIM10_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak TIM11_IRQHandler
 | 
				
			||||
  .thumb_set TIM11_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak TIM2_IRQHandler
 | 
				
			||||
  .thumb_set TIM2_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak TIM3_IRQHandler
 | 
				
			||||
  .thumb_set TIM3_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak TIM4_IRQHandler
 | 
				
			||||
  .thumb_set TIM4_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak I2C1_EV_IRQHandler
 | 
				
			||||
  .thumb_set I2C1_EV_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak I2C1_ER_IRQHandler
 | 
				
			||||
  .thumb_set I2C1_ER_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak I2C2_EV_IRQHandler
 | 
				
			||||
  .thumb_set I2C2_EV_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak I2C2_ER_IRQHandler
 | 
				
			||||
  .thumb_set I2C2_ER_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak SPI1_IRQHandler
 | 
				
			||||
  .thumb_set SPI1_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak SPI2_IRQHandler
 | 
				
			||||
  .thumb_set SPI2_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak USART1_IRQHandler
 | 
				
			||||
  .thumb_set USART1_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak USART2_IRQHandler
 | 
				
			||||
  .thumb_set USART2_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak USART3_IRQHandler
 | 
				
			||||
  .thumb_set USART3_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak EXTI15_10_IRQHandler
 | 
				
			||||
  .thumb_set EXTI15_10_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak RTC_Alarm_IRQHandler
 | 
				
			||||
  .thumb_set RTC_Alarm_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak USB_FS_WKUP_IRQHandler
 | 
				
			||||
  .thumb_set USB_FS_WKUP_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak TIM6_IRQHandler
 | 
				
			||||
  .thumb_set TIM6_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak TIM7_IRQHandler
 | 
				
			||||
  .thumb_set TIM7_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak SPI3_IRQHandler
 | 
				
			||||
  .thumb_set SPI3_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak DMA2_Channel1_IRQHandler
 | 
				
			||||
  .thumb_set DMA2_Channel1_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak DMA2_Channel2_IRQHandler
 | 
				
			||||
  .thumb_set DMA2_Channel2_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak DMA2_Channel3_IRQHandler
 | 
				
			||||
  .thumb_set DMA2_Channel3_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak DMA2_Channel4_IRQHandler
 | 
				
			||||
  .thumb_set DMA2_Channel4_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak DMA2_Channel5_IRQHandler
 | 
				
			||||
  .thumb_set DMA2_Channel5_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
  .weak COMP_ACQ_IRQHandler
 | 
				
			||||
   .thumb_set COMP_ACQ_IRQHandler,Default_Handler | 
				
			||||
 | 
				
			||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ | 
				
			||||
 | 
				
			||||
@ -0,0 +1,167 @@ | 
				
			||||
/* | 
				
			||||
***************************************************************************** | 
				
			||||
** | 
				
			||||
**  File        : stm32_flash.ld | 
				
			||||
** | 
				
			||||
**  Abstract    : Linker script for STM32L100RC Device with | 
				
			||||
**                256KByte FLASH, 16KByte RAM | 
				
			||||
** | 
				
			||||
**                Set heap size, stack size and stack location according | 
				
			||||
**                to application requirements. | 
				
			||||
** | 
				
			||||
**                Set memory bank area and size if external memory is used. | 
				
			||||
** | 
				
			||||
**  Target      : STMicroelectronics STM32 | 
				
			||||
** | 
				
			||||
**  Environment : Atollic TrueSTUDIO(R) | 
				
			||||
** | 
				
			||||
**  Distribution: The file is distributed as is, without any warranty | 
				
			||||
**                of any kind. | 
				
			||||
** | 
				
			||||
**  (c)Copyright Atollic AB. | 
				
			||||
**  You may use this file as-is or modify it according to the needs of your | 
				
			||||
**  project. This file may only be built (assembled or compiled and linked) | 
				
			||||
**  using the Atollic TrueSTUDIO(R) product. The use of this file together | 
				
			||||
**  with other tools than Atollic TrueSTUDIO(R) is not permitted. | 
				
			||||
** | 
				
			||||
***************************************************************************** | 
				
			||||
*/ | 
				
			||||
 | 
				
			||||
/* Entry Point */ | 
				
			||||
ENTRY(Reset_Handler) | 
				
			||||
 | 
				
			||||
/* Highest address of the user mode stack */ | 
				
			||||
_estack = 0x20003FFF;    /* end of RAM */ | 
				
			||||
 | 
				
			||||
/* Generate a link error if heap and stack don't fit into RAM */ | 
				
			||||
_Min_Heap_Size = 0x1000;      /* required amount of heap  */ | 
				
			||||
_Min_Stack_Size = 0x400; /* required amount of stack */ | 
				
			||||
 | 
				
			||||
/* Specify the memory areas */ | 
				
			||||
MEMORY | 
				
			||||
{ | 
				
			||||
  FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 256K | 
				
			||||
  RAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 16K | 
				
			||||
  EEP (r)    : ORIGIN = 0x08080000, LENGTH = 4K | 
				
			||||
} | 
				
			||||
 | 
				
			||||
/* Define output sections */ | 
				
			||||
SECTIONS | 
				
			||||
{ | 
				
			||||
  /* The startup code goes first into FLASH */ | 
				
			||||
  .isr_vector : | 
				
			||||
  { | 
				
			||||
    . = ALIGN(4); | 
				
			||||
    KEEP(*(.isr_vector)) /* Startup code */ | 
				
			||||
    . = ALIGN(4); | 
				
			||||
  } >FLASH | 
				
			||||
 | 
				
			||||
  /* The program code and other data goes into FLASH */ | 
				
			||||
  .text : | 
				
			||||
  { | 
				
			||||
    . = ALIGN(4); | 
				
			||||
    *(.text)           /* .text sections (code) */ | 
				
			||||
    *(.text*)          /* .text* sections (code) */ | 
				
			||||
    *(.glue_7)         /* glue arm to thumb code */ | 
				
			||||
    *(.glue_7t)        /* glue thumb to arm code */ | 
				
			||||
    *(.eh_frame) | 
				
			||||
 | 
				
			||||
    KEEP (*(.init)) | 
				
			||||
    KEEP (*(.fini)) | 
				
			||||
 | 
				
			||||
    . = ALIGN(4); | 
				
			||||
    _etext = .;        /* define a global symbols at end of code */ | 
				
			||||
  } >FLASH | 
				
			||||
 | 
				
			||||
  /* Constant data goes into FLASH */ | 
				
			||||
  .rodata : | 
				
			||||
  { | 
				
			||||
    . = ALIGN(4); | 
				
			||||
    *(.rodata)         /* .rodata sections (constants, strings, etc.) */ | 
				
			||||
    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */ | 
				
			||||
    . = ALIGN(4); | 
				
			||||
  } >FLASH | 
				
			||||
 | 
				
			||||
  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH | 
				
			||||
  .ARM : { | 
				
			||||
    __exidx_start = .; | 
				
			||||
    *(.ARM.exidx*) | 
				
			||||
    __exidx_end = .; | 
				
			||||
  } >FLASH | 
				
			||||
 | 
				
			||||
  .preinit_array     : | 
				
			||||
  { | 
				
			||||
    PROVIDE_HIDDEN (__preinit_array_start = .); | 
				
			||||
    KEEP (*(.preinit_array*)) | 
				
			||||
    PROVIDE_HIDDEN (__preinit_array_end = .); | 
				
			||||
  } >FLASH | 
				
			||||
  .init_array : | 
				
			||||
  { | 
				
			||||
    PROVIDE_HIDDEN (__init_array_start = .); | 
				
			||||
    KEEP (*(SORT(.init_array.*))) | 
				
			||||
    KEEP (*(.init_array*)) | 
				
			||||
    PROVIDE_HIDDEN (__init_array_end = .); | 
				
			||||
  } >FLASH | 
				
			||||
  .fini_array : | 
				
			||||
  { | 
				
			||||
    PROVIDE_HIDDEN (__fini_array_start = .); | 
				
			||||
    KEEP (*(SORT(.fini_array.*))) | 
				
			||||
    KEEP (*(.fini_array*)) | 
				
			||||
    PROVIDE_HIDDEN (__fini_array_end = .); | 
				
			||||
  } >FLASH | 
				
			||||
 | 
				
			||||
  /* used by the startup to initialize data */ | 
				
			||||
  _sidata = LOADADDR(.data); | 
				
			||||
 | 
				
			||||
  /* Initialized data sections goes into RAM, load LMA copy after code */ | 
				
			||||
  .data : | 
				
			||||
  { | 
				
			||||
    . = ALIGN(4); | 
				
			||||
    _sdata = .;        /* create a global symbol at data start */ | 
				
			||||
    *(.data)           /* .data sections */ | 
				
			||||
    *(.data*)          /* .data* sections */ | 
				
			||||
 | 
				
			||||
    . = ALIGN(4); | 
				
			||||
    _edata = .;        /* define a global symbol at data end */ | 
				
			||||
  } >RAM AT> FLASH | 
				
			||||
 | 
				
			||||
 | 
				
			||||
  /* Uninitialized data section */ | 
				
			||||
  . = ALIGN(4); | 
				
			||||
  .bss : | 
				
			||||
  { | 
				
			||||
    /* This is used by the startup in order to initialize the .bss secion */ | 
				
			||||
    _sbss = .;         /* define a global symbol at bss start */ | 
				
			||||
    __bss_start__ = _sbss; | 
				
			||||
    *(.bss) | 
				
			||||
    *(.bss*) | 
				
			||||
    *(COMMON) | 
				
			||||
 | 
				
			||||
    . = ALIGN(4); | 
				
			||||
    _ebss = .;         /* define a global symbol at bss end */ | 
				
			||||
    __bss_end__ = _ebss; | 
				
			||||
  } >RAM | 
				
			||||
 | 
				
			||||
  /* User_heap_stack section, used to check that there is enough RAM left */ | 
				
			||||
  ._user_heap_stack : | 
				
			||||
  { | 
				
			||||
    . = ALIGN(4); | 
				
			||||
    PROVIDE ( end = . ); | 
				
			||||
    PROVIDE ( _end = . ); | 
				
			||||
    . = . + _Min_Heap_Size; | 
				
			||||
    . = . + _Min_Stack_Size; | 
				
			||||
    . = ALIGN(4); | 
				
			||||
  } >RAM | 
				
			||||
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
  /* Remove information from the standard libraries */ | 
				
			||||
  /DISCARD/ : | 
				
			||||
  { | 
				
			||||
    libc.a ( * ) | 
				
			||||
    libm.a ( * ) | 
				
			||||
    libgcc.a ( * ) | 
				
			||||
  } | 
				
			||||
 | 
				
			||||
  .ARM.attributes 0 : { *(.ARM.attributes) } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,13 @@ | 
				
			||||
style=kr | 
				
			||||
indent=tab | 
				
			||||
max-instatement-indent=60 | 
				
			||||
 | 
				
			||||
convert-tabs | 
				
			||||
 | 
				
			||||
indent-switches | 
				
			||||
 | 
				
			||||
pad-oper | 
				
			||||
unpad-paren | 
				
			||||
pad-header | 
				
			||||
 | 
				
			||||
verbose | 
				
			||||
					Loading…
					
					
				
		Reference in new issue