As of August 2020 the site you are on (wiki.newae.com) is deprecated, and content is now at rtfm.newae.com.

Difference between revisions of "CW308T-STM32F/ChipWhisperer Bootloader"

From ChipWhisperer Wiki
Jump to: navigation, search
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
 +
{{Warningbox|These instructions have been updated for ChipWhisperer 5. If you're using and earlier version, see https://wiki.newae.com/V4:CW308T-STM32F/ChipWhisperer_Bootloader}}
 
The STM32Fx devices have a built-in bootloader, and the ChipWhisperer software as of 3.5.2 includes support for this bootloader.
 
The STM32Fx devices have a built-in bootloader, and the ChipWhisperer software as of 3.5.2 includes support for this bootloader.
  
 
Important notes before we begin:
 
Important notes before we begin:
* You MUST setup a clock and the serial lines for the chip. This is easily done by selecting a start-up script such as the "AES SimpleSerial on XMEGA" startup script.
+
* You MUST setup a clock and the serial lines for the chip. This is easily done by connecting to the scope and target, then running <code>default_setup()</code>:
* On the STM32F1, you MUST adjust the clock frequency to by 8MHz. The bootloader does not work with our usual 7.37 MHz clock frequency. '''You must set the clock frequency back to 7.37MHz after programming the device.'''
+
<syntaxhighlight lang=python>
 +
import chipwhisperer as cw
 +
scope = cw.scope
 +
target = cw.target(scope)
 +
scope.default_setup()
 +
</syntaxhighlight>
 +
* On the STM32F1, you MUST adjust the clock frequency to 8MHz. The bootloader does not work with our usual 7.37 MHz clock frequency. '''This 8MHz frequency does not apply to the code that you're running on the device. Once you're done programming, you'll need to set the frequency back to F_CPU (likely 7.37MHz)''' For example:
 +
 
 +
<syntaxhighlight lang=python>
 +
scope.default_setup()
 +
scope.clock.clkgen_freq = 8E6
 +
#program target...
 +
scope.clock.clkgen_freq = 7.37E6
 +
#reset and run as usual
 +
</syntaxhighlight>
  
 
To access the bootloader you can perform these steps. They vary based on if you have a "Rev 02" board or a "Rev 03 or Later" board. The revision number is printed on the bottom side as part of the PCB part number (STM32F-03 is Rev -03 for example).
 
To access the bootloader you can perform these steps. They vary based on if you have a "Rev 02" board or a "Rev 03 or Later" board. The revision number is printed on the bottom side as part of the PCB part number (STM32F-03 is Rev -03 for example).
  
== Rev -03 or Later ==
+
==== Rev -03 or Later ====
  
# Select the "Serial STM32F Programmer"
+
Run the following python code once you have the scope and target set up:
#: [[File:arm_programmer.png]]
+
<syntaxhighlight lang=python>
# Select the hex-file and press the "Program/Verify" button.
+
prog = cw.programmers.STM32FProgrammer
# The device should program, it may take a moment to fully program/verify on larger devices:
+
cw.program_target(scope, prog, "<path to fw hex file>")
#: [[File:arm_programmed.png]]
+
</syntaxhighlight>
  
{{Warningbox|If you get verify errors, it's possible the shunt resistor is causing power to dip too low. This can be solved by mounting a jumper between the "SH-" and "SH+" pins at J16 (to the left of the SMA connector) on the UFO board. Retry programming with the jumper mounted. }}
+
If you get errors during the programming process:
 +
* Retry the programming process with a lower baud rate:
 +
<syntaxhighlight lang=python>
 +
prog = cw.programmers.STM32FProgrammer
 +
cw.program_target(scope, prog, "<path to fw hex file>", baud=38400)
 +
</syntaxhighlight>
 +
* If using a CW308 based STM, try mounting a jumper between the "SH-" and "SH+" pins at J16 (to the left of the SMA connector) on the UFO board. Retry programming with the jumper mounted.
  
== Rev -02 Boards ==
+
==== Rev -02 Boards ====
  
 
The Rev -02 boards did not have all programming connections present. They require some additional steps:
 
The Rev -02 boards did not have all programming connections present. They require some additional steps:
  
# Select the "Serial STM32F Programmer"
+
# Setup the device as usual:
#: [[File:arm_programmer.png]]
+
#:<syntaxhighlight lang=python>
 +
scope = cw.scope()
 +
target = cw.target(scope)
 +
scope.default_setup()
 +
</syntaxhighlight>
 
# Mount a jumper between the H1 and PDIC pins (again this is ONLY for the -02 rev).
 
# Mount a jumper between the H1 and PDIC pins (again this is ONLY for the -02 rev).
 
#: [[File:STMF32F-02 programmer jumper.jpg|400px]]
 
#: [[File:STMF32F-02 programmer jumper.jpg|400px]]
 
# Reset the ARM device either by pressing the reset button (newer UFO boards only), or by toggling power:
 
# Reset the ARM device either by pressing the reset button (newer UFO boards only), or by toggling power:
#: [[File:arm_togglepower.png]]
+
#:<syntaxhighlight lang=python>
# Select the hex-file and press the "Program/Verify" button.
+
import time
# The device should program, it may take a moment to fully program/verify on larger devices:
+
scope.io.target_pwr = False
#: [[File:arm_programmed.png]]
+
time.sleep(1)
 +
scope.io.target_pwr = True
 +
</syntaxhighlight>
 +
# Program the device:
 +
#:<syntaxhighlight lang=python>
 +
prog = cw.programmers.STM32FProgrammer
 +
cw.program_target(scope, prog, "<path to fw hex file>")
 +
</syntaxhighlight>
 +
# The device should program, it may take a moment to fully program/verify on larger devices.
 
# Remove the jumper between the H1/H2 pins.
 
# Remove the jumper between the H1/H2 pins.
 
# Reset the ARM device either by pressing the reset button (newer UFO boards only), or by toggling power:
 
# Reset the ARM device either by pressing the reset button (newer UFO boards only), or by toggling power:
#: [[File:arm_togglepower.png]]
+
#:<syntaxhighlight lang=python>
 
+
import time
{{Warningbox|If you get verify errors, it's possible the shunt resistor is causing power to dip too low. This can be solved by mounting a jumper between the "SH-" and "SH+" pins at J16 (to the left of the SMA connector) on the UFO board. Retry programming with the jumper mounted. }}
+
scope.io.target_pwr = False
 +
time.sleep(1)
 +
scope.io.target_pwr = True
 +
</syntaxhighlight>

Latest revision as of 07:03, 7 May 2020

These instructions have been updated for ChipWhisperer 5. If you're using and earlier version, see https://wiki.newae.com/V4:CW308T-STM32F/ChipWhisperer_Bootloader

The STM32Fx devices have a built-in bootloader, and the ChipWhisperer software as of 3.5.2 includes support for this bootloader.

Important notes before we begin:

  • You MUST setup a clock and the serial lines for the chip. This is easily done by connecting to the scope and target, then running default_setup():
import chipwhisperer as cw
scope = cw.scope
target = cw.target(scope)
scope.default_setup()
  • On the STM32F1, you MUST adjust the clock frequency to 8MHz. The bootloader does not work with our usual 7.37 MHz clock frequency. This 8MHz frequency does not apply to the code that you're running on the device. Once you're done programming, you'll need to set the frequency back to F_CPU (likely 7.37MHz) For example:
scope.default_setup()
scope.clock.clkgen_freq = 8E6
#program target...
scope.clock.clkgen_freq = 7.37E6
#reset and run as usual

To access the bootloader you can perform these steps. They vary based on if you have a "Rev 02" board or a "Rev 03 or Later" board. The revision number is printed on the bottom side as part of the PCB part number (STM32F-03 is Rev -03 for example).

Rev -03 or Later

Run the following python code once you have the scope and target set up:

prog = cw.programmers.STM32FProgrammer
cw.program_target(scope, prog, "<path to fw hex file>")

If you get errors during the programming process:

  • Retry the programming process with a lower baud rate:
prog = cw.programmers.STM32FProgrammer
cw.program_target(scope, prog, "<path to fw hex file>", baud=38400)
  • If using a CW308 based STM, try mounting a jumper between the "SH-" and "SH+" pins at J16 (to the left of the SMA connector) on the UFO board. Retry programming with the jumper mounted.

Rev -02 Boards

The Rev -02 boards did not have all programming connections present. They require some additional steps:

  1. Setup the device as usual:
    scope = cw.scope()
    target = cw.target(scope)
    scope.default_setup()
    
  2. Mount a jumper between the H1 and PDIC pins (again this is ONLY for the -02 rev).
    STMF32F-02 programmer jumper.jpg
  3. Reset the ARM device either by pressing the reset button (newer UFO boards only), or by toggling power:
    import time
    scope.io.target_pwr = False
    time.sleep(1)
    scope.io.target_pwr = True
    
  4. Program the device:
    prog = cw.programmers.STM32FProgrammer
    cw.program_target(scope, prog, "<path to fw hex file>")
    
  5. The device should program, it may take a moment to fully program/verify on larger devices.
  6. Remove the jumper between the H1/H2 pins.
  7. Reset the ARM device either by pressing the reset button (newer UFO boards only), or by toggling power:
    import time
    scope.io.target_pwr = False
    time.sleep(1)
    scope.io.target_pwr = True