FRDM-KL25Z e Arm Mbed Studio

Conteúdo

Projeto

O projeto desenvolvido aqui é uma comunicação entre duas placas ARM usando módulos NRF24L01+.

Podem ser usadas quaisquer placas, nesse caso usei a FRDM-KL25Z e a NUCLEO-F411RE.

montagem-projeto

Montagem das placas de desenvolvimento com o módulo NRF24L01+ no software Fritzing

Arm Mbed Studio (MS)

Arm Mbed Studio's documentation

Placas disponíveis

Existem centenas de placas compatíveis com o MS, e podem ser vistas aqui.

Eu escolhi usar a FRDM-KL25Z, mas o desenvolvimento pode ser replicado para outras placas. É possível utilizar o MS para um projeto próprio, sem utilizar os kits de desenvolvimento.

Mbed OS 5/6

Documentation for OS 6 API Reference

FRDM KL25Z

pinout-frdm

Atualização do firmware

Para que a placa seja identificada pelo MS, é preciso que o firmware de bootloader seja atualizado.

Atualizando pelo link no site do mbed o MS indicava um erro de "firmware desatualizado". Mas parece que funciona

OpenSDA

SDA é uma sigla para Serial and Debug Adapter

OpenSDA trata-se de um conjunto de hardware e firmware da NXP que serve como auxiliar para o desenvolvimento em um microcontrolador alvo, presente em kits de desenvolvimento e gravadores com microcontroladores da ARM.

O bootloader, rodando no microcontrolador auxiliar, serve como interface entre o computador e o microcontroaldor principal. Adapta o protocolo USB, usado para programar ou debugar o microcontrolador principal, e para estabelecer uma comunicação Serial (escrita e leitura). Além disso, ele cria um diretório virtual, facilitando o processo de gravação (flash).

Block Diagram

O diagrama de blocos dessa interface

A versão mais recente desse bootloader, DAPLink, equivale a versão OpenSDAv2.2. A versão default (V1) é a P&EMicro.

comparision table
Tabela comparativa entre as versões do OpenSDA

How to

Depois de ler algumas coisas na documentação do Zephyr, atualizei para a versão mais recente do OpenSDA DAPLink Firmware, cujo arquivo pode ser baixado diretamente aqui.

O binário para voltar a versão do firmware OpenSDA PEMicro pode ser baixado aqui.

O processo de atualização do firmware da placa é o mesmo para todos os firmwares.

  1. Modo Bootloader
  2. A placa deve estar no modo bootloader, para isso basta ligar a placa enquanto segura o botão de reset. Ao soltar, o windows deve identificar a placa como BOOTLOADER.

    BOOTLOADER (D:)
  3. Carregar o firmware
  4. Arrastar o arquivo .bin/.hex ou salvá-lo diretamente em BOOTLOADER.

  5. Desligar e ligar a placa normalmente
  6. O windows deve identicar a placa como DAPLINK, para o caso do OpenSDA DAPLink Firmware

    DAPLINK (D:)

    E como FRDM-KL25Z, no caso do PEMicro

Problemas

Rodando o DAPLink, o compilador online da mbed funcionou sem problemas, mas o CodeWarrior não.

Dentro das configurações de Debug do CodeWarrior há apenas as opções: J-Link, P&E ARM e GDI generic, e por isso o software não consegue identificar automatiamente a placa pela USB.

Uma terceira opção é usar o J-Link OpenSDA da SEGGER. Não testado!

Desenvolvimento

Hardware

conexão montagem 1 montagem 2

Firmware

O projeto que escolhi como base foi o exemplo mbed-os-example-blinky-baremetal

File > New Program...

Library nRF24L01+

Importei a biblioteca nRF24L01P by Owen Edwards para o Mbed Studio

File > Add Library to Active Program...

O Hello World dessa biblioteca usa uma versão descontinuada do MbedOS (OS 2), e por isso não é compatível com o MS, só com online e o CLI.

Ao importar o exemplo ao Mbed Studio, através de File > Import Program..., há um aviso de que o projeto precisa ser migrado para os OS 5 ou 6.

Achei mais simples escrever as mudanças no projeto usando OS 6 do que adatptar o Hello World.

New Example (using OS 6.2)

Definição dos pinos a serem usados para se comunicar com o módulo. As possíveis nomenclaturas podem ser vistas em PinNames.h (escolher a placa target antes).

    /*** Pins definitions***/
    #define 	MOSI	PTD2
    #define 	MISO	PTD3
    #define 	SCK	PTC5
    #define 	CS		PTD0
    #define 	CE		PTD5
    #define 	IRQ		PTA13
    
    /** Module Instance **/
    nRF24L01P my_nrf24l01p(MOSI, MISO, SCK, CS, CE, IRQ);
                

Serial

A antiga API de serial está descontinuada, e para adaptar temos 3 opções:

Assim, o printf pode ser usado diretamente, sem prefixo.

Para adaptar os demais comandos via UART que são usados para a comunicação, escolhi usar a API Buferred Serial

Criamos um objeto

 static BufferedSerial pc(USBTX, USBRX, 9600);
e assim as adaptações ficam:

pc.readable()
pc.readable()
txData[txDataCnt++] = getc();
pc.read(txData,TRANSFER_SIZE); txDataCnt++;
pc.putc(rxData[i]);
printf("%c",rxData[i]);