Skip to content

Commit 88d2457

Browse files
STM32F1 core: Implemented changes already made to the GD32F1 core to use F_CPU instead of hard coded values for 72000000 and (F_CPU -1) instead of 71999999 and to replace other hard coded values related to the clock freqency. Also updated the code so that the USB clock was disabled in setup_clock_prescalers to allow it to be changed in that function during initialisation, in case altermative prescaler values for USB are required, e.g. for operation at 48Mhz
1 parent b96247a commit 88d2457

28 files changed

Lines changed: 121 additions & 20 deletions

File tree

STM32F1/cores/maple/libmaple/rcc_f1.c

Lines changed: 11 additions & 2 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);
134133
cfgr |= pll_cfg->pllsrc | pll_mul;
134+
135135
RCC_BASE->CFGR = cfgr;
136136
}
137137

@@ -162,3 +162,12 @@ void rcc_set_prescaler(rcc_prescaler prescaler, uint32 divider) {
162162
};
163163
rcc_do_set_prescaler(masks, prescaler, divider);
164164
}
165+
166+
void rcc_clk_disable(rcc_clk_id id) {
167+
static __io uint32* enable_regs[] = {
168+
[APB1] = &RCC_BASE->APB1ENR,
169+
[APB2] = &RCC_BASE->APB2ENR,
170+
[AHB] = &RCC_BASE->AHBENR,
171+
};
172+
rcc_do_clk_disable(enable_regs, id);
173+
}

STM32F1/libraries/FreeRTOS/utility/FreeRTOSConfig.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
#define configUSE_PREEMPTION 1
7070
#define configUSE_IDLE_HOOK 0
7171
#define configUSE_TICK_HOOK 0
72-
#define configCPU_CLOCK_HZ ( ( unsigned long ) 72000000 )
72+
#define configCPU_CLOCK_HZ ( ( unsigned long ) F_CPU )
7373
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
7474
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
7575
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 120 )

STM32F1/libraries/FreeRTOS821/utility/FreeRTOSConfig.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@
8585
#define configUSE_PREEMPTION 1
8686
#define configUSE_IDLE_HOOK 0
8787
#define configUSE_TICK_HOOK 0
88-
#define configCPU_CLOCK_HZ ( ( unsigned long ) 72000000 )
88+
#define configCPU_CLOCK_HZ ( ( unsigned long ) F_CPU )
8989
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
9090
#define configMAX_PRIORITIES ( 5 )
9191
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 120 )

STM32F1/libraries/MapleCoOS/utility/OsConfig.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ Idle task stack size(word).
4242
/*!<
4343
System frequency (Hz).
4444
*/
45-
#define CFG_CPU_FREQ (72000000)
45+
#define CFG_CPU_FREQ (F_CPU)
4646

4747
/*!<
4848
systick frequency (Hz).

STM32F1/libraries/MapleCoOS116/utility/OsConfig.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ Idle task stack size(word).
7070
/*!<
7171
System frequency (Hz).
7272
*/
73-
#define CFG_CPU_FREQ (72000000)
73+
#define CFG_CPU_FREQ (F_CPU)
7474

7575
/*!<
7676
systick frequency (Hz).

STM32F1/system/libmaple/include/libmaple/rcc.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,12 @@ static inline void rcc_disable_css() {
169169
RCC_BASE->CR &= ~RCC_CR_CSSON;
170170
}
171171

172+
/**
173+
* @brief Turn off the clock line on a peripheral
174+
* @param id Clock ID of the peripheral to turn on.
175+
*/
176+
extern void rcc_clk_disable(rcc_clk_id id);
177+
172178
#ifdef __cplusplus
173179
} // extern "C"
174180
#endif

STM32F1/system/libmaple/rcc_private.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,11 @@ static inline void rcc_do_set_prescaler(const uint32 *masks,
6464
RCC_BASE->CFGR = cfgr;
6565
}
6666

67+
static inline void rcc_do_clk_disable(__io uint32** enable_regs,
68+
rcc_clk_id id) {
69+
__io uint32 *enable_reg = enable_regs[rcc_dev_clk(id)];
70+
uint8 line_num = rcc_dev_table[id].line_num;
71+
bb_peri_set_bit(enable_reg, line_num, 0);
72+
}
73+
6774
#endif

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

Lines changed: 21 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,26 @@ 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+
*/
537+
538+
typedef enum rcc_usb_divider {
539+
RCC_USB_SYSCLK_DIV_1 = 0x1 << 22,
540+
RCC_USB_SYSCLK_DIV_1_5 = 0x0 << 22,
541+
//GD32 only RCC_USB_SYSCLK_DIV_2 = 0x3 << 22,
542+
//GD32 only RCC_USB_SYSCLK_DIV_2_5 = 0x2 << 22,
543+
} rcc_usb_divider;
544+
545+
546+
/**
547+
* @brief Start the low speed internal oscillator
529548
*/
530549
static inline void rcc_start_lsi(void) {
531550
*bb_perip(&RCC_BASE->CSR, RCC_CSR_LSION_BIT) = 1;

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,13 +221,13 @@ extern "C" {
221221

222222
#if STM32_F1_LINE == STM32_F1_LINE_PERFORMANCE
223223
# ifndef STM32_PCLK1
224-
# define STM32_PCLK1 36000000U
224+
# define STM32_PCLK1 F_CPU/2
225225
# endif
226226
# ifndef STM32_PCLK2
227-
# define STM32_PCLK2 72000000U
227+
# define STM32_PCLK2 F_CPU
228228
# endif
229229
# ifndef STM32_DELAY_US_MULT
230-
# define STM32_DELAY_US_MULT 12 /* FIXME: value is incorrect. */
230+
# define STM32_DELAY_US_MULT (F_CPU / 6000000L)
231231
# endif
232232
#elif STM32_F1_LINE == STM32_F1_LINE_VALUE /* TODO */
233233
# ifndef STM32_PCLK1

STM32F1/variants/generic_stm32f103c/board/board.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
#define _BOARD_GENERIC_STM32F103C_H_
3838

3939
#define CYCLES_PER_MICROSECOND 72
40-
#define SYSTICK_RELOAD_VAL 71999 /* takes a cycle to reload */
40+
#define SYSTICK_RELOAD_VAL (F_CPU/1000) - 1 /* takes a cycle to reload */
4141

4242
#define BOARD_NR_USARTS 3
4343
#define BOARD_USART1_TX_PIN PA9

0 commit comments

Comments
 (0)