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
Conectar a Tiva C / Stellaris
Pode conectar assim:
sudo /usr/local/bin/openocd -f /usr/local/share/openocd/scripts/board/ek-lm4f120xl.cfg
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.
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
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.
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
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 |
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. |
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. |