From 85eb51aacb3b6ceaf1575112cd363eb9d3a4649b Mon Sep 17 00:00:00 2001 From: Jean-Claude Wippler Date: Sat, 31 Oct 2015 16:25:42 +0100 Subject: [PATCH 1/6] wait for time to elapse instead of a cycle-counting loop --- STM32F1/cores/maple/wirish_time.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/STM32F1/cores/maple/wirish_time.cpp b/STM32F1/cores/maple/wirish_time.cpp index 5faa1e4..08fd2d1 100644 --- a/STM32F1/cores/maple/wirish_time.cpp +++ b/STM32F1/cores/maple/wirish_time.cpp @@ -34,10 +34,9 @@ #include void delay(unsigned long ms) { - uint32 i; - for (i = 0; i < ms; i++) { - delayMicroseconds(1000); - } + uint32 start = millis(); + while (millis() - start < ms) + ; } void delayMicroseconds(uint32 us) { From 842d8ee580c986364de47df38189fd648c743b61 Mon Sep 17 00:00:00 2001 From: Roger Clark Date: Thu, 5 Nov 2015 20:28:09 +1100 Subject: [PATCH 2/6] Manually updated fix by @jcw for serial usb slow down --- STM32F1/cores/maple/usb_serial.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/STM32F1/cores/maple/usb_serial.cpp b/STM32F1/cores/maple/usb_serial.cpp index fcc39b1..6d0be3e 100644 --- a/STM32F1/cores/maple/usb_serial.cpp +++ b/STM32F1/cores/maple/usb_serial.cpp @@ -126,12 +126,17 @@ size_t n = 0; } - if (sent == USB_CDCACM_TX_EPSIZE) { - while (usb_cdcacm_is_transmitting() != 0) { - } - /* flush out to avoid having the pc wait for more data */ - usb_cdcacm_tx(NULL, 0); - } +#if 0 +// this code leads to a serious performance drop and appears to be +// unnecessary - everything seems to work fine without, -jcw, 2015-11-05 +// see http://stm32duino.com/posting.php?mode=quote&f=3&p=7746 + if (sent == USB_CDCACM_TX_EPSIZE) { + while (usb_cdcacm_is_transmitting() != 0) { + } + /* flush out to avoid having the pc wait for more data */ + usb_cdcacm_tx(NULL, 0); + } +#endif return n; } From 91014b40a865db9750455b04df8b2a201a3b0646 Mon Sep 17 00:00:00 2001 From: Jean-Claude Wippler Date: Thu, 5 Nov 2015 16:27:24 +0100 Subject: [PATCH 3/6] fixes #125 --- STM32F1/libraries/SPI/src/SPI.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/STM32F1/libraries/SPI/src/SPI.h b/STM32F1/libraries/SPI/src/SPI.h index 7951a80..98fef47 100644 --- a/STM32F1/libraries/SPI/src/SPI.h +++ b/STM32F1/libraries/SPI/src/SPI.h @@ -88,8 +88,8 @@ #endif // PC13 or PA4 -//#define BOARD_SPI_DEFAULT_SS PA4 -#define BOARD_SPI_DEFAULT_SS PC13 +#define BOARD_SPI_DEFAULT_SS PA4 +//#define BOARD_SPI_DEFAULT_SS PC13 #define SPI_MODE0 SPI_MODE_0 #define SPI_MODE1 SPI_MODE_1 From b495a4e00fbb36ad6febaf0d76ecc68d7a0c1fd0 Mon Sep 17 00:00:00 2001 From: Jean-Claude Wippler Date: Sat, 7 Nov 2015 00:49:34 +0100 Subject: [PATCH 4/6] support Nucleo w/o and w/ crystal --- STM32F1/boards.txt | 12 ++++++++++-- STM32F1/variants/nucleo_f103rb/wirish/boards.cpp | 2 ++ .../variants/nucleo_f103rb/wirish/boards_setup.cpp | 10 +++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index daed225..1c5e533 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -125,10 +125,8 @@ nucleo_f103rb.upload.altID=1 nucleo_f103rb.upload.auto_reset=true nucleo_f103rb.build.mcu=cortex-m3 -nucleo_f103rb.build.f_cpu=72000000L nucleo_f103rb.build.board=STM_NUCLEU_F103RB nucleo_f103rb.build.core=maple -nucleo_f103rb.build.extra_flags=-DMCU_STM32F103RB -mthumb -march=armv7-m -D__STM32F1__ nucleo_f103rb.build.ldscript=ld/jtag.ld nucleo_f103rb.build.variant=nucleo_f103rb nucleo_f103rb.build.variant_system_lib=libmaple.a @@ -139,6 +137,16 @@ nucleo_f103rb.build.error_led_pin=1 nucleo_f103rb.build.gcc_ver=gcc-arm-none-eabi-4.8.3-2014q1 nucleo_f103rb.build.vect=VECT_TAB_ADDR=0x8000000 +## internal oscillator (HSI), running at 64 MHz +nucleo_f103rb.menu.device_variant.NucleoF103_HSI=Nucleo F103 @ 64 MHz +nucleo_f103rb.menu.device_variant.NucleoF103_HSI.build.f_cpu=64000000L +nucleo_f103rb.menu.device_variant.NucleoF103_HSI.build.extra_flags=-DMCU_STM32F103RB -mthumb -march=armv7-m -D__STM32F1__ + +## external crystal (HSE), running at 72 MHz +nucleo_f103rb.menu.device_variant.NucleoF103_HSE=Nucleo F103 @ 72 MHz w/ crystal +nucleo_f103rb.menu.device_variant.NucleoF103_HSE.build.f_cpu=72000000L +nucleo_f103rb.menu.device_variant.NucleoF103_HSE.build.extra_flags=-DNUCLEO_HSE_CRYSTAL -DMCU_STM32F103RB -mthumb -march=armv7-m -D__STM32F1__ + ###################### Generic STM32F103C ######################################## genericSTM32F103C.name=Generic STM32F103C series diff --git a/STM32F1/variants/nucleo_f103rb/wirish/boards.cpp b/STM32F1/variants/nucleo_f103rb/wirish/boards.cpp index 57d8ca0..4cb5854 100644 --- a/STM32F1/variants/nucleo_f103rb/wirish/boards.cpp +++ b/STM32F1/variants/nucleo_f103rb/wirish/boards.cpp @@ -121,10 +121,12 @@ static void setup_clocks(void) { // readiness interrupts. RCC_BASE->CIR = 0x00000000; +#if NUCLEO_HSE_CRYSTAL // Enable HSE, and wait until it's ready. rcc_turn_on_clk(RCC_CLK_HSE); while (!rcc_is_clk_ready(RCC_CLK_HSE)) ; +#endif // Configure AHBx, APBx, etc. prescalers and the main PLL. wirish::priv::board_setup_clock_prescalers(); diff --git a/STM32F1/variants/nucleo_f103rb/wirish/boards_setup.cpp b/STM32F1/variants/nucleo_f103rb/wirish/boards_setup.cpp index 17b3336..40531ad 100644 --- a/STM32F1/variants/nucleo_f103rb/wirish/boards_setup.cpp +++ b/STM32F1/variants/nucleo_f103rb/wirish/boards_setup.cpp @@ -48,14 +48,22 @@ // works for F103 performance line MCUs, which is all that LeafLabs // currently officially supports). #ifndef BOARD_RCC_PLLMUL +#if NUCLEO_HSE_CRYSTAL #define BOARD_RCC_PLLMUL RCC_PLLMUL_9 +#else +#define BOARD_RCC_PLLMUL RCC_PLLMUL_16 +#endif #endif namespace wirish { namespace priv { static stm32f1_rcc_pll_data pll_data = {BOARD_RCC_PLLMUL}; +#if NUCLEO_HSE_CRYSTAL __weak rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSE, &pll_data}; +#else + __weak rcc_pll_cfg w_board_pll_cfg = {RCC_PLLSRC_HSI_DIV_2, &pll_data}; +#endif __weak adc_prescaler w_adc_pre = ADC_PRE_PCLK2_DIV_6; __weak adc_smp_rate w_adc_smp = ADC_SMPR_55_5; @@ -71,7 +79,7 @@ namespace wirish { #if F_CPU == 72000000 rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); #elif F_CPU == 48000000 - rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5); + rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1); #endif } From 081b6d52f81dcf8161675a2e2a2bdeea79c6b7fc Mon Sep 17 00:00:00 2001 From: Jean-Claude Wippler Date: Wed, 11 Nov 2015 14:07:49 +0100 Subject: [PATCH 5/6] fix typo --- STM32F1/boards.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32F1/boards.txt b/STM32F1/boards.txt index 1c5e533..b034584 100644 --- a/STM32F1/boards.txt +++ b/STM32F1/boards.txt @@ -125,7 +125,7 @@ nucleo_f103rb.upload.altID=1 nucleo_f103rb.upload.auto_reset=true nucleo_f103rb.build.mcu=cortex-m3 -nucleo_f103rb.build.board=STM_NUCLEU_F103RB +nucleo_f103rb.build.board=STM_NUCLEO_F103RB nucleo_f103rb.build.core=maple nucleo_f103rb.build.ldscript=ld/jtag.ld nucleo_f103rb.build.variant=nucleo_f103rb From 3e41a7458c136885794a71a1ea1717a14ea273d5 Mon Sep 17 00:00:00 2001 From: Jean-Claude Wippler Date: Sun, 15 Nov 2015 13:51:32 +0100 Subject: [PATCH 6/6] remove the cflag check --- tools/src/stm32flash_serial/src/serial_posix.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tools/src/stm32flash_serial/src/serial_posix.c b/tools/src/stm32flash_serial/src/serial_posix.c index 7013436..a2e0204 100644 --- a/tools/src/stm32flash_serial/src/serial_posix.c +++ b/tools/src/stm32flash_serial/src/serial_posix.c @@ -182,11 +182,18 @@ static port_err_t serial_setup(serial_t *h, const serial_baud_t baud, if (tcsetattr(h->fd, TCSANOW, &h->newtio) != 0) return PORT_ERR_UNKNOWN; +/* this check fails on CDC-ACM devices, bits 16 and 17 of cflag differ! + * it has been disabled below for now -jcw, 2015-11-09 + if (settings.c_cflag != h->newtio.c_cflag) + fprintf(stderr, "c_cflag mismatch %lx\n", + settings.c_cflag ^ h->newtio.c_cflag); + */ + /* confirm they were set */ tcgetattr(h->fd, &settings); if (settings.c_iflag != h->newtio.c_iflag || settings.c_oflag != h->newtio.c_oflag || - settings.c_cflag != h->newtio.c_cflag || + //settings.c_cflag != h->newtio.c_cflag || settings.c_lflag != h->newtio.c_lflag) return PORT_ERR_UNKNOWN;