Sunday, October 12, 2014

Nuttx com OpenOCD (JTAG/SWD) na KL25Z, STM32 e Tiva/Stellaris

Debug step-by-step quase sempre é necessário ou desejável para qualquer projeto.
Com o Eclipse+CDT+GNU ARM+OpenOCD é possível fazer isso.
A ideia é executar sistema operacional de tempo real Nuttx passo a passo pelo código fonte.



Instalar o GNU ARM Eclipse

O guia oficial esta na página do projeto (http://gnuarmeclipse.livius.net/blog/)
Mas algumas coisas precisa ser modificadas para funcionar, uma delas é a conexão CMSIS-DAP com a KL25Z que precisa de uma versão recente do OpenOCD com patchs.


Instalar o hidapi

O hidapi é uma API para acessar dispositivos USB HID de forma mais fácil que o libUSB.

git clone http://github.com/signal11/hidapi.git
cd hidapi
./bootstrap
./configure
make
sudo make install

Instalar o openocd com patchs do CMSIS-DAP


git clone http://openocd.zylin.com/openocd
cd openocd
./bootstrap
./configure --enable-maintainer-mode --enable-cmsis-dap --enable-hidapi-libusb
echo '
adapter_khz 50
$_TARGETNAME configure -event gdb-attach {
    halt
}
' >> tcl/target/kl25.cfg
sudo make install

Conectar a KL25Z com o OpenSDA da MBED

Pode conectar assim:

sudo /usr/local/bin/openocd  -c "interface cmsis-dap" -f /usr/local/share/openocd/scripts/target/kl25.cfg

Ou assim:

sudo /usr/local/bin/openocd -f /usr/local/share/openocd/scripts/board/frdm-kl25z.cfg

OpenOCD conectado na KL25Z: 2 breakpoints e 2 watchpoints

Conectar a Tiva C / Stellaris

Pode conectar assim:

sudo /usr/local/bin/openocd -f /usr/local/share/openocd/scripts/board/ek-lm4f120xl.cfg

OpenOCD conectado na Tiva C: 6 breakpoints e 4 watchpoints
Conectar a STM32 VL Discovery

Primeiro é preciso desativar as tentativas de usar o stlink como USB storage, senão o stlink vai ficar resetando a porta usb infinitamente.

sudo bash -c 'echo "options usb-storage quirks=483:3744:i" > /etc/modprobe.d/stlink-v1.conf'

Pode conectar assim:
sudo /usr/local/bin/openocd -f /usr/local/share/openocd/scripts/board/stm32vldiscovery.cfg
mas houveram problemas.

UPDATE 14/outubro:
O openocd funcionou com a discovery, o problema era o usb-storage restando em loop infinito. Com o artificio de colocar o id do stlink na blacklist do usb-storage resolveu.
OpenOCD conectado na STM32 VL Discovery: 6 breakpoints e 4 watchpoints

Se ocorrer um erros de comunicação no openocd com stm32 uma contingência  é usar o st-util
Para conectar faz:
st-util -s 1 -m

st-util conectado na STM32VL Discovery e aberto para conexão do GDB na porta 4242.


Depois de colocar todas as placas com OpenOCD ou algum outro tipo de conexão com GDB server, é só rodar o binário como debug no Eclipse, basta passar a porta do GDB server. E ter compilado o binário com os flags de debug do GCC. No caso do Nuttx, é preciso configurar pelo "make menuconfig" o build com símbolos de debug.

Debug do Nuttx linha a linha do código fonte usando o OpenOCD + GDB,
primeiro tem de buildar o Nuttx com os símbolos de debug.

Para facilitar a vida é bom saber a função de cada pino pelo STM32VLDiscovery Pinout
Lembrando que troquei o STM32F100RB (16k ram 128k flash)
por um STM32F103RG (96k ram 1024k flash + outros periféricos ) 

No datasheet do STM32F103CB (20kb RAM 128 kb Flash) no AfroFlight Naze32 dá para ver até modelos de 36 pinos possuem USB. A IMU usada é o MPU6050. O Multiwii Baseflight é o software usado na Naze32, ele não utiliza um RTOS, o que tornar o código mais fácil para iniciantes, mas também perde a garantia que de o código vai executar no tempo certo.

Openpilot CC3D Flight também usa STM32F103CB (20kb RAM 128 kb Flash), junto com um MPU6050. O sistema do OpenPilot é baseado no FreeRTOS. O código tem no Github.


Um boa opção são os kits do stm32f103vet6 do aliexpress, todos periféricos estão disponíveis, o Nuttx roda macio e também pode rodar o uCLinux se colocar memória externa.

Mini stm32F103VET6 Core Board  72MHz/512KFlash/64KRAM with Battery and USB Cable
http://www.aliexpress.com/item/3pcs-lot-Mini-stm32F103VET6-Core-Board-72MHz-512KFlash-64KRAM-with-Battery-and-USB-Cable-FZ0203/1499630831.html

mini stm32f103vet6 com Nuttx rodando macio,
debug no eclipse com openocd usando SWD com o stlink v1 da stm32vldiscovery,
outra opção para debug seria uma Jlink v8 que também tem no aliexpress.