Quick Startup
Setup Tools and Environment
To start to use HummingBird SDK, you need to install the following tools:
For Windows users, please check Install and Setup Tools in Windows
For Linux users, please check Install and Setup Tools in Linux
Install and Setup Tools in Windows
Make sure you are using at least Windows 7, and then you can follow the following steps to download and install tools for you.
Create an
Nuclei
folder in your Windows Environment, such asD:\Software\Nuclei
Download the following tools from Nuclei Download Center, please check and follow the figure Nuclei Tools need to be downloaded for Windows.
Nuclei RISC-V GNU Toolchain for Windows, see number 1 in the figure Nuclei Tools need to be downloaded for Windows
Nuclei OpenOCD for Windows, see number 2 in the figure Nuclei Tools need to be downloaded for Windows
Windows Build Tools, see number 3 in the figure Nuclei Tools need to be downloaded for Windows

Nuclei Tools need to be downloaded for Windows
Setup tools in previously created
Nuclei
folder, creategcc
,openocd
andbuild-tools
folders.- Nuclei RISC-V GNU Toolchain for Windows
Extract the download gnu toolchain into a temp folder, and copy the files into
gcc
folder, make sure thegcc
directory structure looks like this figure Nuclei RISC-V GCC Toolchain directory structure of gccNuclei RISC-V GCC Toolchain directory structure of gcc
- Nuclei OpenOCD for Windows
Extract the download openocd tool into a temp folder, and copy the files into
openocd
folder, make sure theopenocd
directory structure looks like this figure Nuclei OpenOCD directory structure of openocdNuclei OpenOCD directory structure of openocd
- Windows Build Tools
Extract the download build-tools tool into a temp folder, and copy the files into
build-tools
folder, make sure thebuild-tools
directory structure looks like this figure Nuclei Windows Build Tools directory structure of build-toolsNuclei Windows Build Tools directory structure of build-tools
Install and Setup Tools in Linux
Make sure you are using Centos or Ubuntu 64 bit, and then you can follow the following steps to download and install tools for you.
Create an
Nuclei
folder in your Linux Environment, such as~/Software/Nuclei
Download the following tools from Nuclei Download Center, please check and follow the figure Nuclei Tools need to be downloaded for Linux.
Nuclei RISC-V GNU Toolchain for Linux, for CentOS or Ubuntu < 18.04 click number 1-1, for Ubuntu >=18.04 click number 1-2 in the figure Nuclei Tools need to be downloaded for Linux
Nuclei OpenOCD for Linux, see number 2-1 for 64bit version in the figure Nuclei Tools need to be downloaded for Linux
Make >= 3.82: Install
Make
usingsudo apt-get install make
in Ubuntu, orsudo yum install make
in CentOS.

Nuclei Tools need to be downloaded for Linux
Setup tools in previously created
Nuclei
folder, creategcc
andopenocd
folders. Please follow similar steps described in Step 3 in Install and Setup Tools in Windows to extract and copy necessary files.Note
Only
gcc
andopenocd
are required for Linux.Extract the downloaded Linux tools, not the windows version.
Get and Setup HummingBird SDK
The source code of HummingBird SDK is maintained in Github and Gitee.
We mainly maintained github version, and gitee version is mirrored, just for fast access in China.
Check source code in HummingBird SDK in Github.
Stable version of HummingBird SDK is maintained in master version, if you want release version of HummingBird SDK, please check in HummingBird SDK Release in Github.
Here are the steps to clone the latest source code from Github:
Make sure you have installed Git tool, see https://git-scm.com/download/
Then open your terminal, and make sure git command can be accessed
Run
git clone https://github.com/riscv-mcu/hbird-sdk hbird-sdk
to clone source code intohbird-sdk
folderNote
If you have no internet access, you can also use pre-downloaded
hbird-sdk
code, and use it.If the backup repo is not up to date, you can import github repo in gitee by yourself, see https://gitee.com/projects/import/url
Create tool environment config file for HummingBird SDK
- Windows
Create
setup_config.bat
inhbird-sdk
folder, and open this file your editor, and paste the following content, assuming you followed Install and Setup Tools in Windows and install tools intoD:\Software\Nuclei
, otherwise please use your correct tool root path.set NUCLEI_TOOL_ROOT=D:\Software\Nuclei
- Linux
Create
setup_config.sh
inhbird-sdk
folder, and open this file your editor, and paste the following content, assuming you followed Install and Setup Tools in Linux and install tools into~/Software/Nuclei
, otherwise please use your correct tool root path.NUCLEI_TOOL_ROOT=~/Software/Nuclei
Build, Run and Debug Sample Application
Assume you have followed steps in Get and Setup HummingBird SDK to clone
source code and create setup_config.bat
and setup_config.sh
.
To build, run and debug application, you need to open command terminal in hbird-sdk
folder.
For Windows users, you can open windows command terminal and cd to
hbird-sdk
folder, then run the following commands to setup build environment for HummingBird SDK, the output will be similar as this screenshot Setup Build Environment for HummingBird SDK in Windows Command Line:1setup.bat 2echo %PATH% 3where riscv-nuclei-elf-gcc openocd make rm 4make help
Setup Build Environment for HummingBird SDK in Windows Command Line
For Linux users, you can open Linux bash terminal and cd to
hbird-sdk
folder, then run the following commands to setup build environment for HummingBird SDK, the output will be similar as this screenshot Setup Build Environment for HummingBird SDK in Linux Bash:1source setup.sh 2echo $PATH 3which riscv-nuclei-elf-gcc openocd make rm 4make help
Setup Build Environment for HummingBird SDK in Linux Bash
Note
Only first line
setup.bat
orsource setup.sh
are required before build, run or debug application. Thesetup.bat
andsetup.sh
are just used to append Nuclei RISC-V GCC Toolchain, OpenOCD and Build-Tools binary paths into environment variable PATHline 2-4 are just used to check whether build environment is setup correctly, especially the PATH of Nuclei Tools are setup correctly, so we can use the
riscv-nuclei-elf-xxx
,openocd
,make
andrm
toolsIf you know how to append Nuclei RISC-V GCC Toolchain, OpenOCD and Build-Tools binary paths to PATH variable in your OS environment, you can also put the downloaded Nuclei Tools as you like, and no need to run
setup.bat
orsource setup.sh
Here for a quick startup, this guide will take board HummingBird Evaluation Kit for example to demostrate how to setup hardware, build run and debug application in Windows.
The demo application, we will take application/baremetal/helloworld
for example.
First of all, please reuse previously setuped build environment command terminal.
Run cd application/baremetal/helloworld
to cd the helloworld
example folder.
Hardware Preparation
Please check Board and find your board’s page, and follow Setup section to setup your hardware, mainly JTAG debugger driver setup and on-board connection setup.
Power on the HummingBird board, and use Micro-USB data cable to connect the board and your PC, make sure you have setup the JTAG driver correctly, and you can see JTAG port and serial port.
Open a UART terminal tool such as TeraTerm in Windows or Minicom in Linux, and minitor the serial port of the Board, the UART baudrate is 115200 bps
Build Application
We need to build application for this board HummingBird Evaluation Kit using this command line:
make SOC=hbird BOARD=hbird_eval CORE=e203 all
Here is the sample output of this command:
Current Configuration: RISCV_ARCH=rv32imac RISCV_ABI=ilp32 SOC=hbird BOARD=hbird_eval CORE=e203 DOWNLOAD=ilm
Assembling : ../../../SoC/hbird/Common/Source/GCC/intexc_hbird.S
Assembling : ../../../SoC/hbird/Common/Source/GCC/startup_hbird.S
Compiling : ../../../SoC/hbird/Common/Source/Drivers/hbird_gpio.c
Compiling : ../../../SoC/hbird/Common/Source/Drivers/hbird_uart.c
Compiling : ../../../SoC/hbird/Common/Source/Stubs/close.c
Compiling : ../../../SoC/hbird/Common/Source/Stubs/fstat.c
Compiling : ../../../SoC/hbird/Common/Source/Stubs/gettimeofday.c
Compiling : ../../../SoC/hbird/Common/Source/Stubs/isatty.c
Compiling : ../../../SoC/hbird/Common/Source/Stubs/lseek.c
Compiling : ../../../SoC/hbird/Common/Source/Stubs/read.c
Compiling : ../../../SoC/hbird/Common/Source/Stubs/sbrk.c
Compiling : ../../../SoC/hbird/Common/Source/Stubs/write.c
Compiling : ../../../SoC/hbird/Common/Source/hbird_common.c
Compiling : ../../../SoC/hbird/Common/Source/system_hbird.c
Compiling : hello_world.c
Linking : hello_world.elf
text data bss dec hex filename
7944 112 2440 10496 2900 hello_world.elf
As you can see, that when the application is built successfully, the elf will be generated
and will also print the size information of the hello_world.elf
.
Note
In order to make sure that there is no application build before, you can run
make SOC=hbird BOARD=hbird_eval CORE=e203 clean
to clean previously built objects and build dependency files.About the make variable or option(SOC, BOARD) passed to make command, please refer to Build System based on Makefile.
Run Application
If the application is built successfully for this board HummingBird Evaluation Kit, then you can run it using this command line:
make SOC=hbird BOARD=hbird_eval CORE=e203 upload
Here is the sample output of this command:
"Download and run hello_world.elf"
riscv-nuclei-elf-gdb hello_world.elf -ex "set remotetimeout 240" \
-ex "target remote | openocd --pipe -f ../../../SoC/hbird/Board/hbi
--batch -ex "monitor reset halt" -ex "monitor halt" -ex "monitor fl
resume" -ex "monitor shutdown" -ex "quit"
D:\Nuclei\gcc\bin\riscv-nuclei-elf-gdb.exe: warning: Couldn't determine a p
Nuclei OpenOCD, 64-bit Open On-Chip Debugger 0.10.0+dev-00014-g0eae03214 (2
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
system_default_interrupt_handler (mcause=3735928559, sp=<optimized out>) at88
188 printf("MTVAL : 0x%lx\r\n", __RV_CSR_READ(CSR_MBADADDR));
JTAG tap: riscv.cpu tap/device found: 0x1e200a6d (mfg: 0x536 (Nuclei System
halted at 0x8000050c due to debug interrupt
cleared protection for sectors 0 through 63 on flash bank 0
Loading section .init, size 0xc4 lma 0x80000000
Loading section .text, size 0x1c6e lma 0x80000100
Loading section .rodata, size 0x1ec lma 0x80001d70
Loading section .data, size 0x70 lma 0x80001f5c
Start address 0x80000000, load size 8078
Transfer rate: 45 KB/sec, 2019 bytes/write.
halted at 0x80000004 due to step
shutdown command invoked
A debugging session is active.
Inferior 1 [Remote target] will be detached.
Quit anyway? (y or n) [answered Y; input not from terminal]
[Inferior 1 (Remote target) detached]
As you can see the application is uploaded successfully using openocd
and gdb
,
then you can check the output in your UART terminal, see HummingBird SDK Hello World Application UART Output.

HummingBird SDK Hello World Application UART Output
Debug Application
If the application is built successfully for this board HummingBird Evaluation Kit, then you can debug it using this command line:
make SOC=hbird BOARD=hbird_eval CORE=e203 debug
The program is not loaded automatically when you enter to debug state, just in case you want to debug the program running on the board.
"Download and debug hello_world.elf" riscv-nuclei-elf-gdb hello_world.elf -ex "set remotetimeout 240" \ -ex "target remote | openocd --pipe -f ../../../SoC/hbird/Board/hbi D:\Nuclei\gcc\bin\riscv-nuclei-elf-gdb.exe: warning: Couldn't determine a p GNU gdb (GDB) 8.3.0.20190516-git Copyright (C) 2019 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.htm This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "--host=i686-w64-mingw32 --target=riscv-nuclei-e Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... --Type <RET> for more, q to quit, c to continue without paging-- Reading symbols from hello_world.elf... Remote debugging using | openocd --pipe -f ../../../SoC/hbird/Board/hbird_e Nuclei OpenOCD, 64-bit Open On-Chip Debugger 0.10.0+dev-00014-g0eae03214 (2 Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html system_default_interrupt_handler (mcause=3735928559, sp=<optimized out>) at ../../../SoC/hbird/Common/Source/system_hbird.c:188 188 printf("MTVAL : 0x%lx\r\n", __RV_CSR_READ(CSR_MBADADDR));
If you want to load the built application, you can type
load
to load the application.(gdb) load Loading section .init, size 0x266 lma 0x8000000 Loading section .text, size 0x2e9c lma 0x8000280 Loading section .rodata, size 0x1f0 lma 0x8003120 Loading section .data, size 0x70 lma 0x8003310 Start address 0x800015c, load size 13154 Transfer rate: 7 KB/sec, 3288 bytes/write.
If you want to set a breakpoint at main, then you can type
b main
to set a breakpoint.(gdb) b main Breakpoint 1 at 0x8001b04: file hello_world.c, line 85.
If you want to set more breakpoints, you can do as you like.
Then you can type
c
, then the program will stop at main(gdb) c Continuing. Note: automatically using hardware breakpoints for read-only addresses. Breakpoint 1, main () at hello_world.c:85 85 srand(__get_rv_cycle() | __get_rv_instret() | __RV_CSR_READ(CSR_MCYCLE));
Then you can step it using
n
(short of next) ors
(short of step)(gdb) n 86 uint32_t rval = rand(); (gdb) n 87 rv_csr_t misa = __RV_CSR_READ(CSR_MISA); (gdb) s 89 printf("MISA: 0x%lx\r\n", misa); (gdb) n 90 print_misa(); (gdb) n 92 printf("Hello World!\r\n"); (gdb) n 93 printf("Hello World!\r\n");
If you want to quit debugging, then you can press
CTRL - c
, and typeq
to quit debugging.(gdb) Quit (gdb) q A debugging session is active. Inferior 1 [Remote target] will be detached. Quit anyway? (y or n) y Detaching from program: D:\workspace\Sourcecode\hbird-sdk\application\baremetal\helloworld\hello_world.elf, Remote target Ending remote debugging. [Inferior 1 (Remote target) detached]
Note
More about how to debug using gdb, you can refer to the GDB User Manual.
If you want to debug using Nuclei Studio, you can open Nuclei Studio, and create a debug configuration, and choose the application elf, and download and debug in IDE.
Create helloworld Application
If you want to create your own helloworld
application, it is also very easy.
There are several ways to achieve it, see as below:
Method 1: You can find a most similar sample application folder and copy it, such as
application/baremetal/helloworld
, you can copy and rename it asapplication/baremetal/hello
Open the
Makefile
inapplication/baremetal/hello
Change
TARGET = hello_world
toTARGET = hello
Open the
hello_world.c
inapplication/baremetal/hello
, and replace the content using code below:1// See LICENSE for license details. 2#include <stdio.h> 3#include <time.h> 4#include <stdlib.h> 5#include "hbird_sdk_soc.h" 6 7int main(void) 8{ 9 printf("Hello World from HummingBird RISC-V Processor!\r\n"); 10 return 0; 11}
Save all the changes, and then you can follow the steps described in Build, Run and Debug Sample Application to run or debug this new application.
Method 2: You can also do it from scratch, with just create simple
Makefile
andmain.c
Create new folder named
hello
inapplication/baremetal
Create two files named
Makefile
andmain.c
Open
Makefile
and edit the content as below:1TARGET = hello 2 3HBIRD_SDK_ROOT = ../../.. 4 5SRCDIRS = . 6 7INCDIRS = . 8 9include $(HBIRD_SDK_ROOT)/Build/Makefile.base
Open
main.c
and edit the content as below:1// See LICENSE for license details. 2#include <stdio.h> 3#include <time.h> 4#include <stdlib.h> 5#include "hbird_sdk_soc.h" 6 7int main(void) 8{ 9 printf("Hello World from HummingBird RISC-V Processor!\r\n"); 10 return 0; 11}
Save all the changes, and then you can follow the steps described in Build, Run and Debug Sample Application to run or debug this new application.
Note
Please refer to Application Development and Build System based on Makefile for more information.
If you want to access SoC related APIs, please use
hbird_sdk_soc.h
header file.If you want to access SoC and board related APIs, please use
hbird_sdk_hal.h
header file.For simplified application development, you can use
hbird_sdk_hal.h
directly.
Advanced Usage
For more advanced usage, please follow the items as below:
Click Design and Architecture to learn about HummingBird SDK Design and Architecture, Board and SoC support documentation.
Click Developer Guide to learn about HummingBird SDK Build System and Application Development.
Click Application to learn about each application usage and expected output.
Note
If you met some issues in using this guide, please check FAQ, if still not solved, please Submit your issue.
If you want to develop HummingBird SDK application in Nuclei Studio, you can also easily integrate the source code with it.
Add required source code folders, and header file folders in IDE
Check the compiler and linker options using extra V=1 passed with make, and adapt the options in IDE
Add extra macros definition and include folders in project configurations
Build and debug project in IDE