NUCLEO-F411RE

Hoje vou falar de uma placa de desenvolvimento feita pela STMicroelectronics que funciona com a plataforma de desenvolvimento mbed.

Em termos de funcionalidades esta placa faz parte de uma família de placas que a STMicroelectronics desenvolveu e que apenas diferem no micro-controlador que têm. Esta, em particular, tem um micro-controlador STM32 - o STM32F411RET6. Este micro-controlador é um ARM Cortex M4 de 32 bits com FPU e ART (Adaptive real-time accelerator) que permite execução com 0-wait a partir da memória Flash.

O micro-controlador tem as seguintes funcionalidades:

  • Frequência de relógio até 100 MHz
  • VDD de 1.7 a 3.6 V
  • 512 KBytes de Flash
  • 128 KBytes SRAM
  • GPIO (50) com capacidade de interrupção externa
  • ADC de 12-bits com 16 canais
  • RTC
  • Timers (8) - 6 timers de 16-bits e 2 de 32-bits
  • I2C (3)
  • USART (3) - 2 a 12.5 MBit/s, 1 a 6.25 MBit/s
  • SPI (5)
  • USB com OTG full Speed
  • SDIO (SD/MMC/eMMC)

Diagrama do micro-controlador:

bd_stm32f411xe_512k

A placa tem pinos compatíveis com o Arduino e a interface Morpho que permitem o acesso a todos os pinos do STM32.

Existe na placa um programador/debugger ST-LINK/V2-1 com selector que permite o uso do programador como ferramenta standalone.

Dispõe de 3 LEDs: Comunicações USB, utilizador e energia.

Tem 2 botões de pressão: utilizador e RESET.

O USB pode funcionar como uma porta COM virtual, como um dispositivo de armazenamento ou como porta para debug.

A placa, que pode ser separada, tem os componentes dispostos no topo da seguinte forma:

NUCLEO-F411RE_top

Na parte traseira têm a seguinte configuração:

NUCLEO-F411RE_bottom

Pinout da placa dos headers compatíveis com o Arduino:

NucleoPinout-Arduino

Pinout da placa com os headers Morpho que dão acesso a todos os pinos STM32:

NucleoPinout-Morpho

Embora esta placa permita que sejam desenvolvidos programas usando ferramentas IDE como o IAR, o KEIL e outros IDEs que usem o GCC iremos usar a plataforma mbed para fazer programas para a placa.

Para se usar a plafaforma mbed deverá aceder-se ao link da mesma em developer.mbed.org.

Criar uma conta e entrar.

Nesse momento deverá selecionar-se em que plataformas se pretende fazer código no mbed. Aceder à opção “Platforms” e depois escolher o “Platform vendor” = “STMicroelectronics”. De seguida escolher a placa “NUCLEO-F411RE” e depois selecionar “Add to your mbed Compiler” para que este tipo de placa fique disponível.

Agora vamos fazer o primeiro programa. Carreguem na opção “Compiler”. Depois “New” e “New program”.

mbed_createProgram

Neste momento deveremos importar a biblioteca mbed. Para isso carregar no botão “import” e depois nas “Libraries” escolher “mbed” e carregar no botão “Import!”.

A seguir vamos criar um ficheiro chamado “main.cpp”. Este irá conter o código inicial do nosso programa.

Colocar no ficheiro este código:

#include "mbed.h"

DigitalOut myled(LED1);

int main() {
    while(1) {
        myled = 1; // LED is ON
        wait(1.0); // 1 sec
        myled = 0; // LED is OFF
        wait(1.0); // 1 sec
    }
}

O código irá fazer o blink usando o LED1 (Interno).
Carregar no botão “Compile”. O Browser irá descarregar um ficheiro quando a compilação for feita com sucesso. Neste momento podemos ligar a placa ao PC através do cabo USB e o ficheiro pode ser colocado na Drive que aparecer. O código é executado de imediato.

Agora vamos mudar o programa para começar a usar outros pinos:

#include "mbed.h"

DigitalOut led1(D2);
DigitalOut led2(D3);
DigitalOut led3(D4);

int main() {
    while(1) {
        led1 = 1; // LED is ON
        wait(0.2); // 1 sec
        led2 = 1; // LED is ON
        wait(0.2); // 1 sec
        led3 = 1; // LED is ON
        wait(0.2); // 1 sec
        led1 = 0; // LED is OFF
        wait(0.2); // 1 sec
        led2 = 0; // LED is ON       
        wait(0.2); // 1 sec
        led3 = 0; // LED is ON       
        wait(0.2); // 1 sec
    }
}

O Circuito deverá ser o seguinte:

mbed_leds_schematics

Quando o código é compilado o interface apresenta-nos muita informação util.

mbed_programDetails

Neste quadro resumo podemos ver quanto espaço na Flash ocupa o nosso código e que RAM precisa.

Se quiserem um programa um pouco mais complexo, este é o código para o programa que vinha inicialmente carregado no micro-controlador:

#include "mbed.h"

DigitalOut led(LED1);
InterruptIn btn(USER_BUTTON);
Serial serial(SERIAL_TX, SERIAL_RX);

enum {DELAY_SLOW = 500000, DELAY_FAST = 100000, DELAY_FLASH=50000 };
long delay = DELAY_FAST;
bool pressed = false;
long counter = 0;

static void flash()
{
    for (int n = 0; n < 12; ++n) {
        led = !led;
        wait_us(DELAY_FLASH);
    }
}
static void onButtonPress()
{
    delay = (delay == DELAY_SLOW) ? DELAY_FAST : DELAY_SLOW;
    pressed = true;
}
int
main()
{
    serial.baud(115200);
    btn.fall(&onButtonPress);
    flash();
    set_time(1393936792); // set the onboard RTC
    printf("MBED Nucleo Blink Test (v1.0)\n");
    while (true)
    {
        led = !led;
        ++counter;
        if ((counter % 10) == 0) {
             time_t seconds = time(NULL);
             printf("%d %d %s", counter, seconds, ctime(&seconds));
        }
        if (pressed) { pressed = false; printf("# button pressed\n"); }
        wait_us(delay);
    }
}

Este código encontra-se nesta página e pode ser importado.

Nota: Se der um erro. Façam “update” em cima da pasta mbed do programa nucleoBlink.

Isto é apenas uma amostra das possibilidades que esta placa e que a ARM mbed podem fazer.

Explorem os exemplos e o código que já foi feito por outros utilizadores. Na secção Cookbook existem muito exemplos de como fazer diferentes coisas com esta placa.

Conclusão

A programação feita no mbed é “parecida” com a que é feita num IDE tradicional, o código tem versionamento associado o que se torna uma mais valia.

A placa foi adquirida por 10€ o que a torna numa opção interessante.

Se se quiserem aventurar no mundo ARM sem gastar muito é uma opção.