README ====== This README discusses issues unique to NuttX configurations for the STMicro Nucleo-144 board. See http://www.st.com/content/ccc/resource/technical/document/data_brief/group0/7b/df/1d/e9/64/55/43/8d/DM00247910/files/DM00247910.pdf/jcr:content/translations/en.DM00247910.pdf Contents ======== - Nucleo-144 Boards - Nucleo F746ZG - Development Environment - IDEs - Basic configuaration & build steps - Hardware - Button - LED - U[S]ARTs and Serial Consoles - Configurations Nucleo-144 Boards: ================= The Nucleo-144 is a standard board for use with several STM32 parts in the LQFP144 package. Variants include STM32 Part Board Variant Name ------------- ------------------ STM32F207ZGT6 NUCLEO-F207ZG STM32F303ZET6 NUCLEO-F303ZE STM32F429ZIT6 NUCLEO-F429ZI STM32F446ZET6 NUCLEO-F446ZE STM32F746ZGT6 NUCLEO-F746ZG STM32F767ZIT6 NUCLEO-F767ZI ------------- ------------------ This directory is intended to support all Nucleo-144 variants since the boards are identical, differing only in the installed part. This common board design provides uniformity in the documentation from ST and should allow us to quickly change configurations by just cloning a configuration and changing the CPU choice and board initialization. Unfortunately for the developer, the CPU specific information must be extracted from the common information in the documentation. Please read the User Manaul UM1727: Getting started with STM32 Nucleo board software development tools and take note of the Powering options for the board (6.3 Power supply and power selection) and the Solder bridges based hardware configuration changes that are configurable (6.11 Solder bridges). Common Board Features: --------------------- Peripherals: 8 leds, 2 push button (3 LEDs, 1 button) under software control Debug: STLINK/V2-1 debugger/programmer Uses a STM32F103CB to provide a ST-Link for programming, debug similar to the OpenOcd FTDI function - USB to JTAG front-end. Expansion I/F: ST Zio and Extended Ardino and Morpho Headers Nucleo F746ZG ============= At present only the ST Nucleo F746ZG board from ST Micro is supported. See http://www.st.com/content/st_com/en/products/evaluation-tools/product-evaluation-tools/mcu-eval-tools/stm32-mcu-eval-tools/stm32-mcu-nucleo/nucleo-f746zg.html The Nucleo F746ZG order part number is NUCLEO-F746ZG. It is one member of the STM32 Nucleo-144 board family. NUCLEO-F746ZG Features: ---------------------- Microprocessor: STM32F746ZGT6 Core: ARM 32-bit Cortex®-M7 CPU with FPU, L1-cache: 4KB data cache and 4KB instruction cache, up to 216 MHz, MPU, and DSP instructions. Memory: 1024 KB Flash 320KB of SRAM (including 64KB of data TCM RAM) + 16KB of instruction TCM RAM + 4KB of backup SRAM ADC: 3×12-bit, 2.4 MSPS ADC: up to 24 channels and 7.2 MSPS in triple interleaved mode DMA: 16-stream DMA controllers with FIFOs and burst support Timers: Up to 18 timers: up to thirteen 16-bit (1x 16-bit lowpower), two 32-bit timers, 2x watchdogs, SysTick GPIO: 114 I/O ports with interrupt capability LCD: LCD-TFT Controllerwith (DMA2D), Parallel interface I2C: 4 × I2C interfaces (SMBus/PMBus) U[S]ARTs: 4 USARTs, 4 UARTs (27 Mbit/s, ISO7816 interface, LIN, IrDA, modem control) SPI/12Ss: 6/3 (simplex) (up to 50 Mbit/s), 3 with muxed simplex I2S for audio class accuracy via internal audio PLL or external clock QSPI: Dual mode Quad-SPI SAIs: 2 Serial Audio Interfaces CAN: 2 X CAN interface SDMMC interface SPDIFRX interface USB: USB 2.0 full-speed device/host/OTG controller with on-chip PHY 10/100 Ethernet: MAC with dedicated DMA: supports IEEE 1588v2 hardware, MII/RMII Camera Interface: 8/14 Bit CRC calculation unit TRG: True random number generator RTC See https://developer.mbed.org/platforms/ST-Nucleo-F746ZG form additional information about this board. Development Environment ======================= Either Linux or Cygwin on Windows can be used for the development environment. The source has been built only using the GNU toolchain (see below). Other toolchains will likely cause problems. All testing has been conducted using the GNU toolchain from ARM for Linux. found here https://launchpad.net/gcc-arm-embedded/4.9/4.9-2015-q3-update/+download/gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2 If you change the default toolchain, then you may also have to modify the PATH in the setenv.h file if your make cannot find the tools. IDEs ==== NuttX is built using command-line make. It can be used with an IDE, but some effort will be required to create the project. Makefile Build -------------- Under Eclipse, it is pretty easy to set up an "empty makefile project" and simply use the NuttX makefile to build the system. That is almost for free under Linux. Under Windows, you will need to set up the "Cygwin GCC" empty makefile project in order to work with Windows (Google for "Eclipse Cygwin" - there is a lot of help on the internet). Basic configuration & build steps ================================== A GNU GCC-based toolchain is assumed. The files */setenv.sh should be modified to point to the correct path to the Cortex-M7 GCC toolchain (if different from the default in your PATH variable). - Configures nuttx creating .config file in the nuttx directory. $ cd tools && ./configure.sh nucleo-f746zg/nsh && cd .. - Refreshes the .config file with the latest available configurations. $ make oldconfig - Select the features you want in the build. $ make menuconfig - Builds Nuttx with the features you selected. $ make Hardware ======== GPIO - there are 144 I/O lines on the STM32F746ZGT6 with various pins pined out on the Nucleo F746ZG. See https://developer.mbed.org/platforms/ST-Nucleo-F746ZG/ for slick graphic pinouts. Keep in mind that: 1) The I/O is 3.3 Volt not 5 Volt like on the Arduino products. 2) The Nucleo-144 board family has 3 pages of Solder Bridges AKA Solder Blobs (SB) that can alter the factory configuration. We will note SB in effect but will assume the facitory defualt settings. Our main concern is establishing a console and LED utilization for debugging. Because so many pins can be multiplexed with so many functions, the above mentioned graphic is super helpful in indentifying a serial port that will not rob us of another IO feature. Namely Serial Port 8 (UART8) with TX on PE1 and RX on PE0. Of course if your design has used those pins you can choose another IO configuration to bring out Serial Port 8 or choose a completely different U[S]ART to use as the console. In that Case, You will need to edit the include/board.h to select different U[S]ART and / or pin selections. Serial ------ SERIAL_RX PE_0 SERIAL_TX PE_1 Buttons ------- B1 USER: the user button is connected to the I/O PC13 (Tamper support, SB173 ON and SB180 OFF) LEDs ---- The Board provides a 3 user LEDs, LD1-LD3 LED1 (Green) PB_0 (SB120 ON and SB119 OFF) LED2 (Blue) PB_7 (SB139 ON) LED3 (Red) PB_14 (SP118 ON) - When the I/O is HIGH value, the LEDs are on. - When the I/O is LOW, the LEDs are off. These LEDs are not used by the board port unless CONFIG_ARCH_LEDS is defined. In that case, the usage by the board port is defined in include/board.h and src/stm32_autoleds.c. The LEDs are used to encode OS related events as follows when the LEDs are available: SYMBOL Meaning RED GREEN BLUE ------------------- ----------------------- ----------- LED_STARTED 0 OFF OFF OFF LED_HEAPALLOCATE 0 OFF OFF OFF LED_IRQSENABLED 0 OFF OFF OFF LED_STACKCREATED 1 OFF ON OFF LED_INIRQ 2 NC NC ON (momentary) LED_SIGNAL 2 NC NC ON (momentary) LED_ASSERTION 3 ON NC NC (momentary) LED_PANIC 4 ON OFF OFF (flashing 2Hz) OFF - means that the OS is still initializing. Initialization is very fast so if you see this at all, it probably means that the system is hanging up somewhere in the initialization phases. GREEN - This means that the OS completed initialization. BLUE - Whenever and interrupt or signal handler is entered, the BLUE LED is illuminated and extinguished when the interrupt or signal handler exits. RED - If a recovered assertion occurs, the RED LED will be illuminated briefly while the assertion is handled. You will probably never see this. Flashing RED - In the event of a fatal crash, all other LEDs will be extinguished and RED LED will FLASH at a 2Hz rate. Thus if the GREEN LED is lit, NuttX has successfully booted and is, apparently, running normally. If the RED LED is flashing at approximately 2Hz, then a fatal error has been detected and the system has halted. Serial Consoles =============== USART8 ------ Pins and Connectors: GPIO Connector NAME RXD: PE0 CN11 pin 64, PE0 CN10 pin 33, D34 TXD: PE1 CN11 pin 61, PE1 You must use a 3.3 TTL to RS-232 converter or a USB to 3.3V TTL Nucleo 144 FTDI TTL-232R-3V3 ----------- ------------ TXD - CN11 pin 64 - RXD - Pin 5 (Yellow) RXD - CN11 pin 61 - TXD - Pin 4 (Orange) GND CN11 pin 63 GND Pin 1 (Black) *Note you will be reverse RX/TX Use make menuconfig to configure USART8 as the console: CONFIG_STM32F7_UART8=y CONFIG_USART8_SERIALDRIVER=y CONFIG_USART8_SERIAL_CONSOLE=y CONFIG_UART8_RXBUFSIZE=256 CONFIG_UART8_TXBUFSIZE=256 CONFIG_UART8_BAUD=115200 CONFIG_UART8_BITS=8 CONFIG_UART8_PARITY=0 CONFIG_UART8_2STOP=0 Virtual COM Port ---------------- Yet another option is to use USART3 and the USB virtual COM port. This option may be more convenient for long term development, but is painful to use during board bring-up. Solder Bridges. This configuration requires: PD8 USART3 TX SB5 ON and SB7 OFF (Default) PD9 USART3 RX SB6 ON and SB4 OFF (Default) Configuring USART3 is the same as given above but add the S and #3. Question: What BAUD should be configure to interface with the Virtual COM port? 115200 8N1? Default ------- As shipped, SB4 and SB7 are open and SB5 and SB6 closed, so the virtual COM port is enabled. Configurations ============== nsh: ---- Configures the NuttShell (nsh) located at apps/examples/nsh for the Nucleo-144 boards. The Configuration enables the serial interfaces on UART6. Support for builtin applications is enabled, but in the base configuration no builtin applications are selected (see NOTES below). NOTES: 1. This configuration uses the mconf-based configuration tool. To change this configuration using that tool, you should: a. Build and install the kconfig-mconf tool. See nuttx/README.txt see additional README.txt files in the NuttX tools repository. b. If this is the intall configuration then Execute 'cd tools && ./configure.sh nucleo-144/nsh && cd ..' in nuttx/ in order to start configuration process. Caution: Doing this step more than once will overwrite .config with the contents of the nucleo-144/nsh/defconfig file. c. Execute 'make oldconfig' in nuttx/ in order to refresh the configuration. d. Execute 'make menuconfig' in nuttx/ in order to start the reconfiguration process. e. Save the .config file to reuse it in the future starting at step d. 2. By default, this configuration uses the ARM GNU toolchain for Linux. That can easily be reconfigured, of course. CONFIG_HOST_LINUX=y : Builds under Linux CONFIG_ARMV7M_TOOLCHAIN_GNU_EABIL=y : ARM GNU for Linux 3. Although the default console is USART3 (which would correspond to the Virtual COM port) I have done all testing with the console device configured for UART8 (see instruction above under "Serial Consoles). evalos: ------- This configuration is designed to test the features of the board. - Configures the NuttShell (nsh) located at apps/examples/nsh for the Nucleo-144 boards. The console is available on serial interface USART3, which is accessible over the USB ST-Link interface. - Configures nsh with advanced features such as autocompletion. - Configures the on-board LEDs to work with the 'leds' example app. - Configures the 'helloxx' example app. NOTES: 1. This configuration uses the mconf-based configuration tool. To change this configuration using that tool, you should: a. Build and install the kconfig-mconf tool. See nuttx/README.txt see additional README.txt files in the NuttX tools repository. b. If this is the intall configuration then Execute 'cd tools && ./configure.sh nucleo-144/evalos && cd ..' in nuttx/ in order to start configuration process. Caution: Doing this step more than once will overwrite .config with the contents of the nucleo-144/evalos/defconfig file. c. Execute 'make oldconfig' in nuttx/ in order to refresh the configuration. d. Execute 'make menuconfig' in nuttx/ in order to start the reconfiguration process. e. Save the .config file to reuse it in the future starting at step d. 2. By default, this configuration uses the ARM GNU toolchain for Linux. That can easily be reconfigured, of course. CONFIG_HOST_LINUX=y : Builds under Linux CONFIG_ARMV7M_TOOLCHAIN_GNU_EABIL=y : ARM GNU for Linux