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:
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:
Na parte traseira têm a seguinte configuração:
Pinout da placa dos headers compatíveis com o Arduino:
Pinout da placa com os headers Morpho que dão acesso a todos os pinos STM32:
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”.
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:
Quando o código é compilado o interface apresenta-nos muita informação util.
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.