You have a few different choices for code to run on the reference VI:

If you’re programming your custom firmware with the USB bootloader, the memory layout must be adjusted; both the official VI firmware and the blank project use a USB bootloader compatible layout by default.

For programming, you have a few options: