diff --git a/src/platforms/f4discovery/Makefile.inc b/src/platforms/f4discovery/Makefile.inc index c177150..ae6b75a 100644 --- a/src/platforms/f4discovery/Makefile.inc +++ b/src/platforms/f4discovery/Makefile.inc @@ -8,8 +8,15 @@ CFLAGS += -Istm32/include -mcpu=cortex-m4 -mthumb \ -DSTM32F4 -I../libopencm3/include \ -Iplatforms/stm32 +ifeq ($(BLACKPILL), 1) +LINKER_SCRIPT=platforms/stm32/blackpillv2.ld +CFLAGS += -DBLACKPILL=1 +else +LINKER_SCRIPT=platforms/stm32/f4discovery.ld +endif + LDFLAGS_BOOT = -lopencm3_stm32f4 \ - -Wl,-T,platforms/stm32/f4discovery.ld -nostartfiles -lc -lnosys \ + -Wl,-T,$(LINKER_SCRIPT) -nostartfiles -lc -lnosys \ -Wl,-Map=mapfile -mthumb -mcpu=cortex-m4 -Wl,-gc-sections \ -mfloat-abi=hard -mfpu=fpv4-sp-d16 \ -L../libopencm3/lib diff --git a/src/platforms/f4discovery/Readme.md b/src/platforms/f4discovery/Readme.md index a3dae25..cef8748 100644 --- a/src/platforms/f4discovery/Readme.md +++ b/src/platforms/f4discovery/Readme.md @@ -11,3 +11,55 @@ PC6: TDO/TRACESWO
PC1: TRST
PC8: SRST
+ +# Alternate build for stm32f401 stm32f411 MiniF4 aka BlackPillV2 boards. + +https://github.com/WeActTC/MiniSTM32F4x1 + +## Connections: + +* JTAG/SWD + * PA1: TDI + * PA13: TMS/SWDIO + * PA14: TCK/SWCLK + * PB3: TDO/TRACESWO + * PB5: TRST + * PB4: SRST + +* USB USART + * PB6: USART1 TX (usbuart_xxx) + * PB7: USART1 RX (usbuart_xxx) + +* +3V3. + * PB8 - turn on IRLML5103 transistor + +How to Build +======================================== +``` +cd blackmagic +make clean +make PROBE_HOST=f4discovery BLACKPILL=1 +``` + +How to Flash with dfu +======================================== +* After build: + * 1) `apt install dfu-util` + * 2) Force the F4 into system bootloader mode by jumpering "BOOT0" to "3V3" and "PB2/BOOT1" to "GND" and reset (RESET button). System bootloader should appear. + * 3) `dfu-util -a 0 --dfuse-address 0x08000000 -D blackmagic.bin` + +To exit from dfu mode press a "key" and "reset", release reset. BMP firmware should appear + + +10 pin male from pins +======================================== + +| PB3/TDO | PB7/RX | PB8/TX | X | PA1/TDI | +| -------- | ----------- | ---------- | ---------- | ------- | +| PB4/SRST | +3V3/PB8 SW | PA13/SWDIO | PA14/SWCLK | GND | + +SWJ frequency setting +==================================== +https://github.com/blacksphere/blackmagic/pull/783#issue-529197718 + +`mon freq 900k` helps at most diff --git a/src/platforms/f4discovery/platform.c b/src/platforms/f4discovery/platform.c index 2eb6bcb..4233f10 100644 --- a/src/platforms/f4discovery/platform.c +++ b/src/platforms/f4discovery/platform.c @@ -37,20 +37,32 @@ #include #include +#ifdef BLACKPILL +#include +#endif + + jmp_buf fatal_error_jmpbuf; extern char _ebss[]; void platform_init(void) { volatile uint32_t *magic = (uint32_t *)_ebss; - /* Check the USER button*/ + /* Enable GPIO peripherals */ rcc_periph_clock_enable(RCC_GPIOA); + rcc_periph_clock_enable(RCC_GPIOC); +#ifdef BLACKPILL + rcc_periph_clock_enable(RCC_GPIOB); +#else + rcc_periph_clock_enable(RCC_GPIOD); +#endif + /* Check the USER button*/ if (gpio_get(GPIOA, GPIO0) || - ((magic[0] == BOOTMAGIC0) && (magic[1] == BOOTMAGIC1))) { + ((magic[0] == BOOTMAGIC0) && (magic[1] == BOOTMAGIC1))) + { magic[0] = 0; magic[1] = 0; /* Assert blue LED as indicator we are in the bootloader */ - rcc_periph_clock_enable(RCC_GPIOD); gpio_mode_setup(LED_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED_BOOTLOADER); gpio_set(LED_PORT, LED_BOOTLOADER); @@ -58,44 +70,65 @@ void platform_init(void) As we just come out of reset, no other deinit is needed!*/ rcc_periph_clock_enable(RCC_SYSCFG); SYSCFG_MEMRM &= ~3; - SYSCFG_MEMRM |= 1; + SYSCFG_MEMRM |= 1; scb_reset_core(); } - +#ifdef BLACKPILL + rcc_clock_setup_pll(&rcc_hse_25mhz_3v3[RCC_CLOCK_3V3_84MHZ]); +#else rcc_clock_setup_pll(&rcc_hse_8mhz_3v3[RCC_CLOCK_3V3_168MHZ]); +#endif /* Enable peripherals */ rcc_periph_clock_enable(RCC_OTGFS); - rcc_periph_clock_enable(RCC_GPIOC); - rcc_periph_clock_enable(RCC_GPIOD); rcc_periph_clock_enable(RCC_CRC); /* Set up USB Pins and alternate function*/ - gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO9 | GPIO11 | GPIO12); + gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO9 | GPIO11 | GPIO12); gpio_set_af(GPIOA, GPIO_AF10, GPIO9 | GPIO10 | GPIO11 | GPIO12); - GPIOC_OSPEEDR &=~0xF30; +#ifdef BLACKPILL + GPIOA_OSPEEDR &= 0x3C00000C; + GPIOA_OSPEEDR |= 0x28000008; +#else + GPIOC_OSPEEDR &= ~0xF30; GPIOC_OSPEEDR |= 0xA20; +#endif + gpio_mode_setup(JTAG_PORT, GPIO_MODE_OUTPUT, - GPIO_PUPD_NONE, - TCK_PIN | TDI_PIN); + GPIO_PUPD_NONE, + TCK_PIN | TDI_PIN); gpio_mode_setup(JTAG_PORT, GPIO_MODE_INPUT, - GPIO_PUPD_NONE, TMS_PIN); + GPIO_PUPD_NONE, TMS_PIN); gpio_set_output_options(JTAG_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, TCK_PIN | TDI_PIN | TMS_PIN); gpio_mode_setup(TDO_PORT, GPIO_MODE_INPUT, - GPIO_PUPD_NONE, - TDO_PIN); + GPIO_PUPD_NONE, + TDO_PIN); gpio_set_output_options(TDO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, - TDO_PIN| TMS_PIN); + TDO_PIN | TMS_PIN); gpio_mode_setup(LED_PORT, GPIO_MODE_OUTPUT, - GPIO_PUPD_NONE, - LED_UART | LED_IDLE_RUN | LED_ERROR | LED_BOOTLOADER); + GPIO_PUPD_NONE, + LED_IDLE_RUN | LED_ERROR | LED_BOOTLOADER); + + gpio_mode_setup(LED_PORT_UART, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED_UART); + +#ifdef PLATFORM_HAS_POWER_SWITCH + gpio_set(PWR_BR_PORT, PWR_BR_PIN); + gpio_mode_setup(PWR_BR_PORT, GPIO_MODE_OUTPUT, + GPIO_PUPD_NONE, + PWR_BR_PIN); +#endif platform_timing_init(); usbuart_init(); cdcacm_init(); +#ifdef BLACKPILL + // https://github.com/libopencm3/libopencm3/pull/1256#issuecomment-779424001 + OTG_FS_GCCFG |= OTG_GCCFG_NOVBUSSENS | OTG_GCCFG_PWRDWN; + OTG_FS_GCCFG &= ~(OTG_GCCFG_VBUSBSEN | OTG_GCCFG_VBUSASEN); +#endif } void platform_srst_set_val(bool assert) { (void)assert; } @@ -108,8 +141,20 @@ const char *platform_target_voltage(void) void platform_request_boot(void) { - uint32_t *magic = (uint32_t *) &_ebss; + uint32_t *magic = (uint32_t *)&_ebss; magic[0] = BOOTMAGIC0; magic[1] = BOOTMAGIC1; scb_reset_system(); } + +#ifdef PLATFORM_HAS_POWER_SWITCH +bool platform_target_get_power(void) +{ + return !gpio_get(PWR_BR_PORT, PWR_BR_PIN); +} + +void platform_target_set_power(bool power) +{ + gpio_set_val(PWR_BR_PORT, PWR_BR_PIN, !power); +} +#endif \ No newline at end of file diff --git a/src/platforms/f4discovery/platform.h b/src/platforms/f4discovery/platform.h index a1a06f8..0865e47 100644 --- a/src/platforms/f4discovery/platform.h +++ b/src/platforms/f4discovery/platform.h @@ -31,6 +31,55 @@ #include #define PLATFORM_HAS_TRACESWO +#ifdef BLACKPILL +#define PLATFORM_IDENT "(F4Discovery/BlackPillV2) " +/* Important pin mappings for STM32 implementation: + * JTAG/SWD + * PA1: TDI
+ * PA13: TMS/SWDIO
+ * PA14: TCK/SWCLK
+ * PB3: TDO/TRACESWO
+ * PB5: TRST
+ * PB4: SRST
+ * USB USART + * PB6: USART1 TX + * PB7: USART1 RX + * +3V3 + * PB8 - turn on IRLML5103 transistor + * Force DFU mode button: PA0 + */ + +/* Hardware definitions... */ +#define JTAG_PORT GPIOA +#define TDI_PORT JTAG_PORT +#define TMS_PORT JTAG_PORT +#define TCK_PORT JTAG_PORT +#define TDO_PORT GPIOB +#define TDI_PIN GPIO1 +#define TMS_PIN GPIO13 +#define TCK_PIN GPIO14 +#define TDO_PIN GPIO3 + +#define SWDIO_PORT JTAG_PORT +#define SWCLK_PORT JTAG_PORT +#define SWDIO_PIN TMS_PIN +#define SWCLK_PIN TCK_PIN + +#define TRST_PORT GPIOB +#define TRST_PIN GPIO5 +#define SRST_PORT GPIOB +#define SRST_PIN GPIO4 + +#define PWR_BR_PORT GPIOB +#define PWR_BR_PIN GPIO8 + +#define LED_PORT GPIOC +#define LED_PORT_UART GPIOA +#define LED_UART GPIO1 +#define LED_IDLE_RUN GPIO15 +#define LED_ERROR GPIO14 +#define LED_BOOTLOADER GPIO13 +#else #define PLATFORM_IDENT "(F4Discovery) " /* Important pin mappings for STM32 implementation: @@ -78,6 +127,8 @@ #define LED_IDLE_RUN GPIO13 #define LED_ERROR GPIO14 #define LED_BOOTLOADER GPIO15 +#endif + #define BOOTMAGIC0 0xb007da7a #define BOOTMAGIC1 0xbaadfeed diff --git a/src/platforms/stm32/blackpillv2.ld b/src/platforms/stm32/blackpillv2.ld new file mode 100644 index 0000000..4dbc774 --- /dev/null +++ b/src/platforms/stm32/blackpillv2.ld @@ -0,0 +1,28 @@ +/* + * This file is part of the libopenstm32 project. + * + * Copyright (C) 2010 Thomas Otto + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* Define memory regions. */ +MEMORY +{ + rom (rx) : ORIGIN = 0x08000000, LENGTH = 512K + ram (rwx) : ORIGIN = 0x20000000, LENGTH = 96K +} + +/* Include the common ld script from libopenstm32. */ +INCLUDE cortex-m-generic.ld