commit
83b85bf4a1
|
@ -3,3 +3,8 @@
|
||||||
.pioenvs/
|
.pioenvs/
|
||||||
.vscode/
|
.vscode/
|
||||||
01_Matlab/slprj/
|
01_Matlab/slprj/
|
||||||
|
MDK-ARM/DebugConfig/
|
||||||
|
MDK-ARM/Listing/
|
||||||
|
MDK-ARM/Objects/
|
||||||
|
MDK-ARM/RTE/
|
||||||
|
MDK-ARM/*.uvguix.*
|
Binary file not shown.
|
@ -19,10 +19,15 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
// Define to prevent recursive inclusion
|
||||||
|
#ifndef COMMS_H
|
||||||
|
#define COMMS_H
|
||||||
|
|
||||||
#include "stm32f1xx_hal.h"
|
#include "stm32f1xx_hal.h"
|
||||||
|
|
||||||
void setScopeChannel(uint8_t ch, int16_t val);
|
void setScopeChannel(uint8_t ch, int16_t val);
|
||||||
void consoleScope(void);
|
void consoleScope(void);
|
||||||
void consoleLog(char *message);
|
void consoleLog(char *message);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
78
Inc/config.h
78
Inc/config.h
|
@ -1,11 +1,14 @@
|
||||||
#pragma once
|
// Define to prevent recursive inclusion
|
||||||
|
#ifndef CONFIG_H
|
||||||
|
#define CONFIG_H
|
||||||
|
|
||||||
#include "stm32f1xx_hal.h"
|
#include "stm32f1xx_hal.h"
|
||||||
|
|
||||||
// ############################### GENERAL SETTINGS ###############################
|
// ############################### VARIANT SELECTION ###############################
|
||||||
// For variant selection, check platformio.ini
|
// PlatformIO: uncomment desired variant in platformio.ini
|
||||||
// or define the desired build variant here if you want to use make in console
|
// Keil uVision: select desired variant from the Target drop down menu (to the right of the Load button)
|
||||||
// or use VARIANT environment variable for example like "make -e VARIANT=VARIANT_NUNCHUK"
|
// Ubuntu: define the desired build variant here if you want to use make in console
|
||||||
// Only one at a time, choose wisely ;-)
|
// or use VARIANT environment variable for example like "make -e VARIANT=VARIANT_NUNCHUK". Select only one at a time.
|
||||||
#if !defined(PLATFORMIO)
|
#if !defined(PLATFORMIO)
|
||||||
//#define VARIANT_ADC // Variant for control via ADC input
|
//#define VARIANT_ADC // Variant for control via ADC input
|
||||||
//#define VARIANT_USART // Variant for Serial control via USART3 input
|
//#define VARIANT_USART // Variant for Serial control via USART3 input
|
||||||
|
@ -13,12 +16,10 @@
|
||||||
//#define VARIANT_PPM // Variant for RC-Remote with PPM-Sum Signal
|
//#define VARIANT_PPM // Variant for RC-Remote with PPM-Sum Signal
|
||||||
//#define VARIANT_IBUS // Variant for RC-Remotes with FLYSKY IBUS
|
//#define VARIANT_IBUS // Variant for RC-Remotes with FLYSKY IBUS
|
||||||
//#define VARIANT_HOVERCAR // Variant for HOVERCAR build
|
//#define VARIANT_HOVERCAR // Variant for HOVERCAR build
|
||||||
|
//#define VARIANT_HOVERBOARD // Variant for HOVERBOARD build
|
||||||
//#define VARIANT_TRANSPOTTER // Variant for TRANSPOTTER build https://github.com/NiklasFauth/hoverboard-firmware-hack/wiki/Build-Instruction:-TranspOtter https://hackaday.io/project/161891-transpotter-ng
|
//#define VARIANT_TRANSPOTTER // Variant for TRANSPOTTER build https://github.com/NiklasFauth/hoverboard-firmware-hack/wiki/Build-Instruction:-TranspOtter https://hackaday.io/project/161891-transpotter-ng
|
||||||
#endif
|
#endif
|
||||||
|
// ########################### END OF VARIANT SELECTION ############################
|
||||||
#define INACTIVITY_TIMEOUT 8 // Minutes of not driving until poweroff. it is not very precise.
|
|
||||||
#define BEEPS_BACKWARD 1 // 0 or 1
|
|
||||||
// ########################### END OF GENERAL SETTINGS ############################
|
|
||||||
|
|
||||||
|
|
||||||
// ############################### DO-NOT-TOUCH SETTINGS ###############################
|
// ############################### DO-NOT-TOUCH SETTINGS ###############################
|
||||||
|
@ -147,6 +148,26 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ############################## DEFAULT SETTINGS ############################
|
||||||
|
// Default settings will be applied at the end of this config file if not set before
|
||||||
|
#define INACTIVITY_TIMEOUT 8 // Minutes of not driving until poweroff. it is not very precise.
|
||||||
|
#define BEEPS_BACKWARD 1 // 0 or 1
|
||||||
|
// #define SUPPORT_BUTTONS // Define for buttons support on ADC, Nunchuck
|
||||||
|
|
||||||
|
/* FILTER is in fixdt(0,16,16): VAL_fixedPoint = VAL_floatingPoint * 2^16. In this case 6553 = 0.1 * 2^16
|
||||||
|
* Value of COEFFICIENT is in fixdt(1,16,14)
|
||||||
|
* If VAL_floatingPoint >= 0, VAL_fixedPoint = VAL_floatingPoint * 2^14
|
||||||
|
* If VAL_floatingPoint < 0, VAL_fixedPoint = 2^16 + floor(VAL_floatingPoint * 2^14).
|
||||||
|
*/
|
||||||
|
// Value of RATE is in fixdt(1,16,4): VAL_fixedPoint = VAL_floatingPoint * 2^4. In this case 480 = 30 * 2^4
|
||||||
|
#define DEFAULT_RATE 480 // 30.0f [-] lower value == slower rate [0, 32767] = [0.0, 2047.9375]. Do NOT make rate negative (>32767)
|
||||||
|
#define DEFAULT_FILTER 6553 // Default for FILTER 0.1f [-] lower value == softer filter [0, 65535] = [0.0 - 1.0].
|
||||||
|
#define DEFAULT_SPEED_COEFFICIENT 16384 // Default for SPEED_COEFFICIENT 1.0f [-] higher value == stronger. [0, 65535] = [-2.0 - 2.0]. In this case 16384 = 1.0 * 2^14
|
||||||
|
#define DEFAULT_STEER_COEFFICIENT 8192 // Defualt for STEER_COEFFICIENT 0.5f [-] higher value == stronger. [0, 65535] = [-2.0 - 2.0]. In this case 8192 = 0.5 * 2^14. If you do not want any steering, set it to 0.
|
||||||
|
// ######################### END OF DEFAULT SETTINGS ##########################
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ############################### DEBUG SERIAL ###############################
|
// ############################### DEBUG SERIAL ###############################
|
||||||
/* Connect GND and RX of a 3.3v uart-usb adapter to the left (USART2) or right sensor board cable (USART3)
|
/* Connect GND and RX of a 3.3v uart-usb adapter to the left (USART2) or right sensor board cable (USART3)
|
||||||
* Be careful not to use the red wire of the cable. 15v will destroye evrything.
|
* Be careful not to use the red wire of the cable. 15v will destroye evrything.
|
||||||
|
@ -176,7 +197,7 @@
|
||||||
|
|
||||||
#ifndef VARIANT_TRANSPOTTER
|
#ifndef VARIANT_TRANSPOTTER
|
||||||
//#define DEBUG_SERIAL_SERVOTERM
|
//#define DEBUG_SERIAL_SERVOTERM
|
||||||
//#define DEBUG_SERIAL_ASCII
|
#define DEBUG_SERIAL_ASCII
|
||||||
#endif
|
#endif
|
||||||
// ########################### END OF DEBUG SERIAL ############################
|
// ########################### END OF DEBUG SERIAL ############################
|
||||||
|
|
||||||
|
@ -188,22 +209,6 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ############################## VARIANT DEFAULT SETTINGS ############################
|
|
||||||
/* Default settings will be applied at the end of this config file if not set before
|
|
||||||
* FILTER is in fixdt(0,16,16): VAL_fixedPoint = VAL_floatingPoint * 2^16. In this case 6553 = 0.1 * 2^16
|
|
||||||
* Value of COEFFICIENT is in fixdt(1,16,14)
|
|
||||||
* If VAL_floatingPoint >= 0, VAL_fixedPoint = VAL_floatingPoint * 2^14
|
|
||||||
* If VAL_floatingPoint < 0, VAL_fixedPoint = 2^16 + floor(VAL_floatingPoint * 2^14).
|
|
||||||
*/
|
|
||||||
// Value of RATE is in fixdt(1,16,4): VAL_fixedPoint = VAL_floatingPoint * 2^4. In this case 480 = 30 * 2^4
|
|
||||||
#define DEFAULT_RATE 480 // 30.0f [-] lower value == slower rate [0, 32767] = [0.0, 2047.9375]. Do NOT make rate negative (>32767)
|
|
||||||
#define DEFAULT_FILTER 6553 // Default for FILTER 0.1f [-] lower value == softer filter [0, 65535] = [0.0 - 1.0].
|
|
||||||
#define DEFAULT_SPEED_COEFFICIENT 16384 // Default for SPEED_COEFFICIENT 1.0f [-] higher value == stronger. [0, 65535] = [-2.0 - 2.0]. In this case 16384 = 1.0 * 2^14
|
|
||||||
#define DEFAULT_STEER_COEFFICIENT 8192 // Defualt for STEER_COEFFICIENT 0.5f [-] higher value == stronger. [0, 65535] = [-2.0 - 2.0]. In this case 8192 = 0.5 * 2^14. If you do not want any steering, set it to 0.
|
|
||||||
// ######################### END OF VARIANT DEFAULT SETTINGS ##########################
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ################################# VARIANT_ADC SETTINGS ############################
|
// ################################# VARIANT_ADC SETTINGS ############################
|
||||||
#ifdef VARIANT_ADC
|
#ifdef VARIANT_ADC
|
||||||
/* CONTROL VIA TWO POTENTIOMETERS
|
/* CONTROL VIA TWO POTENTIOMETERS
|
||||||
|
@ -317,12 +322,24 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ############################ VARIANT_HOVERBOARD SETTINGS ############################
|
||||||
|
// ##### ! NOT IMPLEMENTED YET ! #####
|
||||||
|
#ifdef VARIANT_HOVERBOARD
|
||||||
|
// #define CONTROL_SERIAL_USART2 // left sensor board cable, disable if ADC or PPM is used! For Arduino control check the hoverSerial.ino
|
||||||
|
// #define FEEDBACK_SERIAL_USART2 // left sensor board cable, disable if ADC or PPM is used!
|
||||||
|
#define CONTROL_SERIAL_USART3 // right sensor board cable, disable if I2C (nunchuk or lcd) is used! For Arduino control check the hoverSerial.ino
|
||||||
|
#define FEEDBACK_SERIAL_USART3 // right sensor board cable, disable if I2C (nunchuk or lcd) is used!
|
||||||
|
#endif
|
||||||
|
// ######################## END OF VARIANT_HOVERBOARD SETTINGS #########################
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ################################# VARIANT_TRANSPOTTER SETTINGS ############################
|
// ################################# VARIANT_TRANSPOTTER SETTINGS ############################
|
||||||
//TODO ADD VALIDATION
|
//TODO ADD VALIDATION
|
||||||
#ifdef VARIANT_TRANSPOTTER
|
#ifdef VARIANT_TRANSPOTTER
|
||||||
#define CONTROL_GAMETRAK
|
#define CONTROL_GAMETRAK
|
||||||
#define SUPPORT_LCD
|
#define SUPPORT_LCD
|
||||||
#define SUPPORT_NUNCHUK
|
// #define SUPPORT_NUNCHUK
|
||||||
#define GAMETRAK_CONNECTION_NORMAL // for normal wiring according to the wiki instructions
|
#define GAMETRAK_CONNECTION_NORMAL // for normal wiring according to the wiki instructions
|
||||||
//#define GAMETRAK_CONNECTION_ALTERNATE // use this define instead if you messed up the gametrak ADC wiring (steering is speed, and length of the wire is steering)
|
//#define GAMETRAK_CONNECTION_ALTERNATE // use this define instead if you messed up the gametrak ADC wiring (steering is speed, and length of the wire is steering)
|
||||||
#define ROT_P 1.2 // P coefficient for the direction controller. Positive / Negative values to invert gametrak steering direction.
|
#define ROT_P 1.2 // P coefficient for the direction controller. Positive / Negative values to invert gametrak steering direction.
|
||||||
|
@ -382,7 +399,8 @@
|
||||||
|
|
||||||
|
|
||||||
// ############################### VALIDATE SETTINGS ###############################
|
// ############################### VALIDATE SETTINGS ###############################
|
||||||
#if !defined(VARIANT_ADC) && !defined(VARIANT_USART) && !defined(VARIANT_HOVERCAR) && !defined(VARIANT_TRANSPOTTER) && !defined(VARIANT_NUNCHUK) && !defined(VARIANT_PPM) && !defined(VARIANT_IBUS) && !defined(DEBUG_SERIAL_USART3) && !defined(DEBUG_SERIAL_USART2)
|
#if !defined(VARIANT_ADC) && !defined(VARIANT_USART) && !defined(VARIANT_NUNCHUK) && !defined(VARIANT_PPM) && !defined(VARIANT_IBUS) && \
|
||||||
|
!defined(VARIANT_HOVERCAR) && !defined(VARIANT_HOVERBOARD) && !defined(VARIANT_TRANSPOTTER)
|
||||||
#error Variant not defined! Please check platformio.ini or Inc/config.h for available variants.
|
#error Variant not defined! Please check platformio.ini or Inc/config.h for available variants.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -441,3 +459,5 @@
|
||||||
#endif
|
#endif
|
||||||
// ############################# END OF VALIDATE SETTINGS ############################
|
// ############################# END OF VALIDATE SETTINGS ############################
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,10 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
// Define to prevent recursive inclusion
|
||||||
|
#ifndef DEFINES_H
|
||||||
|
#define DEFINES_H
|
||||||
|
|
||||||
#include "stm32f1xx_hal.h"
|
#include "stm32f1xx_hal.h"
|
||||||
|
|
||||||
#define LEFT_HALL_U_PIN GPIO_PIN_5
|
#define LEFT_HALL_U_PIN GPIO_PIN_5
|
||||||
|
@ -181,3 +184,6 @@ void Nunchuk_Read(void);
|
||||||
uint8_t Nunchuk_Ping(void);
|
uint8_t Nunchuk_Ping(void);
|
||||||
void PPM_Init(void);
|
void PPM_Init(void);
|
||||||
void PPM_ISR_Callback(void);
|
void PPM_ISR_Callback(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,373 @@
|
||||||
|
;******************** (C) COPYRIGHT 2017 STMicroelectronics ********************
|
||||||
|
;* File Name : startup_stm32f103xe.s
|
||||||
|
;* Author : MCD Application Team
|
||||||
|
;* Version : V4.2.0
|
||||||
|
;* Date : 31-March-2017
|
||||||
|
;* Description : STM32F103xE Devices vector table for MDK-ARM toolchain.
|
||||||
|
;* This module performs:
|
||||||
|
;* - Set the initial SP
|
||||||
|
;* - Set the initial PC == Reset_Handler
|
||||||
|
;* - Set the vector table entries with the exceptions ISR address
|
||||||
|
;* - Configure the clock system
|
||||||
|
;* - Branches to __main in the C library (which eventually
|
||||||
|
;* calls main()).
|
||||||
|
;* After Reset the Cortex-M3 processor is in Thread mode,
|
||||||
|
;* priority is Privileged, and the Stack is set to Main.
|
||||||
|
;********************************************************************************
|
||||||
|
;*
|
||||||
|
;* <h2><center>© COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
|
||||||
|
;*
|
||||||
|
;* Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
;* are permitted provided that the following conditions are met:
|
||||||
|
;* 1. Redistributions of source code must retain the above copyright notice,
|
||||||
|
;* this list of conditions and the following disclaimer.
|
||||||
|
;* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
;* this list of conditions and the following disclaimer in the documentation
|
||||||
|
;* and/or other materials provided with the distribution.
|
||||||
|
;* 3. Neither the name of STMicroelectronics nor the names of its contributors
|
||||||
|
;* may be used to endorse or promote products derived from this software
|
||||||
|
;* without specific prior written permission.
|
||||||
|
;*
|
||||||
|
;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
;
|
||||||
|
;*******************************************************************************
|
||||||
|
|
||||||
|
; Amount of memory (in bytes) allocated for Stack
|
||||||
|
; Tailor this value to your application needs
|
||||||
|
; <h> Stack Configuration
|
||||||
|
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
||||||
|
; </h>
|
||||||
|
|
||||||
|
Stack_Size EQU 0x400
|
||||||
|
|
||||||
|
AREA STACK, NOINIT, READWRITE, ALIGN=3
|
||||||
|
Stack_Mem SPACE Stack_Size
|
||||||
|
__initial_sp
|
||||||
|
|
||||||
|
; <h> Heap Configuration
|
||||||
|
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
||||||
|
; </h>
|
||||||
|
|
||||||
|
Heap_Size EQU 0x200
|
||||||
|
|
||||||
|
AREA HEAP, NOINIT, READWRITE, ALIGN=3
|
||||||
|
__heap_base
|
||||||
|
Heap_Mem SPACE Heap_Size
|
||||||
|
__heap_limit
|
||||||
|
|
||||||
|
PRESERVE8
|
||||||
|
THUMB
|
||||||
|
|
||||||
|
|
||||||
|
; Vector Table Mapped to Address 0 at Reset
|
||||||
|
AREA RESET, DATA, READONLY
|
||||||
|
EXPORT __Vectors
|
||||||
|
EXPORT __Vectors_End
|
||||||
|
EXPORT __Vectors_Size
|
||||||
|
|
||||||
|
__Vectors DCD __initial_sp ; Top of Stack
|
||||||
|
DCD Reset_Handler ; Reset Handler
|
||||||
|
DCD NMI_Handler ; NMI Handler
|
||||||
|
DCD HardFault_Handler ; Hard Fault Handler
|
||||||
|
DCD MemManage_Handler ; MPU Fault Handler
|
||||||
|
DCD BusFault_Handler ; Bus Fault Handler
|
||||||
|
DCD UsageFault_Handler ; Usage Fault Handler
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD SVC_Handler ; SVCall Handler
|
||||||
|
DCD DebugMon_Handler ; Debug Monitor Handler
|
||||||
|
DCD 0 ; Reserved
|
||||||
|
DCD PendSV_Handler ; PendSV Handler
|
||||||
|
DCD SysTick_Handler ; SysTick Handler
|
||||||
|
|
||||||
|
; External Interrupts
|
||||||
|
DCD WWDG_IRQHandler ; Window Watchdog
|
||||||
|
DCD PVD_IRQHandler ; PVD through EXTI Line detect
|
||||||
|
DCD TAMPER_IRQHandler ; Tamper
|
||||||
|
DCD RTC_IRQHandler ; RTC
|
||||||
|
DCD FLASH_IRQHandler ; Flash
|
||||||
|
DCD RCC_IRQHandler ; RCC
|
||||||
|
DCD EXTI0_IRQHandler ; EXTI Line 0
|
||||||
|
DCD EXTI1_IRQHandler ; EXTI Line 1
|
||||||
|
DCD EXTI2_IRQHandler ; EXTI Line 2
|
||||||
|
DCD EXTI3_IRQHandler ; EXTI Line 3
|
||||||
|
DCD EXTI4_IRQHandler ; EXTI Line 4
|
||||||
|
DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
|
||||||
|
DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
|
||||||
|
DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
|
||||||
|
DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
|
||||||
|
DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
|
||||||
|
DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
|
||||||
|
DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
|
||||||
|
DCD ADC1_2_IRQHandler ; ADC1 & ADC2
|
||||||
|
DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX
|
||||||
|
DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0
|
||||||
|
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
|
||||||
|
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
|
||||||
|
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
|
||||||
|
DCD TIM1_BRK_IRQHandler ; TIM1 Break
|
||||||
|
DCD TIM1_UP_IRQHandler ; TIM1 Update
|
||||||
|
DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation
|
||||||
|
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
|
||||||
|
DCD TIM2_IRQHandler ; TIM2
|
||||||
|
DCD TIM3_IRQHandler ; TIM3
|
||||||
|
DCD TIM4_IRQHandler ; TIM4
|
||||||
|
DCD I2C1_EV_IRQHandler ; I2C1 Event
|
||||||
|
DCD I2C1_ER_IRQHandler ; I2C1 Error
|
||||||
|
DCD I2C2_EV_IRQHandler ; I2C2 Event
|
||||||
|
DCD I2C2_ER_IRQHandler ; I2C2 Error
|
||||||
|
DCD SPI1_IRQHandler ; SPI1
|
||||||
|
DCD SPI2_IRQHandler ; SPI2
|
||||||
|
DCD USART1_IRQHandler ; USART1
|
||||||
|
DCD USART2_IRQHandler ; USART2
|
||||||
|
DCD USART3_IRQHandler ; USART3
|
||||||
|
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
|
||||||
|
DCD RTC_Alarm_IRQHandler ; RTC Alarm through EXTI Line
|
||||||
|
DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend
|
||||||
|
DCD TIM8_BRK_IRQHandler ; TIM8 Break
|
||||||
|
DCD TIM8_UP_IRQHandler ; TIM8 Update
|
||||||
|
DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation
|
||||||
|
DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare
|
||||||
|
DCD ADC3_IRQHandler ; ADC3
|
||||||
|
DCD FSMC_IRQHandler ; FSMC
|
||||||
|
DCD SDIO_IRQHandler ; SDIO
|
||||||
|
DCD TIM5_IRQHandler ; TIM5
|
||||||
|
DCD SPI3_IRQHandler ; SPI3
|
||||||
|
DCD UART4_IRQHandler ; UART4
|
||||||
|
DCD UART5_IRQHandler ; UART5
|
||||||
|
DCD TIM6_IRQHandler ; TIM6
|
||||||
|
DCD TIM7_IRQHandler ; TIM7
|
||||||
|
DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1
|
||||||
|
DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2
|
||||||
|
DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3
|
||||||
|
DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5
|
||||||
|
__Vectors_End
|
||||||
|
|
||||||
|
__Vectors_Size EQU __Vectors_End - __Vectors
|
||||||
|
|
||||||
|
AREA |.text|, CODE, READONLY
|
||||||
|
|
||||||
|
; Reset handler
|
||||||
|
Reset_Handler PROC
|
||||||
|
EXPORT Reset_Handler [WEAK]
|
||||||
|
IMPORT __main
|
||||||
|
IMPORT SystemInit
|
||||||
|
LDR R0, =SystemInit
|
||||||
|
BLX R0
|
||||||
|
LDR R0, =__main
|
||||||
|
BX R0
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
; Dummy Exception Handlers (infinite loops which can be modified)
|
||||||
|
|
||||||
|
NMI_Handler PROC
|
||||||
|
EXPORT NMI_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
HardFault_Handler\
|
||||||
|
PROC
|
||||||
|
EXPORT HardFault_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
MemManage_Handler\
|
||||||
|
PROC
|
||||||
|
EXPORT MemManage_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
BusFault_Handler\
|
||||||
|
PROC
|
||||||
|
EXPORT BusFault_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
UsageFault_Handler\
|
||||||
|
PROC
|
||||||
|
EXPORT UsageFault_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
SVC_Handler PROC
|
||||||
|
EXPORT SVC_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
DebugMon_Handler\
|
||||||
|
PROC
|
||||||
|
EXPORT DebugMon_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
PendSV_Handler PROC
|
||||||
|
EXPORT PendSV_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
SysTick_Handler PROC
|
||||||
|
EXPORT SysTick_Handler [WEAK]
|
||||||
|
B .
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
Default_Handler PROC
|
||||||
|
|
||||||
|
EXPORT WWDG_IRQHandler [WEAK]
|
||||||
|
EXPORT PVD_IRQHandler [WEAK]
|
||||||
|
EXPORT TAMPER_IRQHandler [WEAK]
|
||||||
|
EXPORT RTC_IRQHandler [WEAK]
|
||||||
|
EXPORT FLASH_IRQHandler [WEAK]
|
||||||
|
EXPORT RCC_IRQHandler [WEAK]
|
||||||
|
EXPORT EXTI0_IRQHandler [WEAK]
|
||||||
|
EXPORT EXTI1_IRQHandler [WEAK]
|
||||||
|
EXPORT EXTI2_IRQHandler [WEAK]
|
||||||
|
EXPORT EXTI3_IRQHandler [WEAK]
|
||||||
|
EXPORT EXTI4_IRQHandler [WEAK]
|
||||||
|
EXPORT DMA1_Channel1_IRQHandler [WEAK]
|
||||||
|
EXPORT DMA1_Channel2_IRQHandler [WEAK]
|
||||||
|
EXPORT DMA1_Channel3_IRQHandler [WEAK]
|
||||||
|
EXPORT DMA1_Channel4_IRQHandler [WEAK]
|
||||||
|
EXPORT DMA1_Channel5_IRQHandler [WEAK]
|
||||||
|
EXPORT DMA1_Channel6_IRQHandler [WEAK]
|
||||||
|
EXPORT DMA1_Channel7_IRQHandler [WEAK]
|
||||||
|
EXPORT ADC1_2_IRQHandler [WEAK]
|
||||||
|
EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK]
|
||||||
|
EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK]
|
||||||
|
EXPORT CAN1_RX1_IRQHandler [WEAK]
|
||||||
|
EXPORT CAN1_SCE_IRQHandler [WEAK]
|
||||||
|
EXPORT EXTI9_5_IRQHandler [WEAK]
|
||||||
|
EXPORT TIM1_BRK_IRQHandler [WEAK]
|
||||||
|
EXPORT TIM1_UP_IRQHandler [WEAK]
|
||||||
|
EXPORT TIM1_TRG_COM_IRQHandler [WEAK]
|
||||||
|
EXPORT TIM1_CC_IRQHandler [WEAK]
|
||||||
|
EXPORT TIM2_IRQHandler [WEAK]
|
||||||
|
EXPORT TIM3_IRQHandler [WEAK]
|
||||||
|
EXPORT TIM4_IRQHandler [WEAK]
|
||||||
|
EXPORT I2C1_EV_IRQHandler [WEAK]
|
||||||
|
EXPORT I2C1_ER_IRQHandler [WEAK]
|
||||||
|
EXPORT I2C2_EV_IRQHandler [WEAK]
|
||||||
|
EXPORT I2C2_ER_IRQHandler [WEAK]
|
||||||
|
EXPORT SPI1_IRQHandler [WEAK]
|
||||||
|
EXPORT SPI2_IRQHandler [WEAK]
|
||||||
|
EXPORT USART1_IRQHandler [WEAK]
|
||||||
|
EXPORT USART2_IRQHandler [WEAK]
|
||||||
|
EXPORT USART3_IRQHandler [WEAK]
|
||||||
|
EXPORT EXTI15_10_IRQHandler [WEAK]
|
||||||
|
EXPORT RTC_Alarm_IRQHandler [WEAK]
|
||||||
|
EXPORT USBWakeUp_IRQHandler [WEAK]
|
||||||
|
EXPORT TIM8_BRK_IRQHandler [WEAK]
|
||||||
|
EXPORT TIM8_UP_IRQHandler [WEAK]
|
||||||
|
EXPORT TIM8_TRG_COM_IRQHandler [WEAK]
|
||||||
|
EXPORT TIM8_CC_IRQHandler [WEAK]
|
||||||
|
EXPORT ADC3_IRQHandler [WEAK]
|
||||||
|
EXPORT FSMC_IRQHandler [WEAK]
|
||||||
|
EXPORT SDIO_IRQHandler [WEAK]
|
||||||
|
EXPORT TIM5_IRQHandler [WEAK]
|
||||||
|
EXPORT SPI3_IRQHandler [WEAK]
|
||||||
|
EXPORT UART4_IRQHandler [WEAK]
|
||||||
|
EXPORT UART5_IRQHandler [WEAK]
|
||||||
|
EXPORT TIM6_IRQHandler [WEAK]
|
||||||
|
EXPORT TIM7_IRQHandler [WEAK]
|
||||||
|
EXPORT DMA2_Channel1_IRQHandler [WEAK]
|
||||||
|
EXPORT DMA2_Channel2_IRQHandler [WEAK]
|
||||||
|
EXPORT DMA2_Channel3_IRQHandler [WEAK]
|
||||||
|
EXPORT DMA2_Channel4_5_IRQHandler [WEAK]
|
||||||
|
|
||||||
|
WWDG_IRQHandler
|
||||||
|
PVD_IRQHandler
|
||||||
|
TAMPER_IRQHandler
|
||||||
|
RTC_IRQHandler
|
||||||
|
FLASH_IRQHandler
|
||||||
|
RCC_IRQHandler
|
||||||
|
EXTI0_IRQHandler
|
||||||
|
EXTI1_IRQHandler
|
||||||
|
EXTI2_IRQHandler
|
||||||
|
EXTI3_IRQHandler
|
||||||
|
EXTI4_IRQHandler
|
||||||
|
DMA1_Channel1_IRQHandler
|
||||||
|
DMA1_Channel2_IRQHandler
|
||||||
|
DMA1_Channel3_IRQHandler
|
||||||
|
DMA1_Channel4_IRQHandler
|
||||||
|
DMA1_Channel5_IRQHandler
|
||||||
|
DMA1_Channel6_IRQHandler
|
||||||
|
DMA1_Channel7_IRQHandler
|
||||||
|
ADC1_2_IRQHandler
|
||||||
|
USB_HP_CAN1_TX_IRQHandler
|
||||||
|
USB_LP_CAN1_RX0_IRQHandler
|
||||||
|
CAN1_RX1_IRQHandler
|
||||||
|
CAN1_SCE_IRQHandler
|
||||||
|
EXTI9_5_IRQHandler
|
||||||
|
TIM1_BRK_IRQHandler
|
||||||
|
TIM1_UP_IRQHandler
|
||||||
|
TIM1_TRG_COM_IRQHandler
|
||||||
|
TIM1_CC_IRQHandler
|
||||||
|
TIM2_IRQHandler
|
||||||
|
TIM3_IRQHandler
|
||||||
|
TIM4_IRQHandler
|
||||||
|
I2C1_EV_IRQHandler
|
||||||
|
I2C1_ER_IRQHandler
|
||||||
|
I2C2_EV_IRQHandler
|
||||||
|
I2C2_ER_IRQHandler
|
||||||
|
SPI1_IRQHandler
|
||||||
|
SPI2_IRQHandler
|
||||||
|
USART1_IRQHandler
|
||||||
|
USART2_IRQHandler
|
||||||
|
USART3_IRQHandler
|
||||||
|
EXTI15_10_IRQHandler
|
||||||
|
RTC_Alarm_IRQHandler
|
||||||
|
USBWakeUp_IRQHandler
|
||||||
|
TIM8_BRK_IRQHandler
|
||||||
|
TIM8_UP_IRQHandler
|
||||||
|
TIM8_TRG_COM_IRQHandler
|
||||||
|
TIM8_CC_IRQHandler
|
||||||
|
ADC3_IRQHandler
|
||||||
|
FSMC_IRQHandler
|
||||||
|
SDIO_IRQHandler
|
||||||
|
TIM5_IRQHandler
|
||||||
|
SPI3_IRQHandler
|
||||||
|
UART4_IRQHandler
|
||||||
|
UART5_IRQHandler
|
||||||
|
TIM6_IRQHandler
|
||||||
|
TIM7_IRQHandler
|
||||||
|
DMA2_Channel1_IRQHandler
|
||||||
|
DMA2_Channel2_IRQHandler
|
||||||
|
DMA2_Channel3_IRQHandler
|
||||||
|
DMA2_Channel4_5_IRQHandler
|
||||||
|
B .
|
||||||
|
|
||||||
|
ENDP
|
||||||
|
|
||||||
|
ALIGN
|
||||||
|
|
||||||
|
;*******************************************************************************
|
||||||
|
; User Stack and Heap initialization
|
||||||
|
;*******************************************************************************
|
||||||
|
IF :DEF:__MICROLIB
|
||||||
|
|
||||||
|
EXPORT __initial_sp
|
||||||
|
EXPORT __heap_base
|
||||||
|
EXPORT __heap_limit
|
||||||
|
|
||||||
|
ELSE
|
||||||
|
|
||||||
|
IMPORT __use_two_region_memory
|
||||||
|
EXPORT __user_initial_stackheap
|
||||||
|
|
||||||
|
__user_initial_stackheap
|
||||||
|
|
||||||
|
LDR R0, = Heap_Mem
|
||||||
|
LDR R1, =(Stack_Mem + Stack_Size)
|
||||||
|
LDR R2, = (Heap_Mem + Heap_Size)
|
||||||
|
LDR R3, = Stack_Mem
|
||||||
|
BX LR
|
||||||
|
|
||||||
|
ALIGN
|
||||||
|
|
||||||
|
ENDIF
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
|
134
README.md
134
README.md
|
@ -1,22 +1,42 @@
|
||||||
# hoverboard-firmware-hack-FOC
|
# hoverboard-firmware-hack-FOC
|
||||||
## with Field Oriented Control (FOC)
|
|
||||||
[![Build Status](https://travis-ci.com/EmanuelFeru/hoverboard-firmware-hack-FOC.svg?branch=master)](https://travis-ci.com/EmanuelFeru/hoverboard-firmware-hack-FOC)
|
[![Build Status](https://travis-ci.com/EmanuelFeru/hoverboard-firmware-hack-FOC.svg?branch=master)](https://travis-ci.com/EmanuelFeru/hoverboard-firmware-hack-FOC)
|
||||||
[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=feru_emanuel%40yahoo.com¤cy_code=EUR&source=url)
|
[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
|
||||||
***If you like this project, you can give me a cup of coffee. Thanks!***
|
[![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=CU2SWN2XV9SCY¤cy_code=EUR&source=url)
|
||||||
|
|
||||||
This repository implements Field Oriented Control (FOC) for stock hoverboards. Compared to the commutation method, this new FOC control method offers superior performance featuring:
|
This repository implements Field Oriented Control (FOC) for stock hoverboards. Compared to the commutation method, this new FOC control method offers superior performance featuring:
|
||||||
- reduced noise and vibrations
|
- reduced noise and vibrations
|
||||||
- smooth torque output and improved motor efficiency. Thus, lower energy consumption
|
- smooth torque output and improved motor efficiency. Thus, lower energy consumption
|
||||||
- field weakening to increase maximum speed range
|
- field weakening to increase maximum speed range
|
||||||
|
|
||||||
|
#### For the hoverboard sideboard firmware see the following repositories:
|
||||||
|
- [hoverboard-sideboard-hack-GD](https://github.com/EmanuelFeru/hoverboard-sideboard-hack-GD)
|
||||||
|
- [hoverboard-sideboard-hack-STM](https://github.com/EmanuelFeru/hoverboard-sideboard-hack-STM)
|
||||||
|
|
||||||
|
---
|
||||||
|
## Hardware
|
||||||
|
|
||||||
|
![mainboard_pinout](pinout.png)
|
||||||
|
|
||||||
|
The original Hardware supports two 4-pin cables that originally were connected to the two sensor boards. They break out GND, 12/15V and USART2&3 of the Hoverboard mainboard.
|
||||||
|
Both USART2 & 3 can be used for UART and I2C, PA2&3 can be used as 12bit ADCs.
|
||||||
|
|
||||||
|
The reverse-engineered schematics of the mainboard can be found here:
|
||||||
|
http://vocke.tv/lib/exe/fetch.php?media=20150722_hoverboard_sch.pdf
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
## FOC firmware
|
||||||
|
|
||||||
This new firmware offers 3 control modes:
|
This new firmware offers 3 control modes:
|
||||||
- **VOLTAGE MODE**: in this mode the controller applies a constant Voltage to the motors
|
- **VOLTAGE MODE**: in this mode the controller applies a constant Voltage to the motors
|
||||||
- **SPEED MODE**: in this mode a closed-loop controller realizes the input target speed by rejecting any of the disturbance (resistive load) applied to the motor
|
- **SPEED MODE**: in this mode a closed-loop controller realizes the input target speed by rejecting any of the disturbance (resistive load) applied to the motor
|
||||||
- **TORQUE MODE**: in this mode the target torque set by the user is realized. This mode enables motor "freewheeling" when the torque target is "0".
|
- **TORQUE MODE**: in this mode the target torque set by the user is realized. This mode enables motor "freewheeling" when the torque target is "0".
|
||||||
|
|
||||||
**NOTE**: In all the modes, the controller features maximum motor speed and maximum motor current protection. This brings great advantages to fulfil the needs of many robotic applications while maintaining safe operation.
|
In all the modes, the controller features maximum motor speed and maximum motor current protection. This brings great advantages to fulfil the needs of many robotic applications while maintaining safe operation.
|
||||||
|
- The C code for the controller was auto-code generated using [Matlab/Simulink](https://nl.mathworks.com/solutions/embedded-code-generation.html) from a model which I developed from scratch specifically for hoverboard control. For more details regarding the working principle of the controller please consult the [Matlab/Simulink model](/01_Matlab).
|
||||||
|
- A [webview](/01_Matlab/BLDC_controller_ert_rtw/html/webview) was created, so Matlab/Simulink installation is not needed, unless you want to regenerate the code. The webview is an html page that can be opened with browsers like: Microsoft Internet Explorer or Microsoft Edge.
|
||||||
|
|
||||||
## Firmware architecture
|
### Firmware architecture
|
||||||
|
|
||||||
The main firmware architecture includes:
|
The main firmware architecture includes:
|
||||||
- **Estimations**: estimates the rotor position, angle and motor speed based on Hall sensors signal
|
- **Estimations**: estimates the rotor position, angle and motor speed based on Hall sensors signal
|
||||||
|
@ -38,24 +58,6 @@ In this firmware 3 control types are available:
|
||||||
![Schematic representation of the available control methods](/01_Matlab/02_Figures/control_methods.png)
|
![Schematic representation of the available control methods](/01_Matlab/02_Figures/control_methods.png)
|
||||||
|
|
||||||
|
|
||||||
Demo videos:
|
|
||||||
|
|
||||||
[►Video: Commutation vs Advanced control (constant speed)](https://drive.google.com/open?id=1vC_kEkp2LE2lAaMCJcmK4z2m3jrPUoBD)
|
|
||||||
|
|
||||||
[►Video: Commutation vs Advanced control (variable speed)](https://drive.google.com/open?id=1rrQ4k5VLhhAWXQzDSCar_SmEdsbM-hq2)
|
|
||||||
|
|
||||||
[►Video: Reliable Serial Communication demo](https://drive.google.com/open?id=1mUM-p7SE6gmyTH7zhDHy5DUyczXvmy5d)
|
|
||||||
|
|
||||||
[►Video: HOVERCAR demo](https://drive.google.com/open?id=18IvRJVdQSsjTg1I0Wedlg19e0FuDjfdS)
|
|
||||||
|
|
||||||
![Hoverboard wheel](/docs/pictures/hoverboard_wheel.JPG)
|
|
||||||
|
|
||||||
|
|
||||||
---
|
|
||||||
## General Notes
|
|
||||||
- The C code for the controller was auto-code generated using [Matlab/Simulink](https://nl.mathworks.com/solutions/embedded-code-generation.html) from a model which I developed from scratch specifically for hoverboard control. For more details regarding the working principle of the controller please consult the [Matlab/Simulink model](/01_Matlab).
|
|
||||||
- A [webview](/01_Matlab/BLDC_controller_ert_rtw/html/webview) was created, so Matlab/Simulink installation is not needed, unless you want to regenerate the code. The webview is an html page that can be opened with browsers like: Microsoft Internet Explorer or Microsoft Edge.
|
|
||||||
|
|
||||||
### Field Weakening / Phase Advance
|
### Field Weakening / Phase Advance
|
||||||
|
|
||||||
- By default the Field weakening is disabled. You can enable it in config.h file by setting the FIELD_WEAK_ENA = 1
|
- By default the Field weakening is disabled. You can enable it in config.h file by setting the FIELD_WEAK_ENA = 1
|
||||||
|
@ -84,53 +86,54 @@ Each motor is constantly monitored for errors. These errors are:
|
||||||
The error codes above are reported for each motor in the variables **errCode_Left** and **errCode_Right** for Left motor (long wired motor) and Right motor (short wired motor), respectively. In case of error, the motor power is reduced to 0, while an audible (fast beep) can be heard to notify the user.
|
The error codes above are reported for each motor in the variables **errCode_Left** and **errCode_Right** for Left motor (long wired motor) and Right motor (short wired motor), respectively. In case of error, the motor power is reduced to 0, while an audible (fast beep) can be heard to notify the user.
|
||||||
|
|
||||||
|
|
||||||
---
|
### Demo videos
|
||||||
## Building
|
|
||||||
For building (and flashing) I recommend platform.io, plaformio.ini file included. Simply open the folder in the IDE of choice (vscode or Atom), and press the 'PlatformIO:Build' or the 'PlatformIO:Upload' button (bottom left in vscode).
|
[►Video: Commutation vs Advanced control (constant speed)](https://drive.google.com/open?id=1vC_kEkp2LE2lAaMCJcmK4z2m3jrPUoBD)
|
||||||
|
|
||||||
|
[►Video: Commutation vs Advanced control (variable speed)](https://drive.google.com/open?id=1rrQ4k5VLhhAWXQzDSCar_SmEdsbM-hq2)
|
||||||
|
|
||||||
|
[►Video: Reliable Serial Communication demo](https://drive.google.com/open?id=1mUM-p7SE6gmyTH7zhDHy5DUyczXvmy5d)
|
||||||
|
|
||||||
|
[►Video: HOVERCAR demo](https://drive.google.com/open?id=18IvRJVdQSsjTg1I0Wedlg19e0FuDjfdS)
|
||||||
|
|
||||||
Additionally, you can also flash using the method described below in the Flashing Section.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Hardware
|
|
||||||
![otter](https://raw.githubusercontent.com/EmanuelFeru/hoverboard-firmware-hack/master/pinout.png)
|
|
||||||
|
|
||||||
The original Hardware supports two 4-pin cables that originally were connected to the two sensor boards. They break out GND, 12/15V and USART2&3 of the Hoverboard mainboard.
|
|
||||||
Both USART2 & 3 can be used for UART and I2C, PA2&3 can be used as 12bit ADCs.
|
|
||||||
|
|
||||||
The reverse-engineered schematics of the mainboard can be found here:
|
|
||||||
http://vocke.tv/lib/exe/fetch.php?media=20150722_hoverboard_sch.pdf
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Flashing
|
## Flashing
|
||||||
To build the firmware, just type "make". Make sure you have specified your gcc-arm-none-eabi binary location in the Makefile ("PREFIX = ...") (version 7 works, there is a version that does not!) (if the ons in linux repos do not work, use the official version: https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads). Right to the STM32, there is a debugging header with GND, 3V3, SWDIO and SWCLK. Connect GND, SWDIO and SWCLK to your SWD programmer, like the ST-Link found on many STM devboards.
|
|
||||||
|
Right to the STM32, there is a debugging header with GND, 3V3, SWDIO and SWCLK. Connect GND, SWDIO and SWCLK to your SWD programmer, like the ST-Link found on many STM devboards.
|
||||||
|
|
||||||
|
If you have never flashed your sideboard before, the MCU is probably locked. To unlock the flash, check-out the wiki page [How to Unlock MCU flash](https://github.com/EmanuelFeru/hoverboard-firmware-hack-FOC/wiki/How-to-Unlock-MCU-flash).
|
||||||
|
|
||||||
Do not power the mainboard from the 3.3V of your programmer! This has already killed multiple mainboards.
|
Do not power the mainboard from the 3.3V of your programmer! This has already killed multiple mainboards.
|
||||||
|
|
||||||
Make sure you hold the powerbutton or connect a jumper to the power button pins while flashing the firmware, as the STM might release the power latch and switches itself off during flashing. Battery > 36V have to be connected while flashing.
|
Make sure you hold the powerbutton or connect a jumper to the power button pins while flashing the firmware, as the STM might release the power latch and switches itself off during flashing. Battery > 36V have to be connected while flashing.
|
||||||
|
|
||||||
To flash the STM32, use the ST-Flash utility (https://github.com/texane/stlink).
|
To build and flash choose one of the following methods:
|
||||||
|
|
||||||
If you never flashed your mainboard before, the STM is probably locked. To unlock the flash, use the following OpenOCD command:
|
### Method 1: Using Platformio
|
||||||
```
|
|
||||||
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c init -c "reset halt" -c "stm32f1x unlock 0"
|
|
||||||
```
|
|
||||||
|
|
||||||
If that does not work:
|
- open the folder in the IDE of choice (vscode or Atom)
|
||||||
```
|
- press the 'PlatformIO:Build' or the 'PlatformIO:Upload' button (bottom left in vscode).
|
||||||
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c init -c "reset halt" -c "mww 0x40022004 0x45670123" -c "mww 0x40022004 0xCDEF89AB" -c "mww 0x40022008 0x45670123" -c "mww 0x40022008 0xCDEF89AB" -c "mww 0x40022010 0x220" -c "mww 0x40022010 0x260" -c "sleep 100" -c "mww 0x40022010 0x230" -c "mwh 0x1ffff800 0x5AA5" -c "sleep 1000" -c "mww 0x40022010 0x2220" -c "sleep 100" -c "mdw 0x40022010" -c "mdw 0x4002201c" -c "mdw 0x1ffff800" -c targets -c "halt" -c "stm32f1x unlock 0"
|
|
||||||
```
|
|
||||||
```
|
|
||||||
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c init -c "reset halt" -c "mww 0x40022004 0x45670123" -c "mww 0x40022004 0xCDEF89AB" -c "mww 0x40022008 0x45670123" -c "mww 0x40022008 0xCDEF89AB" -c targets -c "halt" -c "stm32f1x unlock 0"
|
|
||||||
```
|
|
||||||
Or use the Windows ST-Link utility.
|
|
||||||
|
|
||||||
Then you can simply flash the firmware:
|
### Method 2: Using Keil uVision
|
||||||
|
|
||||||
|
- in [Keil uVision](https://www.keil.com/download/product/), open the [mainboard-hack.uvproj](/MDK-ARM/)
|
||||||
|
- if you are asked to install missing packages, click Yes
|
||||||
|
- click Build Target (or press F7) to build the firmware
|
||||||
|
- click Load Code (or press F8) to flash the firmware.
|
||||||
|
|
||||||
|
### Method 3: Using Ubuntu
|
||||||
|
|
||||||
|
- prerequisites: install [ST-Flash utility](https://github.com/texane/stlink).
|
||||||
|
- open a terminal in the repo check-out folder and type:
|
||||||
```
|
```
|
||||||
st-flash --reset write build/hover.bin 0x8000000
|
make
|
||||||
```
|
```
|
||||||
or
|
- flash the firmware by typing:
|
||||||
|
```
|
||||||
|
make flash
|
||||||
|
```
|
||||||
|
- or
|
||||||
```
|
```
|
||||||
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c flash "write_image erase build/hover.bin 0x8000000"
|
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c flash "write_image erase build/hover.bin 0x8000000"
|
||||||
```
|
```
|
||||||
|
@ -150,10 +153,11 @@ Recommendation: Nunchuk Breakout Board https://github.com/Jan--Henrik/hoverboard
|
||||||
|
|
||||||
Most robust way for input is to use the ADC and potis. It works well even on 1m unshielded cable. Solder ~100k Ohm resistors between ADC-inputs and gnd directly on the mainboard. Use potis as pullups to 3.3V.
|
Most robust way for input is to use the ADC and potis. It works well even on 1m unshielded cable. Solder ~100k Ohm resistors between ADC-inputs and gnd directly on the mainboard. Use potis as pullups to 3.3V.
|
||||||
|
|
||||||
---
|
|
||||||
## Example variants
|
|
||||||
|
|
||||||
This firmware offers currently these variants (selectable in [platformio.ini](/platformio.ini) and / or [/Inc/config.h](/Inc/config.h)):
|
---
|
||||||
|
## Example Variants
|
||||||
|
|
||||||
|
This firmware offers currently these variants (selectable in [platformio.ini](/platformio.ini) or [config.h](/Inc/config.h)):
|
||||||
- **VARIANT_ADC**: In this variant the motors are controlled by two potentiometers connected to the Left sensor cable (long wired)
|
- **VARIANT_ADC**: In this variant the motors are controlled by two potentiometers connected to the Left sensor cable (long wired)
|
||||||
- **VARIANT_USART**: In this variant the motors are controlled via serial protocol (e.g. on USART3 right sensor cable, the short wired cable). The commands can be sent from an Arduino. Check out the [hoverserial.ino](/02_Arduino/hoverserial) as an example sketch.
|
- **VARIANT_USART**: In this variant the motors are controlled via serial protocol (e.g. on USART3 right sensor cable, the short wired cable). The commands can be sent from an Arduino. Check out the [hoverserial.ino](/02_Arduino/hoverserial) as an example sketch.
|
||||||
- **VARIANT_NUNCHUK**: Wii Nunchuk offers one hand control for throttle, braking and steering. This was one of the first input device used for electric armchairs or bottle crates.
|
- **VARIANT_NUNCHUK**: Wii Nunchuk offers one hand control for throttle, braking and steering. This was one of the first input device used for electric armchairs or bottle crates.
|
||||||
|
@ -164,6 +168,7 @@ This firmware offers currently these variants (selectable in [platformio.ini](/p
|
||||||
|
|
||||||
Of course the firmware can be further customized for other needs or projects.
|
Of course the firmware can be further customized for other needs or projects.
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
## Acknowledgements
|
## Acknowledgements
|
||||||
|
|
||||||
|
@ -174,3 +179,14 @@ Last but not least, I would like to acknowledge and thank the following people:
|
||||||
- ST Employee: [cedric H](https://community.st.com/s/question/0D50X0000B28qTDSQY/custom-foc-control-current-measurement-dma-timer-interrupt-needs-review)
|
- ST Employee: [cedric H](https://community.st.com/s/question/0D50X0000B28qTDSQY/custom-foc-control-current-measurement-dma-timer-interrupt-needs-review)
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
## Contributions
|
||||||
|
|
||||||
|
Every contribution to this repository is highly appreciated! Feel free to create pull requests to improve this firmware as ultimately you are going to help everyone.
|
||||||
|
|
||||||
|
If you want to donate to keep this firmware updated, please use the link below:
|
||||||
|
|
||||||
|
[![paypal](https://www.paypalobjects.com/en_US/NL/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=CU2SWN2XV9SCY¤cy_code=EUR&source=url)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
|
@ -136,7 +136,7 @@ void DMA1_Channel1_IRQHandler(void) {
|
||||||
HAL_GPIO_TogglePin(BUZZER_PORT, BUZZER_PIN);
|
HAL_GPIO_TogglePin(BUZZER_PORT, BUZZER_PIN);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, 0);
|
HAL_GPIO_WritePin(BUZZER_PORT, BUZZER_PIN, GPIO_PIN_RESET);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ############################### MOTOR CONTROL ###############################
|
// ############################### MOTOR CONTROL ###############################
|
||||||
|
|
32
Src/main.c
32
Src/main.c
|
@ -26,14 +26,12 @@
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "comms.h"
|
#include "comms.h"
|
||||||
|
#include "eeprom.h"
|
||||||
|
|
||||||
#if defined(DEBUG_I2C_LCD) || defined(SUPPORT_LCD)
|
#if defined(DEBUG_I2C_LCD) || defined(SUPPORT_LCD)
|
||||||
#include "hd44780.h"
|
#include "hd44780.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef VARIANT_TRANSPOTTER
|
|
||||||
#include "eeprom.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Matlab includes and defines - from auto-code generation
|
// Matlab includes and defines - from auto-code generation
|
||||||
// ###############################################################################
|
// ###############################################################################
|
||||||
|
@ -45,7 +43,7 @@ RT_MODEL rtM_Right_; /* Real-time model */
|
||||||
RT_MODEL *const rtM_Left = &rtM_Left_;
|
RT_MODEL *const rtM_Left = &rtM_Left_;
|
||||||
RT_MODEL *const rtM_Right = &rtM_Right_;
|
RT_MODEL *const rtM_Right = &rtM_Right_;
|
||||||
|
|
||||||
P rtP_Left; /* Block parameters (auto storage) */
|
extern P rtP_Left; /* Block parameters (auto storage) */
|
||||||
DW rtDW_Left; /* Observable states */
|
DW rtDW_Left; /* Observable states */
|
||||||
ExtU rtU_Left; /* External inputs */
|
ExtU rtU_Left; /* External inputs */
|
||||||
ExtY rtY_Left; /* External outputs */
|
ExtY rtY_Left; /* External outputs */
|
||||||
|
@ -98,6 +96,7 @@ extern I2C_HandleTypeDef hi2c2;
|
||||||
uint16_t counter = 0;
|
uint16_t counter = 0;
|
||||||
#else
|
#else
|
||||||
uint8_t nunchuk_connected = 1;
|
uint8_t nunchuk_connected = 1;
|
||||||
|
uint16_t VirtAddVarTab[NB_OF_VAR] = {0x1300}; // Dummy address to avoid warnings
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONTROL_ADC) && defined(ADC_PROTECT_ENA)
|
#if defined(CONTROL_ADC) && defined(ADC_PROTECT_ENA)
|
||||||
|
@ -146,25 +145,24 @@ typedef struct{
|
||||||
static SerialFeedback Feedback;
|
static SerialFeedback Feedback;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONTROL_NUNCHUK) || defined(SUPPORT_NUNCHUK) || defined(CONTROL_PPM) || defined(CONTROL_ADC)
|
#ifdef SUPPORT_BUTTONS
|
||||||
static uint8_t button1, button2;
|
static uint8_t button1, button2;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint8_t ctrlModReqRaw = CTRL_MOD_REQ;
|
uint8_t ctrlModReqRaw = CTRL_MOD_REQ;
|
||||||
uint8_t ctrlModReq = CTRL_MOD_REQ; // Final control mode request
|
uint8_t ctrlModReq = CTRL_MOD_REQ; // Final control mode request
|
||||||
static int cmd1; // normalized input value. -1000 to 1000
|
|
||||||
static int cmd2; // normalized input value. -1000 to 1000
|
|
||||||
static int16_t speed; // local variable for speed. -1000 to 1000
|
static int16_t speed; // local variable for speed. -1000 to 1000
|
||||||
#ifndef VARIANT_TRANSPOTTER
|
#ifndef VARIANT_TRANSPOTTER
|
||||||
|
static int cmd1; // normalized input value. -1000 to 1000
|
||||||
|
static int cmd2; // normalized input value. -1000 to 1000
|
||||||
static int16_t steer; // local variable for steering. -1000 to 1000
|
static int16_t steer; // local variable for steering. -1000 to 1000
|
||||||
static int16_t steerRateFixdt; // local fixed-point variable for steering rate limiter
|
static int16_t steerRateFixdt; // local fixed-point variable for steering rate limiter
|
||||||
static int16_t speedRateFixdt; // local fixed-point variable for speed rate limiter
|
static int16_t speedRateFixdt; // local fixed-point variable for speed rate limiter
|
||||||
static int32_t steerFixdt; // local fixed-point variable for steering low-pass filter
|
static int32_t steerFixdt; // local fixed-point variable for steering low-pass filter
|
||||||
static int32_t speedFixdt; // local fixed-point variable for speed low-pass filter
|
static int32_t speedFixdt; // local fixed-point variable for speed low-pass filter
|
||||||
#endif
|
#endif
|
||||||
#ifdef VARIANT_HOVERCAR
|
|
||||||
static MultipleTap MultipleTapBreak; // define multiple tap functionality for the Break pedal
|
static MultipleTap MultipleTapBreak; // define multiple tap functionality for the Break pedal
|
||||||
#endif
|
|
||||||
static int16_t speedAvg; // average measured speed
|
static int16_t speedAvg; // average measured speed
|
||||||
static int16_t speedAvgAbs; // average measured speed in absolute
|
static int16_t speedAvgAbs; // average measured speed in absolute
|
||||||
|
|
||||||
|
@ -197,7 +195,7 @@ void poweroff(void) {
|
||||||
buzzerFreq = (uint8_t)i;
|
buzzerFreq = (uint8_t)i;
|
||||||
HAL_Delay(100);
|
HAL_Delay(100);
|
||||||
}
|
}
|
||||||
HAL_GPIO_WritePin(OFF_PORT, OFF_PIN, 0);
|
HAL_GPIO_WritePin(OFF_PORT, OFF_PIN, GPIO_PIN_RESET);
|
||||||
while(1) {}
|
while(1) {}
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
@ -232,7 +230,7 @@ int main(void) {
|
||||||
MX_ADC1_Init();
|
MX_ADC1_Init();
|
||||||
MX_ADC2_Init();
|
MX_ADC2_Init();
|
||||||
|
|
||||||
HAL_GPIO_WritePin(OFF_PORT, OFF_PIN, 1);
|
HAL_GPIO_WritePin(OFF_PORT, OFF_PIN, GPIO_PIN_SET);
|
||||||
|
|
||||||
HAL_ADC_Start(&hadc1);
|
HAL_ADC_Start(&hadc1);
|
||||||
HAL_ADC_Start(&hadc2);
|
HAL_ADC_Start(&hadc2);
|
||||||
|
@ -279,7 +277,7 @@ int main(void) {
|
||||||
}
|
}
|
||||||
buzzerFreq = 0;
|
buzzerFreq = 0;
|
||||||
|
|
||||||
HAL_GPIO_WritePin(LED_PORT, LED_PIN, 1);
|
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);
|
||||||
|
|
||||||
#ifdef VARIANT_TRANSPOTTER
|
#ifdef VARIANT_TRANSPOTTER
|
||||||
int lastDistance = 0;
|
int lastDistance = 0;
|
||||||
|
@ -459,16 +457,20 @@ int main(void) {
|
||||||
cmd1 = CLAMP((nunchuk_data[0] - 127) * 8, INPUT_MIN, INPUT_MAX); // x - axis. Nunchuk joystick readings range 30 - 230
|
cmd1 = CLAMP((nunchuk_data[0] - 127) * 8, INPUT_MIN, INPUT_MAX); // x - axis. Nunchuk joystick readings range 30 - 230
|
||||||
cmd2 = CLAMP((nunchuk_data[1] - 128) * 8, INPUT_MIN, INPUT_MAX); // y - axis
|
cmd2 = CLAMP((nunchuk_data[1] - 128) * 8, INPUT_MIN, INPUT_MAX); // y - axis
|
||||||
|
|
||||||
|
#ifdef SUPPORT_BUTTONS
|
||||||
button1 = (uint8_t)nunchuk_data[5] & 1;
|
button1 = (uint8_t)nunchuk_data[5] & 1;
|
||||||
button2 = (uint8_t)(nunchuk_data[5] >> 1) & 1;
|
button2 = (uint8_t)(nunchuk_data[5] >> 1) & 1;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONTROL_PPM
|
#ifdef CONTROL_PPM
|
||||||
cmd1 = CLAMP((ppm_captured_value[0] - INPUT_MID) * 2, INPUT_MIN, INPUT_MAX);
|
cmd1 = CLAMP((ppm_captured_value[0] - INPUT_MID) * 2, INPUT_MIN, INPUT_MAX);
|
||||||
cmd2 = CLAMP((ppm_captured_value[1] - INPUT_MID) * 2, INPUT_MIN, INPUT_MAX);
|
cmd2 = CLAMP((ppm_captured_value[1] - INPUT_MID) * 2, INPUT_MIN, INPUT_MAX);
|
||||||
|
#ifdef SUPPORT_BUTTONS
|
||||||
button1 = ppm_captured_value[5] > INPUT_MID;
|
button1 = ppm_captured_value[5] > INPUT_MID;
|
||||||
button2 = 0;
|
button2 = 0;
|
||||||
|
#endif
|
||||||
// float scale = ppm_captured_value[2] / 1000.0f; // not used for now, uncomment if needed
|
// float scale = ppm_captured_value[2] / 1000.0f; // not used for now, uncomment if needed
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -514,8 +516,10 @@ int main(void) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// use ADCs as button inputs:
|
// use ADCs as button inputs:
|
||||||
|
#ifdef SUPPORT_BUTTONS
|
||||||
button1 = (uint8_t)(adc_buffer.l_tx2 > 2000); // ADC1
|
button1 = (uint8_t)(adc_buffer.l_tx2 > 2000); // ADC1
|
||||||
button2 = (uint8_t)(adc_buffer.l_rx2 > 2000); // ADC2
|
button2 = (uint8_t)(adc_buffer.l_rx2 > 2000); // ADC2
|
||||||
|
#endif
|
||||||
|
|
||||||
timeout = 0;
|
timeout = 0;
|
||||||
#endif
|
#endif
|
||||||
|
@ -550,6 +554,7 @@ int main(void) {
|
||||||
if (main_loop_counter % 25 == 0 && command.start != IBUS_LENGTH && command.start != 0xFF) {
|
if (main_loop_counter % 25 == 0 && command.start != IBUS_LENGTH && command.start != 0xFF) {
|
||||||
HAL_UART_DMAStop(&huart);
|
HAL_UART_DMAStop(&huart);
|
||||||
HAL_UART_Receive_DMA(&huart, (uint8_t *)&command, sizeof(command));
|
HAL_UART_Receive_DMA(&huart, (uint8_t *)&command, sizeof(command));
|
||||||
|
command.start = 0xFF; // Change the Start Frame to avoid entering again here if no data is received
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
@ -572,6 +577,7 @@ int main(void) {
|
||||||
if (main_loop_counter % 25 == 0 && command.start != START_FRAME && command.start != 0xFFFF) {
|
if (main_loop_counter % 25 == 0 && command.start != START_FRAME && command.start != 0xFFFF) {
|
||||||
HAL_UART_DMAStop(&huart);
|
HAL_UART_DMAStop(&huart);
|
||||||
HAL_UART_Receive_DMA(&huart, (uint8_t *)&command, sizeof(command));
|
HAL_UART_Receive_DMA(&huart, (uint8_t *)&command, sizeof(command));
|
||||||
|
command.start = 0xFFFF; // Change the Start Frame to avoid entering again here if no data is received
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -831,7 +837,7 @@ int main(void) {
|
||||||
} else if (timeoutFlagADC || timeoutFlagSerial) { // beep in case of ADC or Serial timeout - fast beep
|
} else if (timeoutFlagADC || timeoutFlagSerial) { // beep in case of ADC or Serial timeout - fast beep
|
||||||
buzzerFreq = 24;
|
buzzerFreq = 24;
|
||||||
buzzerPattern = 1;
|
buzzerPattern = 1;
|
||||||
} else if (BEEPS_BACKWARD && speed < -50 && speedAvg < 0) { // backward beep
|
} else if (BEEPS_BACKWARD && ((speed < -50 && speedAvg < 0) || MultipleTapBreak.b_multipleTap)) { // backward beep
|
||||||
buzzerFreq = 5;
|
buzzerFreq = 5;
|
||||||
buzzerPattern = 1;
|
buzzerPattern = 1;
|
||||||
} else { // do not beep
|
} else { // do not beep
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 419 KiB After Width: | Height: | Size: 419 KiB |
Binary file not shown.
After Width: | Height: | Size: 42 KiB |
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
Binary file not shown.
After Width: | Height: | Size: 49 KiB |
|
@ -15,6 +15,7 @@ src_dir = Src
|
||||||
;default_envs = VARIANT_PPM ; Variant for RC-Remotes with PPM-Sum signal
|
;default_envs = VARIANT_PPM ; Variant for RC-Remotes with PPM-Sum signal
|
||||||
;default_envs = VARIANT_IBUS ; Variant for RC-Remotes with FLYSKY IBUS
|
;default_envs = VARIANT_IBUS ; Variant for RC-Remotes with FLYSKY IBUS
|
||||||
;default_envs = VARIANT_HOVERCAR ; Variant for HOVERCAR build
|
;default_envs = VARIANT_HOVERCAR ; Variant for HOVERCAR build
|
||||||
|
;default_envs = VARIANT_HOVERBOARD ; Variant for HOVERBOARD
|
||||||
;default_envs = VARIANT_TRANSPOTTER ; Variant for TRANSPOTTER build https://github.com/NiklasFauth/hoverboard-firmware-hack/wiki/Build-Instruction:-TranspOtter https://hackaday.io/project/161891-transpotter-ng
|
;default_envs = VARIANT_TRANSPOTTER ; Variant for TRANSPOTTER build https://github.com/NiklasFauth/hoverboard-firmware-hack/wiki/Build-Instruction:-TranspOtter https://hackaday.io/project/161891-transpotter-ng
|
||||||
;================================================================
|
;================================================================
|
||||||
|
|
||||||
|
@ -152,6 +153,30 @@ build_flags =
|
||||||
|
|
||||||
;================================================================
|
;================================================================
|
||||||
|
|
||||||
|
[env:VARIANT_HOVERBOARD]
|
||||||
|
platform = ststm32
|
||||||
|
framework = stm32cube
|
||||||
|
board = genericSTM32F103RC
|
||||||
|
debug_tool = stlink
|
||||||
|
upload_protocol = stlink
|
||||||
|
|
||||||
|
; Serial Port settings (make sure the COM port is correct)
|
||||||
|
monitor_port = COM5
|
||||||
|
monitor_speed = 38400
|
||||||
|
|
||||||
|
build_flags =
|
||||||
|
-I${PROJECT_DIR}/inc/
|
||||||
|
-DUSE_HAL_DRIVER
|
||||||
|
-DSTM32F103xE
|
||||||
|
-Wl,-T./STM32F103RCTx_FLASH.ld
|
||||||
|
-Wl,-lc
|
||||||
|
-Wl,-lm
|
||||||
|
-g -ggdb ; to generate correctly the 'firmware.elf' for STM STUDIO vizualization
|
||||||
|
# -Wl,-lnosys
|
||||||
|
-D VARIANT_HOVERBOARD
|
||||||
|
|
||||||
|
;================================================================
|
||||||
|
|
||||||
[env:VARIANT_TRANSPOTTER]
|
[env:VARIANT_TRANSPOTTER]
|
||||||
platform = ststm32
|
platform = ststm32
|
||||||
framework = stm32cube
|
framework = stm32cube
|
||||||
|
|
Loading…
Reference in New Issue