Skip to content
No description, website, or topics provided.
C++ C
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
Blynk Update May 25, 2019
src added stepper motor example Jul 20, 2019
toggling_gpio_pin Rename to Apr 26, 2019
part_of_MAIX_GO_schematic.png updated Mar 12, 2019

This is a repository with some 'stuff' I created while playing with the Sipeed MAIX GO board. That board features a Kendryte K210 processor. I use the kendryte-standalone-sdk and kendryte-toolchain for this work, and often base it on examples in kendryte-standalone-demo.

The 'stuff' is:

  • blink_and_three_way_button: shows the on-board LED changing color and it prints the status of the three-way button.This is done on two separate cores.
  • fft: shows the fft of the on-board microphone signal with tickmarks at 1kHz ... 8kHz.
  • LCD: allowes for using the Adafruit GFX with the LCD screen.
  • lights_on_mic_array: Controls the LEDs on the microphone array via toggling the pins.
  • lights_on_mic_array_SPI: Controls the LEDs on the microphone array via SPI.
  • mics_and_lights_on_array: Reads the microphone signals of the array and indicates the direction of the sound (more or less, not using APU or FFT!)
  • only_circular_mics_on_array: Only use the 6 circularly placed mics on the array.
  • pcm_play_happy: generates pcm sound (poorly).
  • camera_lcd: demo that shows the ov2640 camera on the LCD screen.
  • binocular_camera_lcd: demo for the binocular camera module.
  • touchscreen: simple demo for the LCD touchscreen.
  • accelerometer: reads the x, y and z acceleration of the MSA300 accelerometer
  • pwm: correct an error in the kendryte document
  • VGA
    • VGA 480 lines 640 pixels 1 bit data
    • VGA 480 lines 640 pixels 7 bit data: RGB232
    • VGA 768 lines 1024 pixels 7 bit data: RGB232
    • Calculate PLL0 and SPI0 clock settings
    • transform an image into RGB232
  • measuring_pwm_and_pulses: measure the period, pulse width and duty cycle of pwm signals, it can also measure the width of occasional pulses
  • stepper motor driver using DRV8825

The kendryte demos are (probably) for their KD233 board. There are some differences between that board and the Sipeed MAIX GO but often the main difference is the assignment of functions to pins. For example, assigning the microphone outputs to a pin in the kendryte demos looks like this:

  // the four I2S channels for I2S device 0
  fpioa_set_function(42, FUNC_I2S0_IN_D0);
  fpioa_set_function(43, FUNC_I2S0_IN_D1);
  fpioa_set_function(44, FUNC_I2S0_IN_D2);
  fpioa_set_function(45, FUNC_I2S0_IN_D3);
  // the left/right clock
  fpioa_set_function(46, FUNC_I2S0_WS);
  // the data clock
  fpioa_set_function(39, FUNC_I2S0_SCLK);

While for the MAIX GO it looks like this:

  // the four I2S channels for I2S device 0
  fpioa_set_function(20, FUNC_I2S0_IN_D0);
  fpioa_set_function(21, FUNC_I2S0_IN_D1);
  fpioa_set_function(22, FUNC_I2S0_IN_D2);
  fpioa_set_function(23, FUNC_I2S0_IN_D3);
  // the left/right clock
  fpioa_set_function(19, FUNC_I2S0_WS);
  // the data clock
  fpioa_set_function(18, FUNC_I2S0_SCLK);

You can find the correct pin numbers by looking at examples, making educated guesses, and looking at the schematic of the MAIX GO. For example, for the microphone array:


Note that to get this compiled the -fpermissive compiler flag needs to be set. In the file kendryte-standalone-sdk/cmake/compile-flags.cmake this flag can be added to add_compile_flags:

add_compile_flags(CXX -std=gnu++17 -fpermissive)

At first I used the pre-compiled toolchain from the Kendryte website, but then (25-3-2019) switched to the versions on github kendryte-gnu-toolchain. This caused two additional problems. There was an "undefined reference to `vtable for __cxxabiv1::__si_class_type_info" error, which was solved by adding yet another compile flag:

add_compile_flags(CXX -std=gnu++17 -fpermissive -fno-rtti)

There is also a linker error "undefined reference to `__cxa_pure_virtual'" for some of the files. The root cause probably has something to do with the Arduino origin of those files. This was solved by adding the following at the start of the problematic files:

extern "C" void __cxa_pure_virtual() { while (1); }
You can’t perform that action at this time.