Skip to content

Commit d1428ca

Browse files
authored
Merge pull request #42 from twelho/fix-rtc-bkp-register-indexing
Allow configuration of the backup register and command word used to trigger the bootloader. Change STM32F103 RTC backup to use native 16-bit backup register size. On STM32F103 targets, only look for "BO" in BKP1 instead of both "BO" in BKP1 and "OT" in BKP2
2 parents ffd5464 + 30e54d0 commit d1428ca

4 files changed

Lines changed: 31 additions & 16 deletions

File tree

src/stm32f103/backup.c

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,15 @@
2424

2525
#define RTC_BKP_DR(reg) MMIO16(BACKUP_REGS_BASE + 4 + (4 * (reg)))
2626

27-
void backup_write(enum BackupRegister reg, uint32_t value) {
27+
void backup_write(enum BackupRegister reg, uint16_t value) {
2828
rcc_periph_clock_enable(RCC_PWR);
2929
rcc_periph_clock_enable(RCC_BKP);
3030

3131
pwr_disable_backup_domain_write_protect();
32-
RTC_BKP_DR((int)reg*2) = value & 0xFFFFUL;
33-
RTC_BKP_DR((int)reg*2+1) = (value & 0xFFFF0000UL) >> 16;
32+
RTC_BKP_DR((int)reg) = value;
3433
pwr_enable_backup_domain_write_protect();
3534
}
3635

37-
uint32_t backup_read(enum BackupRegister reg) {
38-
uint32_t value = ((uint32_t)RTC_BKP_DR((int)reg*2+1) << 16)
39-
| ((uint32_t)RTC_BKP_DR((int)reg*2) << 0);
40-
return value;
36+
uint16_t backup_read(enum BackupRegister reg) {
37+
return RTC_BKP_DR((int)reg);
4138
}

src/stm32f103/backup.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,19 @@
2020
#define BACKUP_H_INCLUDED
2121

2222
enum BackupRegister {
23-
BKP0 = 0,
2423
BKP1,
2524
BKP2,
2625
BKP3,
2726
BKP4,
27+
BKP5,
28+
BKP6,
29+
BKP7,
30+
BKP8,
31+
BKP9,
32+
BKP10,
2833
};
2934

30-
extern void backup_write(enum BackupRegister reg, uint32_t value);
31-
extern uint32_t backup_read(enum BackupRegister reg);
35+
extern void backup_write(enum BackupRegister reg, uint16_t value);
36+
extern uint16_t backup_read(enum BackupRegister reg);
3237

3338
#endif

src/stm32f103/target_stm32f103.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,13 @@ _Static_assert((FLASH_BASE + FLASH_SIZE_OVERRIDE >= APP_BASE_ADDRESS),
5555
"Incompatible flash size");
5656
#endif
5757

58-
static const uint32_t CMD_BOOT = 0x544F4F42UL;
58+
#ifndef REG_BOOT
59+
#define REG_BOOT BKP1
60+
#endif
61+
62+
#ifndef CMD_BOOT
63+
#define CMD_BOOT 0x4F42UL
64+
#endif
5965

6066
void target_clock_setup(void) {
6167
#ifdef USE_HSI
@@ -160,13 +166,13 @@ const usbd_driver* target_usb_init(void) {
160166
bool target_get_force_bootloader(void) {
161167
bool force = false;
162168
/* Check the RTC backup register */
163-
uint32_t cmd = backup_read(BKP0);
169+
uint16_t cmd = backup_read(REG_BOOT);
164170
if (cmd == CMD_BOOT) {
165171
force = true;
166172
}
167173

168174
/* Clear the RTC backup register */
169-
backup_write(BKP0, 0);
175+
backup_write(REG_BOOT, 0);
170176

171177
#if HAVE_BUTTON
172178
/* Wait some time in case the button has some debounce capacitor */

src/stm32l1/target_stm32l1.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,15 @@
2727
#include "config.h"
2828
#include "backup.h"
2929

30+
#ifndef REG_BOOT
31+
#define REG_BOOT BKP1
32+
#endif
33+
34+
#ifndef CMD_BOOT
35+
#define CMD_BOOT 0x544F4F42UL
36+
#endif
37+
3038
//#define CMD_FAST_BOOT 0xfa57b007
31-
static const uint32_t CMD_BOOT = 0x544F4F42UL;
3239

3340
void target_clock_setup(void) {
3441

@@ -82,11 +89,11 @@ const usbd_driver* target_usb_init(void)
8289
bool target_get_force_bootloader(void)
8390
{
8491
bool enter_bl = false;
85-
uint32_t cmd = backup_read(BKP0);
92+
uint32_t cmd = backup_read(REG_BOOT);
8693
if (cmd == CMD_BOOT) {
8794
enter_bl = true;
8895
}
89-
backup_write(BKP0, 0);
96+
backup_write(REG_BOOT, 0);
9097

9198
#if HAVE_BUTTON
9299
#warning HAVE_BUTTON not implemented for L1

0 commit comments

Comments
 (0)