swlink: Distinguish between Stlink on STM8-Disco and "blue pill".

This commit is contained in:
Uwe Bonnes 2018-09-22 13:59:35 +02:00 committed by Gareth McMullin
parent 29386aee14
commit 1263d185a6
6 changed files with 139 additions and 32 deletions

View File

@ -26,6 +26,7 @@ SRC += cdcacm.c \
serialno.c \
timing.c \
timing_stm32.c \
platform_common.c \
all: blackmagic.bin blackmagic_dfu.bin blackmagic_dfu.hex

View File

@ -1,10 +1,30 @@
Blackmagic for the STM8S Discovery Board
========================================
Blackmagic for STM8S Discovery and STM32F103 Minimum System Development Board
=============================================================================
* External connections:
Function PIN STM8S-DISCO BLUPILL
JTMS/SWDIO PA13 CN5/5 P2/2
TTCK/SWCLK PA14 CN5/4 P2/3
JTDI PA15 CN5/6 P4/11 (38)
JTDO PB3 CN5/3 P4/10 (39)
SRST PB4 CN5/8 P4/9 (40)
UART1_TX PB6 CN7/4 P4/7 (42)
UART1_RX PB7 CN7/2 P4/6 (43)
References:
https://www.st.com/resource/en/user_manual/cd00250600.pdf
Blue Pill:
https://jeelabs.org/img/2016/STM32F103C8T6-DEV-BOARD-SCH.pdf (first number)
https://wiki.stm32duino.com/images/a/ae/Bluepillpinout.gif (second number)
* STM8S Discovery
The board is a ST-Link V1 Board, but with access to JTAG pins accessible
on CN5. This allows easy reprogramming and reuse of the JTAG header.
Programmatical it seems indistinguishable from a e.g. STM32VL
Discovery. So here avariant that uses CN5 for JTAG/SWD_TRACESWO and CN7 for
Discovery. So here a variant that uses CN5 for JTAG/SWD and CN7 for
UART.
Force Bootloader entry is done with shorting CN7 Pin3/4 so PB6 read low while
@ -13,3 +33,17 @@ pulled up momentary by PB6.
Reuse SWIM Pins for Uart (USART1)
RX: CN7 Pin2 ->SWIM_IN (PB7)/USART1_RX / SWIM_IN(PB9)
TX: CN7 Pin4 -> SWIM_RST_IN(PB6)/USART1_TX
* STM32F103 Minimum System Development Board (aka Blue Pill)
This board has the SWD pins of the onboard F103 accessible on one side.
Reuse these pins. There are also jumpers for BOOT0 and BOOT1(PB2). Reuse
Boot1 as "Force Bootloader entry" jumpered high when connecting to USB. Boot1
has 100 k Ohm between MCU and header pin and can not be used as SRST.
All other port pins are have header access with headers not yet soldered.
JTAG TDO: PB3
JTAG TDI: PA15
SWD SWO: PA10 (use Uart pin as on normal STLINK)
Distinguish boards by checking the SWIM_IN connection PB9/PB10

View File

@ -18,8 +18,9 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* This file implements the platform specific functions for the ST-Link
* implementation.
/* This file implements the platform specific functions for ST-Link
* on the STM8S discovery and STM32F103 Minimum System Development Board, also
* known as bluepill.
*/
#include "general.h"
@ -34,6 +35,13 @@
#include <libopencm3/usb/usbd.h>
#include <libopencm3/stm32/f1/adc.h>
static uint8_t rev;
int platform_hwversion(void)
{
return rev;
}
void platform_init(void)
{
uint32_t data;
@ -44,10 +52,8 @@ void platform_init(void)
#endif
rcc_clock_setup_in_hse_8mhz_out_72mhz();
rev = detect_rev();
/* Enable peripherals */
rcc_periph_clock_enable(RCC_USB);
rcc_periph_clock_enable(RCC_GPIOA);
rcc_periph_clock_enable(RCC_GPIOB);
rcc_periph_clock_enable(RCC_AFIO);
rcc_periph_clock_enable(RCC_CRC);
@ -67,6 +73,14 @@ void platform_init(void)
gpio_set_mode(TDO_PORT, GPIO_MODE_INPUT,
GPIO_CNF_INPUT_FLOAT, TDO_PIN);
if (rev == 1) {
/* Enable MCO Out on PA8*/
RCC_CFGR &= ~(0xf << 24);
RCC_CFGR |= (RCC_CFGR_MCO_HSE << 24);
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ,
GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO8);
}
gpio_set(NRST_PORT,NRST_PIN);
gpio_set_mode(NRST_PORT, GPIO_MODE_INPUT,
GPIO_CNF_INPUT_PULL_UPDOWN, NRST_PIN);

View File

@ -3,6 +3,7 @@
*
* Copyright (C) 2011 Black Sphere Technologies Ltd.
* Written by Gareth McMullin <gareth@blacksphere.co.nz>
* Copyright (C) 2018 Uwe Bonnes (bon@elektron.ikp.physik.tu-darmstadt.de)
*
* 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
@ -29,11 +30,11 @@
#include "timing_stm32.h"
#include "version.h"
#define BOARD_IDENT "Black Magic Probe (SWLINK), (Firmware " FIRMWARE_VERSION ")"
#define BOARD_IDENT_DFU "Black Magic (Upgrade), STM8S Discovery, (Firmware " FIRMWARE_VERSION ")"
#define BOARD_IDENT_UPD "Black Magic (DFU Upgrade), STM8S Discovery, (Firmware " FIRMWARE_VERSION ")"
#define DFU_IDENT "Black Magic Firmware Upgrade (SWLINK)"
#define UPD_IFACE_STRING "@Internal Flash /0x08000000/8*001Kg"
#define BOARD_IDENT "Black Magic Probe (SWLINK), (Firmware " FIRMWARE_VERSION ")"
#define BOARD_IDENT_DFU "Black Magic (Upgrade), SWLINK, (Firmware " FIRMWARE_VERSION ")"
#define BOARD_IDENT_UPD "Black Magic (DFU Upgrade), SWLINK, (Firmware " FIRMWARE_VERSION ")"
#define DFU_IDENT "Black Magic Firmware Upgrade (SWLINK)"
#define UPD_IFACE_STRING "@Internal Flash /0x08000000/8*001Kg"
/* Hardware definitions... */
#define TMS_PORT GPIOA
@ -128,10 +129,7 @@ int usbuart_debug_write(const char *buf, size_t len);
#define SET_IDLE_STATE(state) {gpio_set_val(LED_PORT, LED_IDLE_RUN, state);}
#define SET_ERROR_STATE(x)
static inline int platform_hwversion(void)
{
return 0;
}
extern uint8_t detect_rev(void);
/* Use newlib provided integer only stdio functions */
#define sscanf siscanf

View File

@ -0,0 +1,75 @@
/*
* This file is part of the Black Magic Debug project.
*
* Copyright (C) 2018 Uwe Bonnes (bon@elektron.ikp.physik.tu-darmstadt.de)
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include <libopencm3/cm3/scb.h>
#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>
uint8_t detect_rev()
{
/* Test connectivity between PB9 and PB10 needed for
* original ST software to implement SWIM.
*
* Return 0 for Stlink on STM8S Disco and 1 for Bluepill
*/
uint8_t rev = 0;
/* Enable Peripherals used by both debugger and DFU.*/
rcc_periph_clock_enable(RCC_GPIOA);
rcc_periph_clock_enable(RCC_GPIOB);
rcc_periph_clock_enable(RCC_USB);
gpio_set_mode(GPIOB, GPIO_MODE_INPUT,
GPIO_CNF_INPUT_PULL_UPDOWN, GPIO9);
gpio_set(GPIOB, GPIO9);
gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_2_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, GPIO10);
while (!gpio_get(GPIOB, GPIO10))
gpio_set(GPIOB, GPIO10);
while (gpio_get(GPIOB, GPIO10))
gpio_clear(GPIOB, GPIO10);
/* Read PB9 as soon as we read PB10 low.*/
if (gpio_get(GPIOB, GPIO9))
rev = 1;
/* Release PB9/10 */
gpio_set_mode(GPIOB, GPIO_MODE_INPUT,
GPIO_CNF_INPUT_FLOAT, GPIO9 | GPIO10);
gpio_set(GPIOB, GPIO9);
switch (rev) {
case 0:
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, GPIO8);
break;
case 1:
rcc_periph_clock_enable(RCC_GPIOC);
gpio_set(GPIOC, GPIO13); /* LED on Blupill is active low!*/
gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_2_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);
break;
}
/* Disconnect USB after reset:
* Pull USB_DP low. Device will reconnect automatically
* when USB is set up later, as Pull-Up is hard wired*/
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ,
GPIO_CNF_OUTPUT_OPENDRAIN, GPIO12);
gpio_clear(GPIOA, GPIO12);
rcc_periph_reset_pulse(RST_USB);
rcc_periph_clock_enable(RCC_USB);
return rev;
}

View File

@ -65,21 +65,6 @@ int main(void)
systick_set_clocksource(STK_CSR_CLKSOURCE_AHB_DIV8);
systick_set_reload(900000);
/* Handle USB disconnect/connect */
/* Just in case: Disconnect USB cable by resetting USB Device
* and pulling USB_DP low
* Device will reconnect automatically as Pull-Up is hard wired*/
rcc_periph_reset_pulse(RST_USB);
rcc_periph_clock_enable(RCC_USB);
rcc_periph_clock_enable(RCC_GPIOA);
gpio_clear(GPIOA, GPIO12);
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ,
GPIO_CNF_OUTPUT_OPENDRAIN, GPIO12);
/* Handle LED*/
gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_2_MHZ,
GPIO_CNF_OUTPUT_PUSHPULL, GPIO8);
systick_interrupt_enable();
systick_counter_enable();