Stm32f407vg stm32f4discovery: Difference between revisions

From Miosix Wiki
Jump to navigation Jump to search
(Created page with "===STM32 F4=== {{Infobox CPU |name = STM32 F4 Series <ref name="STM32-F4-WebSite">[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577 STM32 F4 Website; STMicro...")
 
m (Fixed baudrate, was 115200 but is 19200)
 
(14 intermediate revisions by 5 users not shown)
Line 1: Line 1:
===STM32 F4===
 
{{Infobox CPU
This is a cheap self contained [http://www.st.com/web/catalog/tools/PF252419 discovery board] with a powerful processor, and a Linux-friendly [http://www.st.com/web/catalog/tools/PF219866 ST-LINK/V2] programmer/in circuit debugger.
|name          = STM32 F4 Series <ref name="STM32-F4-WebSite">[http://www.st.com/web/en/catalog/mmc/FM141/SC1169/SS1577 STM32 F4 Website; STMicroelectronics.]</ref>
The board is equipped with
|image          =
* A [http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140 STM32F407VG] microcontroller with a 168MHz ARM Cortex-M4F core, 1024KB Flash, 192KB RAM, 4KB battery-backed RAM in LQFP100 package.
|caption        =
* A LIS302DL accelerometer, MP45DT02 mems microphone, CS43L22 audio DAC, 4 user LEDs, user button, reset button, a second USB connector as the microcontroller supports USB.
|produced-start = 2011
 
|produced-end   = Current
[[File:Stm32f4discovery.jpg|frameless]]
|slowest        = 84
 
|fastest        = 180
== Configuring the kernel ==
|slow-unit      =  
 
|fast-unit      = MHz
The minimum configuration required is to edit the [[Makefile.inc|miosix/config/Makefile.inc]] file to uncomment the ''OPT_BOARD := stm32f407vg_stm32f4discovery'' line. If you had compiled the kernel before, it is recommended to do a ''make clean'' (or in the Netbeans IDE, to click on the "Clean project" button) to avoid leaving object files around. After, do a ''make'' to compile.
|size-from      = 90&nbsp;nm
 
|size-to        =
In addition, this board has a couple of board-specific options in the Makefile.inc file. For convenience, the relevant part of that configuration file is reported here so as to be easily located within the file
|arch          = [[ARM architecture#Thumb|Thumb]], [[ARM architecture#Thumb-2|Thumb-2]],<br/>[[Saturation arithmetic|Sat Math]], [[ARM architecture#DSP enhancement instructions|DSP]], [[ARM architecture#VFP|FPU]]
 
|microarch      = [[ARM Cortex-M4F]] <ref name="M4-Spec"/>
<source lang="CPP">
}}
##---------------------------------------------------------------------------
The STM32 F4-series is the first group of STM32 microcontrollers based on the ARM Cortex-M4F core. The F4-series is also the first STM32 series to have DSP and floating point instructions. The F4 is [[Pin-compatibility|pin-to-pin compatible]] with the STM32 F2-series and adds higher clock speed, 64K CCM static RAM, full duplex I²S, improved real-time clock, and faster ADCs. The summary for this series is:<ref name="PR-20110921"/><ref name="PR-20130220"/><ref name="PR-20130430"/><ref name="STM32-F4-WebSite"/><ref name="STM-F4-MarketingSlides">[http://www.st.com/st-web-ui/static/active/en/resource/sales_and_marketing/presentation/product_presentation/stm32f4_marketing_pres.pdf STM32 F4 Marketing Slides; STMicroelectronics.]</ref>
## stm32f407vg_stm32f4discovery
* Core:
##
** [[ARM Cortex-M4F]] core at a maximum clock rate of 84 / 168 / 180&nbsp;[[MHz]].
ifeq ($(OPT_BOARD),stm32f407vg_stm32f4discovery)
* Memory:
 
** [[Static RAM]] consists of up to 192&nbsp;KB general purpose, 64&nbsp;KB core coupled memory (CCM), 4&nbsp;KB battery-backed, 80&nbsp;bytes battery-backed with tamper-detection erase.
   ## Linker script type, there are two options
** [[Flash memory|Flash]] consists of 512 / 1024 / 2048&nbsp;[[Kilobyte|KB]] general purpose, 30&nbsp;KB system boot, 512&nbsp;bytes one-time programmable (OTP), 16 option bytes.
  ## 1) Code in FLASH, stack + heap in internal RAM (file *_rom.ld)
** Each chip has a factory-programmed 96-bit unique device identifier number.
  ## 2) Code + stack + heap in internal RAM (file *_ram.ld)
* Peripherals:
  LINKER_SCRIPT_PATH := arch/cortexM4_stm32f4/stm32f407vg_stm32f4discovery/
** Common peripherals included in all IC packages are [[USB]]&nbsp;2.0 [[USB On-The-Go|OTG]] HS and FS, two [[Controller area network|CAN]] 2.0B, one [[Serial Peripheral Interface Bus|SPI]] + two SPI or full-duplex [[I²S]], three [[I²C]], four [[USART]], two [[UART]], [[Secure Digital#SDIO|SDIO]] for [[Secure Digital|SD]]/[[MultiMediaCard|MMC]] cards, twelve 16-bit [[Timers#Computer timers|timers]], two 32-bit timers, two [[Watchdog timer|watchdog]] timers, [[temperature]] sensor, 16 or 24 channels into three [[Analog-to-digital converter|ADC]]s, two [[Digital-to-analog converter|DAC]]s, 51 to 140 [[General Purpose Input/Output|GPIO]]s, sixteen [[Direct memory access|DMA]], improved real-time clock ([[Real-time clock|RTC]]), [[cyclic redundancy check]] (CRC) engine, [[random number generation|random number generator]] (RNG) engine. Larger IC packages add 8/16-bit external [[memory bus]] capabilities.
  LINKER_SCRIPT := $(LINKER_SCRIPT_PATH)stm32_1m+192k_rom.ld
** The STM32F4x7 models add [[ethernet]] [[Media Independent Interface|MAC]] and [[camera interface]].
  #LINKER_SCRIPT := $(LINKER_SCRIPT_PATH)stm32_1m+192k_ram.ld
** The STM32F41x/43x models add a [[Cryptographic accelerator|cryptographic processor]] for [[Data Encryption Standard|DES]] / [[Triple DES|TDES]] / [[Advanced Encryption Standard|AES]], and a hash processor for [[SHA-1]] and [[MD5]].
 
** The STM32F4x9 models add a [[TFT LCD|LCD-TFT]] controller.
  ## This causes the interrupt vector table to be relocated in SRAM, must be
* [[Electronic oscillator|Oscillators]] consists of internal (16&nbsp;MHz, 32&nbsp;kHz), optional external (4 to 26&nbsp;MHz, 32.768 to 1000&nbsp;kHz).
  ## uncommented when using the ram linker script
* [[Integrated circuit packaging|IC packages]]: [[WLCSP]]64, [[LQFP]]64, LQFP100, LQFP144, LQFP176, [[UFBGA]]176. STM32F429/439 also offers LQFP208 and [[UFBGA]]216.
  #SRAM_BOOT := -DVECT_TAB_SRAM
* Operating [[IC power supply pin|voltage]] range is 1.8 to 3.6&nbsp;[[volt]].
 
{{clear}}
endif
</source>
 
As can be seen, there are two options for this board: LINKER_SCRIPT and SRAM_BOOT. The comments explain in detail the meaning of there options, so it isn't necessary to further explain them.
 
After modifying configuration files it is recommended to do a make clean; make (or in the Netbeans IDE, to click on the "Clean and build project" button) to be sure that changes are applied.
 
== Loading code ==
 
As explained before, there are more than one linker script for this board, and the selected linker script affects the way code should be loaded on the board.
 
===stm32_1m+192k_rom.ld===
This is the default linker script, and puts the code in FLASH, so you need to program the microcontroller's FLASH every time you change your code, but code will run faster and won't be lost at each reboot.
 
A simple way to load code in FLASH is to use the [https://github.com/fpoussin/QStlink2 QStlink2] tool. Also, if you have a brand new board and QStlink fails you may take a look at [[ST-LINK utility update|this page]]
 
===stm32_1m+192k_ram.ld===
This linker script is very useful for debugging code on this board, as it locates everything (code, stack, heap) in the microcontroller's RAM. It has the disadvantage that the loaded code is lost upon reboot (being in a volatile memory), but for debugging, it is not an issue.
 
== Reading printf output ==
 
The board has no serial to USB adapter onboard, so you need to use an external one, connected to USART3, in detail PB10 (TXD) and PB11 (RXD). The choice of USART3 was done due to the fact that USART1 pins are not free on this board.
 
On Linux you can use screen. Open a terminal and type ''screen /dev/ttyUSB0 19200'' (Note that to quit from screen you need to type "Ctrl-C, \"). You'll need to change /dev/ttyUSB0 with your serial port device name.
 
On windows you can use HyperTerminal, you need to configure it to use the required baud rate, no flow control, and select the correct COM port device name.
 
== In Circuit Debugging ==
 
Before you begin you should note that the Miosix kernel will put the CPU to a low power state when no thread is running. This low power state will usually confuse debuggers and make them lose sync with the CPU. To avoid this you need to edit the [[miosix_settings.h|miosix/config/miosix_settings.h]] file and uncomment ''#define JTAG_DISABLE_SLEEP'' line. This will prevent the kernel from putting the CPU in its low power state making debugging possible.
Also, to be able to precisely single-step your code you need to disable compiler optimizations as gdb is incapable of reliably debug an optimized code. The option is in the miosix/config/Makefile.inc file and is the ''OPT_OPTIMIZATION := -O0'' that should be uncommented while the other lines related to the same option should be commented out.
 
After modifying configuration files it is recommended to do a ''make clean; make'' (or in the Netbeans IDE, to click on the "Clean and build project" button) to be sure that changes are applied.
 
Since the board has an on board SWD in circuit debugger, simply plugging the USB cable is all you need from an hardware point of view.
On the software side, you need to open two shells. In one do a
 
<source lang="BASH">
sudo openocd -f miosix/arch/cortexM4_stm32f4/stm32f407vg_stm32f4discovery/stm32f4discovery.cfg
</source>
 
This will start the OpenOCD program that will connect to the board and listen for GDB connections.
 
In the second shell type the following commands
 
<source lang="BASH">
arm-miosix-eabi-gdb main.elf
target remote :3333
monitor soft_reset_halt
break main
continue
</source>
 
The first command will start the gdb debugger. The following commands are typed into the gdb console, and tell it to connect to OpenOCD, and reset the board and stop the program at the beginning of main()
To load the program to be debugged, you can either do a make program before and then start debugging, or you can directly write the FLASH memory from within gdb with this command
 
<source lang="BASH">
monitor flash write_image erase main.bin 0x08000000
</source>
 
From there on, have a look at [[Quick_start]] for debugger commands.
 
== (Optional) Configuring the Netbeans IDE ==
To have a fully working code completion that can also resolve the board-specific symbols, right click on the project, go to Set Configuration and select the right board.
 
[[File: Netbeans-config.png]]
 
== SD Card ==
 
This board lacks an SD connector, so the filesystem support does not work out of the box (upon boot the kernel will say that filesystem mounting failed). However, it is possible to connect one to specific GPIO pins.
 
The SD or microSD connector VCC and GND pins need to be connected to 3V and GND pins on the board. Add a 100nF capacitor between VCC and GND, as close as possible to the SD connector. This will be useful to overcome current absorption peaks from the SD card.
 
Then connect the following GPIOs to the SD connector.
 
{| class="wikitable"
|-
! SD !! STM32 !! Optional
|-
| CLK || PC12 ||
|-
| CMD || PD2 ||
|-
| D0 || PC8 ||
|-
| D1 || PC9 || Y
|-
| D2 || PC10 || Y
|-
| D3 || PC11 || Y
|}
 
Each connection needs a pullup resistor between ~47Kohm and 100Kohm.
 
To increase read/write speed it is possible to connect the optional GPIOs thereby communicating with the SD in 4-bit mode.
Note that by default in this board the SD driver uses 1 bit mode. To enable 4-bit mode you need to edit the ''miosix/config/arch/cortexM4_stm32f4/stm32f407vg_stm32f4discovery/board_settings.h'' and comment out the ''#define SD_ONE_BIT_DATABUS'' line.
 
Also note that filesystem support is enabled by default, so the pins marked as not optional are used by the filesystem driver. If you do not want to connect an SD card, and want to use those GPIOs, you should disable the filesystem support in [[miosix_settings.h|miosix/config/miosix_settings.h]].
 
== Resource ==
stm32f4discovery [http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00039084.pdf Datasheet]
 
[[Category:Boards]]

Latest revision as of 00:03, 28 February 2017

This is a cheap self contained discovery board with a powerful processor, and a Linux-friendly ST-LINK/V2 programmer/in circuit debugger. The board is equipped with

  • A STM32F407VG microcontroller with a 168MHz ARM Cortex-M4F core, 1024KB Flash, 192KB RAM, 4KB battery-backed RAM in LQFP100 package.
  • A LIS302DL accelerometer, MP45DT02 mems microphone, CS43L22 audio DAC, 4 user LEDs, user button, reset button, a second USB connector as the microcontroller supports USB.

Stm32f4discovery.jpg

Configuring the kernel

The minimum configuration required is to edit the miosix/config/Makefile.inc file to uncomment the OPT_BOARD := stm32f407vg_stm32f4discovery line. If you had compiled the kernel before, it is recommended to do a make clean (or in the Netbeans IDE, to click on the "Clean project" button) to avoid leaving object files around. After, do a make to compile.

In addition, this board has a couple of board-specific options in the Makefile.inc file. For convenience, the relevant part of that configuration file is reported here so as to be easily located within the file

##---------------------------------------------------------------------------
## stm32f407vg_stm32f4discovery
##
ifeq ($(OPT_BOARD),stm32f407vg_stm32f4discovery)

  ## Linker script type, there are two options
  ## 1) Code in FLASH, stack + heap in internal RAM (file *_rom.ld)
  ## 2) Code + stack + heap in internal RAM (file *_ram.ld)
  LINKER_SCRIPT_PATH := arch/cortexM4_stm32f4/stm32f407vg_stm32f4discovery/
  LINKER_SCRIPT := $(LINKER_SCRIPT_PATH)stm32_1m+192k_rom.ld
  #LINKER_SCRIPT := $(LINKER_SCRIPT_PATH)stm32_1m+192k_ram.ld

  ## This causes the interrupt vector table to be relocated in SRAM, must be
  ## uncommented when using the ram linker script
  #SRAM_BOOT := -DVECT_TAB_SRAM

endif

As can be seen, there are two options for this board: LINKER_SCRIPT and SRAM_BOOT. The comments explain in detail the meaning of there options, so it isn't necessary to further explain them.

After modifying configuration files it is recommended to do a make clean; make (or in the Netbeans IDE, to click on the "Clean and build project" button) to be sure that changes are applied.

Loading code

As explained before, there are more than one linker script for this board, and the selected linker script affects the way code should be loaded on the board.

stm32_1m+192k_rom.ld

This is the default linker script, and puts the code in FLASH, so you need to program the microcontroller's FLASH every time you change your code, but code will run faster and won't be lost at each reboot.

A simple way to load code in FLASH is to use the QStlink2 tool. Also, if you have a brand new board and QStlink fails you may take a look at this page

stm32_1m+192k_ram.ld

This linker script is very useful for debugging code on this board, as it locates everything (code, stack, heap) in the microcontroller's RAM. It has the disadvantage that the loaded code is lost upon reboot (being in a volatile memory), but for debugging, it is not an issue.

Reading printf output

The board has no serial to USB adapter onboard, so you need to use an external one, connected to USART3, in detail PB10 (TXD) and PB11 (RXD). The choice of USART3 was done due to the fact that USART1 pins are not free on this board.

On Linux you can use screen. Open a terminal and type screen /dev/ttyUSB0 19200 (Note that to quit from screen you need to type "Ctrl-C, \"). You'll need to change /dev/ttyUSB0 with your serial port device name.

On windows you can use HyperTerminal, you need to configure it to use the required baud rate, no flow control, and select the correct COM port device name.

In Circuit Debugging

Before you begin you should note that the Miosix kernel will put the CPU to a low power state when no thread is running. This low power state will usually confuse debuggers and make them lose sync with the CPU. To avoid this you need to edit the miosix/config/miosix_settings.h file and uncomment #define JTAG_DISABLE_SLEEP line. This will prevent the kernel from putting the CPU in its low power state making debugging possible. Also, to be able to precisely single-step your code you need to disable compiler optimizations as gdb is incapable of reliably debug an optimized code. The option is in the miosix/config/Makefile.inc file and is the OPT_OPTIMIZATION := -O0 that should be uncommented while the other lines related to the same option should be commented out.

After modifying configuration files it is recommended to do a make clean; make (or in the Netbeans IDE, to click on the "Clean and build project" button) to be sure that changes are applied.

Since the board has an on board SWD in circuit debugger, simply plugging the USB cable is all you need from an hardware point of view. On the software side, you need to open two shells. In one do a

sudo openocd -f miosix/arch/cortexM4_stm32f4/stm32f407vg_stm32f4discovery/stm32f4discovery.cfg

This will start the OpenOCD program that will connect to the board and listen for GDB connections.

In the second shell type the following commands

arm-miosix-eabi-gdb main.elf
target remote :3333
monitor soft_reset_halt
break main
continue

The first command will start the gdb debugger. The following commands are typed into the gdb console, and tell it to connect to OpenOCD, and reset the board and stop the program at the beginning of main() To load the program to be debugged, you can either do a make program before and then start debugging, or you can directly write the FLASH memory from within gdb with this command

monitor flash write_image erase main.bin 0x08000000

From there on, have a look at Quick_start for debugger commands.

(Optional) Configuring the Netbeans IDE

To have a fully working code completion that can also resolve the board-specific symbols, right click on the project, go to Set Configuration and select the right board.

Netbeans-config.png

SD Card

This board lacks an SD connector, so the filesystem support does not work out of the box (upon boot the kernel will say that filesystem mounting failed). However, it is possible to connect one to specific GPIO pins.

The SD or microSD connector VCC and GND pins need to be connected to 3V and GND pins on the board. Add a 100nF capacitor between VCC and GND, as close as possible to the SD connector. This will be useful to overcome current absorption peaks from the SD card.

Then connect the following GPIOs to the SD connector.

SD STM32 Optional
CLK PC12
CMD PD2
D0 PC8
D1 PC9 Y
D2 PC10 Y
D3 PC11 Y

Each connection needs a pullup resistor between ~47Kohm and 100Kohm.

To increase read/write speed it is possible to connect the optional GPIOs thereby communicating with the SD in 4-bit mode. Note that by default in this board the SD driver uses 1 bit mode. To enable 4-bit mode you need to edit the miosix/config/arch/cortexM4_stm32f4/stm32f407vg_stm32f4discovery/board_settings.h and comment out the #define SD_ONE_BIT_DATABUS line.

Also note that filesystem support is enabled by default, so the pins marked as not optional are used by the filesystem driver. If you do not want to connect an SD card, and want to use those GPIOs, you should disable the filesystem support in miosix/config/miosix_settings.h.

Resource

stm32f4discovery Datasheet