Permalink
Browse files

Merge pull request #120 from Jeff-Ciesielski/stm32_cl

Add initial support for STM32F1x Connectivity Line devices
  • Loading branch information...
malvira committed Feb 24, 2013
2 parents a7b3e99 + 6b97fa8 commit 029bc0ee276cdc0d265a0b3312492159bea5e29e
@@ -0,0 +1,169 @@
+# Adapted from Makefile.stm32f103
+
+# Default to STM32F107VCT7
+ifndef SUBTARGET
+$(warning SUBTARGET not defined, defaulting to STM32F107VCT)
+SUBTARGET = 7VCT
+endif
+
+### libopencm3 specifics
+OPENCM3_BASE=
+OPENCM3_FAMILY=STM32F1
+OPENCM3_LIB=opencm3_stm32f1
+
+ifndef OPENCM3_BASE
+$(error OPENCM3_BASE not defined. Please set definition to root of libopencm3)
+endif
+### Code common for all ARM CPUs
+
+CONTIKI_CPU_ARM=$(CONTIKI)/cpu/arm
+CONTIKI_CPU_ARM_COMMON=$(CONTIKI_CPU_ARM)/common
+
+### Define the CPU directory
+CONTIKI_CPU=$(CONTIKI_CPU_ARM)/stm32f1x_cl
+
+### Define the source files we have in the STM32F1x_cl port
+
+CONTIKI_CPU_DIRS = .
+
+STM32F1x = clock.c util.c uip-log.c symbols.c
+
+#Using the opencm3 usb library for now
+#include $(CONTIKI_CPU_ARM_COMMON)/usb/Makefile.usb
+
+#No SD support for now...This is a TODO
+#include $(CONTIKI_CPU_ARM_COMMON)/SD-card/Makefile.sdcard
+
+TARGETLIBS = random.c
+
+CONTIKI_TARGET_SOURCEFILES += $(STM32F1x) $(TARGETLIBS)
+
+CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES)
+
+PREFIX = arm-none-eabi
+
+### Compiler definitions
+CC = $(PREFIX)-gcc
+LD = $(PREFIX)-ld
+AS = $(PREFIX)-as
+AR = $(PREFIX)-ar
+NM = $(PREFIX)-nm
+OBJCOPY = $(PREFIX)-objcopy
+STRIP = $(PREFIX)-strip
+
+XSLTPROC=xsltproc
+
+PROJECT_OBJECTFILES += ${addprefix $(OBJECTDIR)/,$(CONTIKI_TARGET_MAIN:.c=.o)}
+
+LINKERSCRIPT = $(CONTIKI_CPU)/STM32F10$(SUBTARGET).ld
+
+# DFU-UTIL program upload
+DFU_UTIL=dfu-util
+DFU_UTIL_OFFSET=0x08000000
+
+# Use dfu-util by default
+PROG=dfuutil
+
+ARCH_FLAGS= -mcpu=cortex-m3 -mthumb
+
+#CONTIKI_CFLAGS = -DWITH_UIP -DWITH_ASCII
+
+CFLAGSNO = -I. -I$(CONTIKI)/core -I$(CONTIKI_CPU) \
+ -I$(OPENCM3_BASE)/include \
+ -I$(CONTIKI)/platform/$(TARGET) \
+ ${addprefix -I,$(APPDIRS)} \
+ -DMCK=$(MCK) -DSUBTARGET=$(SUBTARGET) \
+ -Wall $(ARCH_FLAGS) -g -DSTM32F1 -MD
+
+CFLAGS += $(CONTIKI_CFLAGS) $(CFLAGSNO) -Os
+
+LDFLAGS += -L $(CONTIKI_CPU) -T $(LINKERSCRIPT) \
+ -Wl,--start-group -lc -lgcc -Wl,--end-group\
+ -nostartfiles -Wl,--gc-sections $(ARCH_FLAGS)
+
+EXTERN_LIBS += -L $(OPENCM3_BASE)/lib -l$(OPENCM3_LIB)
+
+CDEPFLAGS = $(CFLAGS) -D __MAKING_DEPS__
+
+### Setup directory search path for source files
+
+CUSTOM_RULE_C_TO_OBJECTDIR_O=yes
+CUSTOM_RULE_C_TO_O=yes
+
+%.o: %.c
+ $(CC) $(CFLAGS) $< -c
+
+$(OBJECTDIR)/%.o: %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+
+
+CUSTOM_RULE_S_TO_OBJECTDIR_O = yes
+%.o: %.S
+ $(CC) $(CFLAGS) $< -c
+
+$(OBJECTDIR)/%.o: %.S
+ $(CC) $(CFLAGS) $< -c -o $@
+
+
+CUSTOM_RULE_C_TO_CO=yes
+
+%.co: %.c
+ $(CC) $(CFLAGS) $< -c -o $@
+
+CUSTOM_RULE_C_TO_CE=yes
+
+%.ce: %.o
+ $(LD) $(LDFLAGS) --relocatable -T $(CONTIKI_CPU)/merge-rodata.ld $< -o $@
+ $(STRIP) -K _init -K _fini --strip-unneeded -g -x $@
+
+CUSTOM_RULE_LINK=yes
+
+%-stripped.o: %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+ $(STRIP) --strip-unneeded -g -x $@
+
+%-stripped.o: %.o
+ $(STRIP) --strip-unneeded -g -x -o $@ $<
+
+%.o: ${CONTIKI_TARGET}/loader/%.S
+ $(AS) -o $(notdir $(<:.S=.o)) $<
+
+%-nosyms.$(TARGET): %.co $(PROJECT_OBJECTFILES) contiki-$(TARGET).a # $(OBJECTDIR)/empty-symbols.o
+ $(CC) $(LDFLAGS) $(CFLAGS) -nostartfiles -o $@ $(filter-out %.a,$^) $(filter %.a,$^) -lc $(filter %.a,$^) $(EXTERN_LIBS)
+
+
+%.ihex: %.$(TARGET)
+ $(OBJCOPY) $^ -O ihex $@
+
+%.bin: %.$(TARGET)
+ $(OBJCOPY) -O binary $< $@
+
+.PHONY: symbols.c
+ifdef CORE
+%.$(TARGET): %.co $(PROJECT_OBJECTFILES) contiki-$(TARGET).a $(STARTUP) $(OBJECTDIR)/symbols.o
+ $(CC) $(LDFLAGS) $(CFLAGS) -nostartfiles -o $@ $(filter-out %.a,$^) $(filter %.a,$^) -lc $(filter %.a,$^)
+
+symbols.c: $(CORE)
+ $(NM) $< | awk -f $(CONTIKI_CPU)/builtins.awk -f ../../tools/mknmlist > symbols.c
+
+else
+%.$(TARGET): %-nosyms.$(TARGET)
+ ln -sf $< $@
+endif
+
+empty-symbols.c:
+ cp ${CONTIKI}/tools/empty-symbols.c symbols.c
+ cp ${CONTIKI}/tools/empty-symbols.h symbols.h
+
+# Don't use core/loader/elfloader.c, use elfloader-otf.c instead
+$(OBJECTDIR)/elfloader.o:
+ echo -n >$@
+
+clean: clean_cpu
+
+.PHONY: stm32test_clean
+
+clean_cpu:
+ -rm -rf $(BUILTSRCDIR)
+
+.PRECIOUS: %-nosyms.$(TARGET)
@@ -0,0 +1,54 @@
+MEMORY
+{
+ CODE (rx) : ORIGIN = 0x08000000, LENGTH = 256K
+ DATA (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
+}
+
+/* Section Definitions */
+
+EXTERN (vector_table)
+ENTRY(reset_handler)
+SECTIONS
+{
+
+/* Make sure the vector table is at address 0 */
+
+ .text : {
+ *(.vectors)
+ *(.text*)
+ . = ALIGN(4);
+ *(.rodata*)
+ . = ALIGN(4);
+ } >CODE
+
+ . = ALIGN(4);
+ _etext = . ;
+ PROVIDE (etext = .);
+
+ .data :
+ {
+ _data = . ;
+ *(.data*)
+ . = ALIGN(4);
+ _edata = . ;
+ PROVIDE (_edata = .);
+ } >DATA AT >CODE
+ _data_loadaddr = LOADADDR(.data);
+
+/* .bss section which is used for uninitialized data */
+
+ .bss :
+ {
+ __bss_start = . ;
+ __bss_start__ = . ;
+ *(.bss*)
+ *(COMMON)
+ . = ALIGN(4);
+ _ebss = . ;
+ } >DATA
+ . = ALIGN(4);
+
+ _end = .;
+ PROVIDE (_end = .);
+}
+PROVIDE(_stack = ORIGIN(DATA) + LENGTH(DATA));
@@ -0,0 +1,78 @@
+#include <sys/clock.h>
+#include <sys/cc.h>
+#include <sys/etimer.h>
+#include <debug-uart.h>
+
+#include <libopencm3/cm3/systick.h>
+
+static volatile clock_time_t current_clock = 0;
+static volatile unsigned long current_seconds = 0;
+static unsigned int second_countdown = CLOCK_SECOND;
+
+void sys_tick_handler(void) __attribute__ ((interrupt));
+
+void
+sys_tick_handler(void)
+{
+ current_clock++;
+ if(etimer_pending() && etimer_next_expiration_time() <= current_clock) {
+ etimer_request_poll();
+ /* printf("%d,%d\n", clock_time(),etimer_next_expiration_time ()); */
+ }
+
+ if(--second_countdown == 0) {
+ current_seconds++;
+ second_countdown = CLOCK_SECOND;
+ }
+}
+
+
+void
+clock_init()
+{
+ systick_set_clocksource(STK_CTRL_CLKSOURCE_AHB_DIV8);
+
+ /*72mhz / 8 / 1000 */
+ systick_set_reload(MCK / 8 / CLOCK_SECOND);
+
+ systick_interrupt_enable();
+ systick_counter_enable();
+}
+
+clock_time_t
+clock_time(void)
+{
+ return current_clock;
+}
+
+unsigned long
+clock_seconds(void)
+{
+ return current_seconds;
+}
+
+/* TODO: This code needs to be evaluated for the stm32f107 and
+ * implemented
+ */
+#if 0
+/* The inner loop takes 4 cycles. The outer 5+SPIN_COUNT*4. */
+
+#define SPIN_TIME 2 /* us */
+#define SPIN_COUNT (((MCK*SPIN_TIME/1000000)-5)/4)
+
+#ifndef __MAKING_DEPS__
+
+void
+clock_delay(unsigned int t)
+{
+#ifdef __THUMBEL__
+ asm
+ volatile
+ ("1: mov r1,%2\n2:\tsub r1,#1\n\tbne 2b\n\tsub %0,#1\n\tbne 1b\n":"=l"
+ (t):"0"(t), "l"(SPIN_COUNT));
+#else
+#error Must be compiled in thumb mode
+#endif
+}
+#endif
+#endif /* __MAKING_DEPS__ */
@@ -0,0 +1,13 @@
+/*
+ * Implementation of multithreading in ARM Cortex-M3. To be done.
+ */
+
+
+#ifndef __MTARCH_H__
+#define __MTARCH_H__
+
+struct mtarch_thread {
+ short mt_thread;
+};
+
+#endif /* __MTARCH_H__ */
@@ -0,0 +1,16 @@
+
+void
+rtimer_arch_init(void)
+{
+}
+
+void
+rtimer_arch_set(rtimer_clock_t t)
+{
+}
+
+rtimer_clock_t
+rtimer_arch_now(void)
+{
+ return 0;
+}
@@ -0,0 +1,22 @@
+/**
+ * \file
+ * Header file for the STM32F107-specific rtimer code
+ * \author
+ * Jeff Ciesielski <jeffciesielski@gmail.com>
+ * Adapted from stm32f103 example
+ */
+
+#ifndef __RTIMER_ARCH_H__
+#define __RTIMER_ARCH_H__
+
+#include "sys/rtimer.h"
+
+#define RTIMER_ARCH_SECOND (MCK/1024)
+
+void rtimer_arch_init(void);
+
+void rtimer_arch_set(rtimer_clock_t t);
+
+rtimer_clock_t rtimer_arch_now(void);
+
+#endif /* __RTIMER_ARCH_H__ */
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+void
+uip_log(char *msg)
+{
+ printf("uip: %s\n", msg);
+}
View
@@ -0,0 +1,12 @@
+#include <stdint.h>
+
+uint32_t retval;
+
+uint32_t
+get_msp(void)
+{
+ asm("ldr r1, =retval");
+ asm("mrs r0, msp");
+ asm("str r0, [r1]");
+ return retval;
+}
@@ -0,0 +1,5 @@
+#ifndef _UTIL_H_
+#define _UTIL_H_
+#include <stdint.h>
+uint32_t get_msp(void);
+#endif /*_UTIL_H_*/
Oops, something went wrong.

0 comments on commit 029bc0e

Please sign in to comment.