diff options
-rw-r--r-- | openocd/openocd.stm32f072-disco.cfg | 14 | ||||
-rw-r--r-- | rules.stm32f0.mk | 9 | ||||
-rw-r--r-- | shared/usart_stdio.c | 34 | ||||
-rw-r--r-- | tests/adc-power/Makefile.stm32f072-disco | 19 | ||||
-rw-r--r-- | tests/adc-power/adc-power.c | 6 | ||||
-rw-r--r-- | tests/adc-power/main-stm32f072-disco.c | 67 |
6 files changed, 146 insertions, 3 deletions
diff --git a/openocd/openocd.stm32f072-disco.cfg b/openocd/openocd.stm32f072-disco.cfg new file mode 100644 index 0000000..b16f969 --- /dev/null +++ b/openocd/openocd.stm32f072-disco.cfg @@ -0,0 +1,14 @@ +source [find interface/stlink-v2.cfg] +set WORKAREASIZE 0x4000 +source [find target/stm32f0x.cfg] + +# serial of my f072 disco board. +hla_serial "Q?o\x06PgHW#$\x16?" + +# no trace on cm0 +#tpiu config internal swodump.stm32f4disco.log uart off 168000000 + +# Uncomment to reset on connect, for grabbing under WFI et al +reset_config srst_only srst_nogate +# reset_config srst_only srst_nogate connect_assert_srst + diff --git a/rules.stm32f0.mk b/rules.stm32f0.mk new file mode 100644 index 0000000..bcd82be --- /dev/null +++ b/rules.stm32f0.mk @@ -0,0 +1,9 @@ +LDSCRIPT = $(OPENCM3_DIR)/lib/stm32/f0/stm32f07xzb.ld +OPENCM3_LIB = opencm3_stm32f0 +OPENCM3_DEFS = -DSTM32F0 +#FP_FLAGS ?= -mfloat-abi=hard -mfpu=fpv4-sp-d16 +ARCH_FLAGS = -mthumb -mcpu=cortex-m0 $(FP_FLAGS) +#OOCD_INTERFACE = stlink-v2 +#OOCD_TARGET = stm32f4x +OOCD_FILE = openocd.stm32f072disco.cfg + diff --git a/shared/usart_stdio.c b/shared/usart_stdio.c new file mode 100644 index 0000000..6a6866e --- /dev/null +++ b/shared/usart_stdio.c @@ -0,0 +1,34 @@ +/* + * support for stdio output to a usart + * Karl Palsson, 2015 <karlp@tweak.net.au> + */ + +#include <errno.h> +#include <stdio.h> +#include <unistd.h> + +#include <libopencm3/stm32/usart.h> + +#ifndef STDIO_USART +#define STDIO_USART USART1 +#endif + +int _write(int file, char *ptr, int len); +int _write(int file, char *ptr, int len) +{ + int i; + + if (file == STDOUT_FILENO || file == STDERR_FILENO) { + for (i = 0; i < len; i++) { + if (ptr[i] == '\n') { + usart_send_blocking(STDIO_USART, '\r'); + } + usart_send_blocking(STDIO_USART, ptr[i]); + } + return i; + } + errno = EIO; + return -1; +} + + diff --git a/tests/adc-power/Makefile.stm32f072-disco b/tests/adc-power/Makefile.stm32f072-disco new file mode 100644 index 0000000..99eade8 --- /dev/null +++ b/tests/adc-power/Makefile.stm32f072-disco @@ -0,0 +1,19 @@ +BOARD = stm32f072-disco +PROJECT = adc-power-$(BOARD) +BUILD_DIR = bin-$(BOARD) + +SHARED_DIR = ../../shared + +CFILES = main-$(BOARD).c +CFILES += adc-power.c +# No trace on cm0! +#CFILES += trace.c trace_stdio.c +CFILES += usart_stdio.c + +VPATH += $(SHARED_DIR) + +INCLUDES += $(patsubst %,-I%, . $(SHARED_DIR)) + +OPENCM3_DIR=../../libopencm3 +include ../../rules.stm32f0.mk +include ../../rules.mk diff --git a/tests/adc-power/adc-power.c b/tests/adc-power/adc-power.c index 734e3af..c673666 100644 --- a/tests/adc-power/adc-power.c +++ b/tests/adc-power/adc-power.c @@ -22,7 +22,7 @@ // Still have some bad shit to deal with... #if defined(STM32F0) #define SEPARATE_ADC_SAMPLING 0 -#define SAMPLE_TIME_BASIC ADC_SMPR_SMP_239DOT5 +#define SAMPLE_TIME_BASIC ADC_SMPR_SMP_239DOT5 // 4usec or more for tempsensor #elif defined(STM32F3) #define SAMPLE_TIME_BASIC ADC_SMPR1_SMP_181DOT5CYC #define SAMPLE_TIME_TEMP ADC_SMPR1_SMP_601DOT5CYC // 2.2usecs or more @@ -67,7 +67,7 @@ void adc_power_init(void) adc_enable_scan_mode(ADC1); ADC_CR2 |= ADC_CR2_EOCS; // FIXME #else - adc_disable_scan_mode(ADC1); + // FIXME - f0! adc_disable_scan_mode(ADC1); #endif #endif @@ -150,4 +150,4 @@ void adc_power_task_down() adc_power_off(ADC1); unsigned int td = TIM_CNT(TIMER); printf("toff in: %u\n", td); -}
\ No newline at end of file +} diff --git a/tests/adc-power/main-stm32f072-disco.c b/tests/adc-power/main-stm32f072-disco.c new file mode 100644 index 0000000..4a960e1 --- /dev/null +++ b/tests/adc-power/main-stm32f072-disco.c @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2015 Karl Palsson <karlp@tweak.net.au> + */ + +#include <libopencm3/cm3/nvic.h> +#include <libopencm3/stm32/crs.h> +#include <libopencm3/stm32/gpio.h> +#include <libopencm3/stm32/rcc.h> +#include <libopencm3/stm32/usart.h> + +#include <stdio.h> +#include "adc-power.h" + +static +void setup_usart(void) +{ + uint32_t dev = USART1; + rcc_periph_clock_enable(RCC_USART1); + rcc_periph_clock_enable(RCC_GPIOA); + gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO9); + gpio_set_af(GPIOA, GPIO_AF1, GPIO9); + + usart_set_baudrate(dev, 115200); + usart_set_databits(dev, 8); + usart_set_parity(dev, USART_PARITY_NONE); + usart_set_stopbits(dev, USART_CR2_STOP_1_0BIT); + usart_set_mode(dev, USART_MODE_TX); + usart_set_flow_control(dev, USART_FLOWCONTROL_NONE); + + /* Finally enable the USART. */ + usart_enable(dev); +} + +int main(void) +{ + int i; + rcc_clock_setup_in_hsi48_out_48mhz(); + setup_usart(); + + /* LED on for boot progress */ + rcc_periph_clock_enable(RCC_GPIOC); + gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO7); + gpio_set(GPIOC, GPIO7); + + printf("hi guys!\n"); + + rcc_periph_clock_enable(RCC_GPIOA); + gpio_mode_setup(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO1); + gpio_mode_setup(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO5); + adc_power_init(); + while (1) { + adc_power_task_up(); + gpio_toggle(GPIOC, GPIO7); + + for (i = 0; i < 0x100000; i++) { /* Wait a bit. */ + __asm__("NOP"); + } + printf("tick...\n"); + adc_power_task_down(); + gpio_toggle(GPIOC, GPIO7); + for (i = 0; i < 0x100000; i++) { /* Wait a bit. */ + __asm__("NOP"); + } + } + +} + |