USB-DFU example

Dependencies:   mbed mbed-STM32F103C8T6 USBDevice_STM32F103

Committer:
adv_lut
Date:
Fri Sep 06 13:27:16 2019 +0000
Revision:
9:37b5f4bc101f
Parent:
6:2f7ee2af27f9
USB-DFU example

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:0279e8c1f111 1 #include "stm32f103c8t6.h"
hudakz 0:0279e8c1f111 2 #include "mbed.h"
devanlai 5:88b6ced3df89 3 #include "USBDFU.h"
devanlai 5:88b6ced3df89 4
devanlai 5:88b6ced3df89 5 /*
devanlai 5:88b6ced3df89 6 * This is an example program demonstrating a USB DFU runtime combined with
devanlai 5:88b6ced3df89 7 * a USB DFU bootloader that does not require an offset.
devanlai 5:88b6ced3df89 8 *
devanlai 5:88b6ced3df89 9 * It normally blinks an LED at 1Hz, but when it receives a DFU detach
devanlai 5:88b6ced3df89 10 * request over USB (eg, by running "dfu-util -d 1234:0006 -e"), it
devanlai 5:88b6ced3df89 11 * blinks 3 times rapidly and resets into the bootloader.
devanlai 5:88b6ced3df89 12 *
devanlai 5:88b6ced3df89 13 * New programs can be uploaded by running
devanlai 5:88b6ced3df89 14 * dfu-util -d 1234:0006,1209:db42 -D your_firmware.bin
devanlai 5:88b6ced3df89 15 *
devanlai 6:2f7ee2af27f9 16 * The companion bootloader source can be found on GitHub:
devanlai 6:2f7ee2af27f9 17 * https://github.com/devanlai/dapboot/tree/highboot
devanlai 6:2f7ee2af27f9 18 *
devanlai 5:88b6ced3df89 19 */
hudakz 0:0279e8c1f111 20
hudakz 0:0279e8c1f111 21 DigitalOut myled(LED1);
hudakz 0:0279e8c1f111 22
devanlai 5:88b6ced3df89 23 bool detached = false;
devanlai 5:88b6ced3df89 24 void onDetachRequested() {
devanlai 5:88b6ced3df89 25 detached = true;
devanlai 5:88b6ced3df89 26 }
devanlai 5:88b6ced3df89 27
devanlai 5:88b6ced3df89 28 void resetIntoBootloader() {
devanlai 5:88b6ced3df89 29 // Turn on write access to the backup registers
devanlai 5:88b6ced3df89 30 __PWR_CLK_ENABLE();
devanlai 5:88b6ced3df89 31 HAL_PWR_EnableBkUpAccess();
devanlai 5:88b6ced3df89 32
devanlai 5:88b6ced3df89 33 // Write the magic value to force the bootloader to run
devanlai 5:88b6ced3df89 34 BKP->DR2 = 0x544F;
devanlai 5:88b6ced3df89 35 BKP->DR1 = 0x4F42;
devanlai 5:88b6ced3df89 36
devanlai 5:88b6ced3df89 37 HAL_PWR_DisableBkUpAccess();
devanlai 5:88b6ced3df89 38
devanlai 5:88b6ced3df89 39 // Reset and let the bootloader run
devanlai 5:88b6ced3df89 40 NVIC_SystemReset();
devanlai 5:88b6ced3df89 41 }
devanlai 5:88b6ced3df89 42
hudakz 0:0279e8c1f111 43 int main() {
hudakz 3:dd01afd4f893 44 confSysClock(); //Configure system clock (72MHz HSE clock, 48MHz USB clock)
hudakz 4:00ccc80cbeb8 45
devanlai 5:88b6ced3df89 46 USBDFU usbDFU(0x1234, 0x0006, 0x0001, false);
devanlai 5:88b6ced3df89 47 usbDFU.attach(onDetachRequested);
hudakz 0:0279e8c1f111 48
hudakz 0:0279e8c1f111 49 while(1) {
devanlai 5:88b6ced3df89 50 // Check the DFU status
devanlai 5:88b6ced3df89 51 if (!usbDFU.configured()) {
devanlai 5:88b6ced3df89 52 usbDFU.connect(false);
devanlai 5:88b6ced3df89 53 }
devanlai 5:88b6ced3df89 54 if (detached) {
devanlai 5:88b6ced3df89 55 for (int i=0; i < 5; i++) {
devanlai 5:88b6ced3df89 56 myled = 1;
devanlai 5:88b6ced3df89 57 wait_ms(100);
devanlai 5:88b6ced3df89 58 myled = 0;
devanlai 5:88b6ced3df89 59 wait_ms(100);
devanlai 5:88b6ced3df89 60 }
devanlai 5:88b6ced3df89 61 resetIntoBootloader();
devanlai 5:88b6ced3df89 62 }
devanlai 5:88b6ced3df89 63
devanlai 5:88b6ced3df89 64 // Do normal stuff
hudakz 0:0279e8c1f111 65 myled = !myled;
hudakz 0:0279e8c1f111 66 wait_ms(1000);
hudakz 0:0279e8c1f111 67 }
hudakz 0:0279e8c1f111 68 }
hudakz 0:0279e8c1f111 69