Skip to content

Commit 7bea296

Browse files
Finally got GD32 core fully working including with the stm32duino-bootloader
1 parent 6b6ab7d commit 7bea296

8 files changed

Lines changed: 113 additions & 55 deletions

File tree

GD32F1/boards.txt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
menu.device_variant=Variant
55
menu.bootloader_version=Bootloader version
66
menu.upload_method=Upload method
7+
menu.cpu_speed=CPU Speed(MHz)
78

89

910
###################### Generic GD32F103C ########################################
@@ -17,7 +18,7 @@ genericGD32F103C.upload.use_1200bps_touch=false
1718
genericGD32F103C.upload.file_type=bin
1819
genericGD32F103C.upload.auto_reset=true
1920
genericGD32F103C.build.cpu_flags=-DMCU_STM32F103CB
20-
genericGD32F103C.build.f_cpu=120000000L
21+
genericGD32F103C.build.f_cpu=72000000L
2122

2223
## GD32F103CB -------------------------
2324
genericGD32F103C.menu.device_variant.GD32F103CB=GD32F103CB (20k RAM. 128k Flash)
@@ -62,4 +63,12 @@ genericGD32F103C.menu.upload_method.BMPMethod.upload.protocol=gdb_bmp
6263
genericGD32F103C.menu.upload_method.BMPMethod.upload.tool=bmp_upload
6364
genericGD32F103C.menu.upload_method.BMPMethod.build.upload_flags=-DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG
6465

66+
genericGD32F103C.menu.cpu_speed.speed_120mhz=120Mhz (overdrive)
67+
genericGD32F103C.menu.cpu_speed.speed_120mhz.build.f_cpu=120000000L
68+
69+
genericGD32F103C.menu.cpu_speed.speed_96mhz=96Mhz (Stable)
70+
genericGD32F103C.menu.cpu_speed.speed_96mhz.build.f_cpu=96000000L
71+
72+
genericGD32F103C.menu.cpu_speed.speed_72mhz=72Mhz (compatibility)
73+
genericGD32F103C.menu.cpu_speed.speed_72mhz.build.f_cpu=72000000L
6574

GD32F1/cores/maple/libmaple/rcc_f1.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ void rcc_clk_init(rcc_sysclk_src sysclk_src,
104104
ASSERT(sysclk_src == RCC_CLKSRC_PLL &&
105105
pll_src == RCC_PLLSRC_HSE);
106106

107-
RCC_BASE->CFGR = pll_src | pll_mul;
107+
RCC_BASE->CFGR = pll_src | pll_mul | (0x3<<22);
108108

109109
/* Turn on, and wait for, HSE. */
110110
rcc_turn_on_clk(RCC_CLK_HSE);
@@ -125,13 +125,13 @@ void rcc_configure_pll(rcc_pll_cfg *pll_cfg) {
125125
stm32f1_rcc_pll_data *data = pll_cfg->data;
126126
rcc_pll_multiplier pll_mul = data->pll_mul;
127127
uint32 cfgr;
128-
129128
/* Check that the PLL is disabled. */
130129
ASSERT_FAULT(!rcc_is_clk_on(RCC_CLK_PLL));
131130

132131
cfgr = RCC_BASE->CFGR;
133132
cfgr &= ~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLMUL);
134-
cfgr |= pll_cfg->pllsrc | pll_mul;// | (0B10 << 22);
133+
cfgr |= pll_cfg->pllsrc | pll_mul;
134+
135135
RCC_BASE->CFGR = cfgr;
136136
}
137137

GD32F1/cores/maple/libmaple/util.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ __attribute__((noreturn)) void throb(void) {
120120
uint32 CC = 0x0000;
121121
uint32 TOP_CNT = 0x0200;
122122
uint32 i = 0;
123+
volatile int dly;
123124

124125
gpio_set_mode(ERROR_LED_PORT, ERROR_LED_PIN, GPIO_MODE_OUTPUT);
125126
/* Error fade. */
@@ -141,6 +142,7 @@ __attribute__((noreturn)) void throb(void) {
141142
gpio_write_bit(ERROR_LED_PORT, ERROR_LED_PIN, 0);
142143
}
143144
i++;
145+
for( dly=0;dly<10;dly++);
144146
}
145147
#else
146148
/* No error LED is defined; do nothing. */

GD32F1/cores/maple/stm32f1/util_hooks.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141

4242
/* Failed ASSERT()s send out a message using this USART config. */
4343
#ifndef ERROR_USART
44-
#define ERROR_USART USART2
44+
#define ERROR_USART USART1
4545
#define ERROR_USART_BAUD 9600
4646
#define ERROR_TX_PORT GPIOA
4747
#define ERROR_TX_PIN 2

GD32F1/system/libmaple/stm32f1/include/series/rcc.h

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ typedef struct rcc_reg_map {
9393
#define RCC_CFGR_PLLSRC_BIT 16
9494

9595
#define RCC_CFGR_MCO (0x3 << 24)
96-
#define RCC_CFGR_USBPRE (1U << RCC_CFGR_USBPRE_BIT)
96+
#define RCC_CFGR_USBPRE (0x3 << RCC_CFGR_USBPRE_BIT)
9797
#define RCC_CFGR_PLLMUL (0xF << 18)
9898
#define RCC_CFGR_PLLXTPRE (1U << RCC_CFGR_PLLXTPRE_BIT)
9999
#define RCC_CFGR_PLLSRC (1U << RCC_CFGR_PLLSRC_BIT)
@@ -525,7 +525,28 @@ typedef enum rcc_ahb_divider {
525525
} rcc_ahb_divider;
526526

527527
/**
528-
* @brief Start the low speed internal oscillatior
528+
* @brief STM32F1 USB prescaler dividers
529+
* @see rcc_set_prescaler()
530+
*/
531+
/*
532+
Set and reset by software to control the USB clock prescaler value. The USB clock
533+
must be 48MHz. These bits can’t be reset if the USB clock is enabled.
534+
00: (CK_PLL / 1.5) selected
535+
01: CK_PLL selected
536+
10: (CK_PLL / 2.5) selected
537+
11: (CK_PLL / 2) selected
538+
*/
539+
540+
typedef enum rcc_usb_divider {
541+
RCC_USB_SYSCLK_DIV_1 = 0x1 << 22,
542+
RCC_USB_SYSCLK_DIV_1_5 = 0x0 << 22,
543+
RCC_USB_SYSCLK_DIV_2 = 0x3 << 22,
544+
RCC_USB_SYSCLK_DIV_2_5 = 0x2 << 22,
545+
} rcc_usb_divider;
546+
547+
548+
/**
549+
* @brief Start the low speed internal oscillator
529550
*/
530551
static inline void rcc_start_lsi(void) {
531552
*bb_perip(&RCC_BASE->CSR, RCC_CSR_LSION_BIT) = 1;

GD32F1/system/libmaple/stm32f1/include/series/stm32.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,13 @@ extern "C" {
227227
# define STM32_PCLK2 F_CPU
228228
# endif
229229
# ifndef STM32_DELAY_US_MULT
230-
# define STM32_DELAY_US_MULT 40 /* FIXME: value is incorrect. */
230+
#if F_CPU == 120000000
231+
#define STM32_DELAY_US_MULT 40 /* FIXME: value is incorrect. */
232+
#elif F_CPU == 96000000
233+
#define STM32_DELAY_US_MULT 32 /* FIXME: value is incorrect. */
234+
#elif F_CPU == 72000000
235+
#define STM32_DELAY_US_MULT 24 /* FIXME: value is incorrect. */
236+
#endif
231237
# endif
232238
#elif STM32_F1_LINE == STM32_F1_LINE_VALUE /* TODO */
233239
# ifndef STM32_PCLK1

GD32F1/variants/generic_gd32f103c/board.cpp

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
*****************************************************************************/
2626

2727
/**
28-
* @file wirish/boards/maple_mini/board.cpp
29-
* @author Marti Bolivar <mbolivar@leaflabs.com>
30-
* @brief Maple Mini board file.
28+
* &file wirish/boards/maple_mini/board.cpp
29+
* &author Marti Bolivar <mbolivar&leaflabs.com>
30+
* &brief Maple Mini board file.
3131
*/
3232

3333
#include <board/board.h>
@@ -55,43 +55,43 @@ void boardInit(void) {
5555
extern const stm32_pin_info PIN_MAP[BOARD_NR_GPIO_PINS] = {
5656

5757

58-
{GPIOA, TIMER2, ADC1, 0, 1, 0}, /* PA0 */
59-
{GPIOA, TIMER2, ADC1, 1, 2, 1}, /* PA1 */
60-
{GPIOA, TIMER2, ADC1, 2, 3, 2}, /* PA2 */
61-
{GPIOA, TIMER2, ADC1, 3, 4, 3}, /* PA3 */
62-
{GPIOA, NULL, ADC1, 4, 0, 4}, /* PA4 */
63-
{GPIOA, NULL, ADC1, 5, 0, 5}, /* PA5 */
64-
{GPIOA, TIMER3, ADC1, 6, 1, 6}, /* PA6 */
65-
{GPIOA, TIMER3, ADC1, 7, 2, 7}, /* PA7 */
66-
{GPIOA, TIMER1, NULL, 8, 1, ADCx}, /* PA8 */
67-
{GPIOA, TIMER1, NULL, 9, 2, ADCx}, /* PA9 */
68-
{GPIOA, TIMER1, NULL, 10, 3, ADCx}, /* PA10 */
69-
{GPIOA, TIMER1, NULL, 11, 4, ADCx}, /* PA11 */
70-
{GPIOA, NULL, NULL, 12, 0, ADCx}, /* PA12 */
71-
{GPIOA, NULL, NULL, 13, 0, ADCx}, /* PA13 */
72-
{GPIOA, NULL, NULL, 14, 0, ADCx}, /* PA14 */
73-
{GPIOA, NULL, NULL, 15, 0, ADCx}, /* PA15 */
58+
{&gpioa, &timer2, &adc1, 0, 1, 0}, /* PA0 */
59+
{&gpioa, &timer2, &adc1, 1, 2, 1}, /* PA1 */
60+
{&gpioa, &timer2, &adc1, 2, 3, 2}, /* PA2 */
61+
{&gpioa, &timer2, &adc1, 3, 4, 3}, /* PA3 */
62+
{&gpioa, NULL, &adc1, 4, 0, 4}, /* PA4 */
63+
{&gpioa, NULL, &adc1, 5, 0, 5}, /* PA5 */
64+
{&gpioa, &timer3, &adc1, 6, 1, 6}, /* PA6 */
65+
{&gpioa, &timer3, &adc1, 7, 2, 7}, /* PA7 */
66+
{&gpioa, &timer1, NULL, 8, 1, ADCx}, /* PA8 */
67+
{&gpioa, &timer1, NULL, 9, 2, ADCx}, /* PA9 */
68+
{&gpioa, &timer1, NULL, 10, 3, ADCx}, /* PA10 */
69+
{&gpioa, &timer1, NULL, 11, 4, ADCx}, /* PA11 */
70+
{&gpioa, NULL, NULL, 12, 0, ADCx}, /* PA12 */
71+
{&gpioa, NULL, NULL, 13, 0, ADCx}, /* PA13 */
72+
{&gpioa, NULL, NULL, 14, 0, ADCx}, /* PA14 */
73+
{&gpioa, NULL, NULL, 15, 0, ADCx}, /* PA15 */
7474

75-
{GPIOB, TIMER3, ADC1, 0, 3, 8}, /* PB0 */
76-
{GPIOB, TIMER3, ADC1, 1, 4, 9}, /* PB1 */
77-
{GPIOB, NULL, NULL, 2, 0, ADCx}, /* PB2 */
78-
{GPIOB, NULL, NULL, 3, 0, ADCx}, /* PB3 */
79-
{GPIOB, NULL, NULL, 4, 0, ADCx}, /* PB4 */
80-
{GPIOB, NULL, NULL, 5, 0, ADCx}, /* PB5 */
81-
{GPIOB, TIMER4, NULL, 6, 1, ADCx}, /* PB6 */
82-
{GPIOB, TIMER4, NULL, 7, 2, ADCx}, /* PB7 */
83-
{GPIOB, TIMER4, NULL, 8, 3, ADCx}, /* PB8 */
84-
{GPIOB, TIMER4, NULL, 9, 4, ADCx}, /* PB9 */
85-
{GPIOB, NULL, NULL, 10, 0, ADCx}, /* PB10 */
86-
{GPIOB, NULL, NULL, 11, 0, ADCx}, /* PB11 */
87-
{GPIOB, NULL, NULL, 12, 0, ADCx}, /* PB12 */
88-
{GPIOB, NULL, NULL, 13, 0, ADCx}, /* PB13 */
89-
{GPIOB, NULL, NULL, 14, 0, ADCx}, /* PB14 */
90-
{GPIOB, NULL, NULL, 15, 0, ADCx}, /* PB15 */
91-
92-
{GPIOC, NULL, NULL, 13, 0, ADCx}, /* PC13 */
93-
{GPIOC, NULL, NULL, 14, 0, ADCx}, /* PC14 */
94-
{GPIOC, NULL, NULL, 15, 0, ADCx}, /* PC15 */
75+
{&gpiob, &timer3, &adc1, 0, 3, 8}, /* PB0 */
76+
{&gpiob, &timer3, &adc1, 1, 4, 9}, /* PB1 */
77+
{&gpiob, NULL, NULL, 2, 0, ADCx}, /* PB2 */
78+
{&gpiob, NULL, NULL, 3, 0, ADCx}, /* PB3 */
79+
{&gpiob, NULL, NULL, 4, 0, ADCx}, /* PB4 */
80+
{&gpiob, NULL, NULL, 5, 0, ADCx}, /* PB5 */
81+
{&gpiob, &timer4, NULL, 6, 1, ADCx}, /* PB6 */
82+
{&gpiob, &timer4, NULL, 7, 2, ADCx}, /* PB7 */
83+
{&gpiob, &timer4, NULL, 8, 3, ADCx}, /* PB8 */
84+
{&gpiob, &timer4, NULL, 9, 4, ADCx}, /* PB9 */
85+
{&gpiob, NULL, NULL, 10, 0, ADCx}, /* PB10 */
86+
{&gpiob, NULL, NULL, 11, 0, ADCx}, /* PB11 */
87+
{&gpiob, NULL, NULL, 12, 0, ADCx}, /* PB12 */
88+
{&gpiob, NULL, NULL, 13, 0, ADCx}, /* PB13 */
89+
{&gpiob, NULL, NULL, 14, 0, ADCx}, /* PB14 */
90+
{&gpiob, NULL, NULL, 15, 0, ADCx}, /* PB15 */
91+
92+
{&gpioc, NULL, NULL, 13, 0, ADCx}, /* PC13 */
93+
{&gpioc, NULL, NULL, 14, 0, ADCx}, /* PC14 */
94+
{&gpioc, NULL, NULL, 15, 0, ADCx}, /* PC15 */
9595

9696

9797

GD32F1/variants/generic_gd32f103c/wirish/boards_setup.cpp

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,18 @@
4848
// works for F103 performance line MCUs, which is all that LeafLabs
4949
// currently officially supports).
5050
#ifndef BOARD_RCC_PLLMUL
51-
#define BOARD_RCC_PLLMUL RCC_PLLMUL_10
51+
#if F_CPU==120000000
52+
#define BOARD_RCC_PLLMUL RCC_PLLMUL_10
53+
#elif F_CPU==96000000
54+
#define BOARD_RCC_PLLMUL RCC_PLLMUL_8
55+
#elif F_CPU==72000000
56+
#define BOARD_RCC_PLLMUL RCC_PLLMUL_6
57+
58+
// TEST FOR STM32 #define BOARD_RCC_PLLMUL RCC_PLLMUL_9
59+
60+
61+
#endif
62+
5263
//#define BOARD_RCC_PLLMUL RCC_PLLMUL_6
5364
#endif
5465

@@ -68,6 +79,13 @@ namespace wirish {
6879
rcc_set_prescaler(RCC_PRESCALER_AHB, RCC_AHB_SYSCLK_DIV_1);
6980
rcc_set_prescaler(RCC_PRESCALER_APB1, RCC_APB1_HCLK_DIV_2);
7081
rcc_set_prescaler(RCC_PRESCALER_APB2, RCC_APB2_HCLK_DIV_1);
82+
#if F_CPU == 120000000
83+
rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_2_5);
84+
#elif F_CPU == 96000000
85+
rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_2);
86+
#elif F_CPU == 72000000
87+
rcc_set_prescaler(RCC_PRESCALER_USB, RCC_USB_SYSCLK_DIV_1_5);
88+
#endif
7189
}
7290

7391
__weak void board_setup_gpio(void) {
@@ -77,13 +95,15 @@ namespace wirish {
7795
__weak void board_setup_usb(void) {
7896
#ifdef SERIAL_USB
7997

80-
#ifdef GENERIC_BOOTLOADER
81-
//Reset the USB interface on generic boards - developed by Victor PV
82-
gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_OUTPUT_PP);
83-
gpio_write_bit(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit,0);
84-
85-
for(volatile unsigned int i=0;i<512;i++);// Only small delay seems to be needed, and USB pins will get configured in Serial.begin
86-
gpio_set_mode(PIN_MAP[PA12].gpio_device, PIN_MAP[PA12].gpio_bit, GPIO_INPUT_FLOATING);
98+
#ifdef GENERIC_BOOTLOADER
99+
#define USB_RST_PIN PA12
100+
101+
//Reset the USB interface on generic boards - developed by Victor PV
102+
gpio_set_mode(PIN_MAP[USB_RST_PIN].gpio_device, PIN_MAP[USB_RST_PIN].gpio_bit, GPIO_OUTPUT_PP);
103+
gpio_write_bit(PIN_MAP[USB_RST_PIN].gpio_device, PIN_MAP[USB_RST_PIN].gpio_bit,0);
104+
105+
for(volatile unsigned int i=0;i<512;i++);// Only small delay seems to be needed, and USB pins will get configured in Serial.begin
106+
gpio_set_mode(PIN_MAP[USB_RST_PIN].gpio_device, PIN_MAP[USB_RST_PIN].gpio_bit, GPIO_INPUT_FLOATING);
87107
#endif
88108
Serial.begin();// Roger Clark. Changed SerialUSB to Serial for Arduino sketch compatibility
89109
#endif

0 commit comments

Comments
 (0)