Hello World Zephyr para a placa NXP FRDM-K64F - Embarcados
Uma forma fácil de transferir arquivos de seu computador para a placa NXP FRDM-64F é utilizando o CMSIS-DAP da mbed. Basta apenas plugar a placa na USB de seu PC que ela é detectada como um Mass Storage Device (MSD) para transferência de arquivos e gravação de binário. Portanto, basta arrastar o binário desejado para dentro deste drive. Vamos utilizar esse sistema de bootloader rápido para transferir os arquivos gerados no computador para a placa e fazeremos um hello world com a UART do microcontrolador da NXP utilizando o Zephyr, RTOS da Linux Fundation e lançado a pouco.
Caso você tenha perdido os artigos sobre o Zephyr, Felipe Neves escreveu dois artigos sobre esse RTOS da Linux Foundation. No primeiro apresenta o novo RTOS da Linux Foundation, e no segundo ensina como instalar todos os pacotes para trabalhar no Ubuntu Linux. Para rodar esse tutorial é importante seguir todos os passos descritos no artigo anterior.
Artigo 1 – Zephyr, o RTOS para IoT desenvolvido pela Linux Foundation
Artigo 2 – Como instalar o Zephyr no Ubuntu 16.04
Primeiramente é interessante verificar se a placa possui o bootloader mais novo para usar o mbed. Para entrar no bootloader, seja no Windows ou Linux, basta seguir o procedimento a seguir (estamos usando o Ubuntu 16.04 para esse texto):
Desconecte a placa NXP FRDM-K64F de todos os cabos;
Pressione o botão de RESET;
Com o botão pressionado, conecte o cabo USB;
No Ubuntu deverá aparecer uma janela mostrando a seguinte pasta que acabou de ser montada: /media/<seu usuario>/BOOTLOADER;
Pode, então, liberar o botão de Reset.
Faça o download da versão mais nova do bootloader neste link. Hoje a versão mais nova disponível é a 0226_k20dx128_k64f_0x5000.bin.
Copie esse arquivo que acabou de baixar de seu PC pra dentro da placa, montada no seu PC. O LED D2 vai começar a piscar após a transferência. Quando terminar de piscar, aparecerá um drive chamado MBED em seu PC.
Quando conecto minha placa, depois do update, aparece uma pasta /media/thiago/MBED com dois arquivos, DETAILS.TXT e MBED.HTM. No Arquivo DETAILS.TXT posso checar qual a versão mais nova do MBED. No meu caso verifiquei o conteúdo desse arquivo:
Version: 0226 Build: Aug 24 2015 17:06:30 Git Commit SHA: 27a236b9fe39c674a703c5c89655fbd26b8e27e1 Git Local mods: Yes
Version: 0226
Build: Aug 24 2015 17:06:30
Git Commit SHA: 27a236b9fe39c674a703c5c89655fbd26b8e27e1
Git Local mods: Yes
Pronto. A placa está pronta para receber um binário com seu programinha feito pra FRDM-K64F.
Hello World usando a UART da FRDM-K64F e o Zephyr
Criei uma pasta chamada k64f_blink no meu diretório raiz e copiei todos os arquivos do hello world que rodamos no artigo anterior para essa placa. A ideia foi aproveitar toda a estrutura e não começar do zero.
mkdir ~/k64f_blink cd ~/k64f_blink cp -R ~/zephyr-project/samples/hello_world/microkernel/* .
mkdir ~/k64f_blink
cd ~/k64f_blink
cp -R ~/zephyr-project/samples/hello_world/microkernel/* .
Os seguintes arquivos e pastas vão ser copiados para esta pasta:
prj.mdef
outdir/
Edite o arquivo main.c da pasta para que ele imprima a palavra Hello World diversas vezes no terminal, pela uart do microcontrolador. Coloque também uma tarefa de sleep, para que o sistema operacional de tempo real não fique processsando essa tarefa sem parar e para que possamos ver os caracteres sendo impressos no terminal com uma cadência adequada. Edite o arquivo:
gedit src/main.c
void main(void) { while (1) { PRINT("Hello World \r\n"); task_sleep(100); } }
PRINT("Hello World \r\n");
Salve o arquivo. Verifique se a libncurses esta instalada em seu PC:
sudo apt-get install libncurses
Rode o comando de menuconfig:
Voce deverá ver uma tela mais ou menos como esta:
Escolha e marque as seguintes opções:
Architecture ARM Architecture ARM SoC Selection Kinetis K6x Series MCU Board Selection Freescale FRDM-K64F Kernel Type Micro Kernel Device Drivers Console Drivers Serial Drivers K20 serial driver GPIO Drivers Freescale K64-based GPIO driver Freescale K64-based GPIO Port A (GPIO_0) Freescale K64-based GPIO Port B (GPIO_1) Freescale K64-based GPIO Port C (GPIO_2) Freescale K64-based GPIO Port D (GPIO_3) Freescale K64-based GPIO Port E (GPIO_4)
ARM SoC Selection
Kinetis K6x Series MCU
K20 serial driver
Freescale K64-based GPIO driver
Freescale K64-based GPIO Port A (GPIO_0)
Freescale K64-based GPIO Port B (GPIO_1)
Freescale K64-based GPIO Port C (GPIO_2)
Freescale K64-based GPIO Port D (GPIO_3)
Freescale K64-based GPIO Port E (GPIO_4)
Para as opções a seguir, deixe todas como a default, não altere nenhuma configuração inicial.
ARM Options General Kernel Options Nanokernel Options Power Management Networking Cryptography Compile and Link Features Debugging options Logging Options System Monitoring Options Boot Options
General Kernel Options
Nanokernel Options
Compile and Link Features
Saia e Salve as configurações.
Para compilar utilize os comandos:
make clean make O=out-arm BOARD=frdm_k64f
make O=out-arm BOARD=frdm_k64f
Voce deverá ver:
thiago@Paris:~/k64f_blink$ make clean make[1]: Entering directory '/home/thiago/zephyr-project' make[2]: Entering directory '/home/thiago/k64f_blink/outdir' make[2]: Leaving directory '/home/thiago/k64f_blink/outdir' make[1]: Leaving directory '/home/thiago/zephyr-project'
thiago@Paris:~/k64f_blink$ make clean
make[1]: Entering directory '/home/thiago/zephyr-project'
make[2]: Entering directory '/home/thiago/k64f_blink/outdir'
make[2]: Leaving directory '/home/thiago/k64f_blink/outdir'
make[1]: Leaving directory '/home/thiago/zephyr-project'
thiago@Paris:~/k64f_blink$ make O=out-arm BOARD=frdm_k64f make[1]: Entering directory '/home/thiago/zephyr-project' make[2]: Entering directory '/home/thiago/k64f_blink/out-arm' Using /home/thiago/zephyr-project as source for kernel GEN ./Makefile CHK include/generated/version.h CHK misc/generated/configs.c CHK include/generated/offsets.h CHK misc/generated/sysgen/prj.mdef make[2]: Leaving directory '/home/thiago/k64f_blink/out-arm' make[1]: Leaving directory '/home/thiago/zephyr-project'
thiago@Paris:~/k64f_blink$ make O=out-arm BOARD=frdm_k64f
make[2]: Entering directory '/home/thiago/k64f_blink/out-arm'
Using /home/thiago/zephyr-project as source for kernel
make[2]: Leaving directory '/home/thiago/k64f_blink/out-arm'
Na pasta ~/k64f_blink/out-arm foi criado um arquivo zephyr.bin. Conecte a placa FRDM-K64F a uma USB do computador.
No meu PC, abriu uma janela com o endereço /media/thiago/MBED1.
Arraste o arquivo zephyr.bin para essa pasta. Após alguns segundos, o led D2 vai começar a piscar. Desconecte a placa da USB e a conecte novamente.
No meu PC obtive a seguinte mensagem:
[ 11.381819] systemd[1]: Created slice system-getty.slice. [ 2939.483804] cdc_acm 1-1:1.1: ttyACM0: USB ACM device [ 3019.208579] cdc_acm 1-1:1.1: ttyACM0: USB ACM device [ 5193.427492] cdc_acm 1-1:1.1: ttyACM0: USB ACM device
[ 11.381819] systemd[1]: Created slice system-getty.slice.
[ 2939.483804] cdc_acm 1-1:1.1: ttyACM0: USB ACM device
[ 3019.208579] cdc_acm 1-1:1.1: ttyACM0: USB ACM device
[ 5193.427492] cdc_acm 1-1:1.1: ttyACM0: USB ACM device
A placa foi montada no endereco /dev/ttyACM0.
Use algum monitor serial para ver se deu certo o print na serial utilizando a placa NXP. Para isso, uma das opções é utilizar o minicom ou o putty. Eu usei o putty. Caso não tenha o putty em sua máquina, o instale com:
Para rodar, é necessário ser root.
sudo putty
Selecione a opção Serial.
Do lado esquerdo, selecione a opção Serial.
Em Serial line, coloque o nome de sua porta USB. Veja acima que no meu PC apareceu a porta serial como ttyACM0. Então coloquei:
Serial line to connect to /dev/ttyACM0
Speed = 115200.
Volte no começo, em Session, e em saved sessions, escolha um nome, por exemplo, mbed e salve a sessão.
E então clique em open.
Você deverá conseguir ver o terminal serial sendo impresso a palavra Hello World.
Parabéns, funcionou!
Para as próximas vezes que utilizar o Putty, essa sessão já está salva e basta clicar na palavra que utilizou com o nome da sessão (no meu caso, mbed), clicar em load e clicar em open.
Gostaria de agradecer imensamente ao suporte de Felipe Neves para a construção deste post. Agradeço também a Eduardo Scherer pelo seu texto sobre a NXP FRDM-K64F que me ajudou e todas as dicas que ele me deu.
As principais referências foram mesmo o código do projeto Zephyr, o site do projeto Zephyr, o site da mbed e a lista de emails do Zephyr.