implemented write syscall for printf, added float-support for printf, serial tx does not need an interrupt anymore, replaced consoleLog and consoleScope with printf, changed debug output: every comment starts with "# " now, added lots of debug messages, added welcome message with gcc version and build date
This commit is contained in:
parent
ad8c2a552a
commit
c57e1a0e4e
33
Inc/comms.h
33
Inc/comms.h
|
@ -1,33 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of the hoverboard-firmware-hack project.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2017-2018 Rene Hopf <renehopf@mac.com>
|
|
||||||
* Copyright (C) 2017-2018 Nico Stute <crinq@crinq.de>
|
|
||||||
* Copyright (C) 2017-2018 Niklas Fauth <niklas.fauth@kit.fail>
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Define to prevent recursive inclusion
|
|
||||||
#ifndef COMMS_H
|
|
||||||
#define COMMS_H
|
|
||||||
|
|
||||||
#include "stm32f1xx_hal.h"
|
|
||||||
|
|
||||||
void setScopeChannel(uint8_t ch, int16_t val);
|
|
||||||
void consoleScope(void);
|
|
||||||
void consoleLog(char *message);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
81
Src/comms.c
81
Src/comms.c
|
@ -1,81 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "stm32f1xx_hal.h"
|
|
||||||
#include "defines.h"
|
|
||||||
#include "setup.h"
|
|
||||||
#include "config.h"
|
|
||||||
#include "comms.h"
|
|
||||||
|
|
||||||
extern UART_HandleTypeDef huart2;
|
|
||||||
extern UART_HandleTypeDef huart3;
|
|
||||||
|
|
||||||
static volatile uint8_t uart_buf[100];
|
|
||||||
static volatile int16_t ch_buf[8];
|
|
||||||
//volatile char char_buf[300];
|
|
||||||
|
|
||||||
void setScopeChannel(uint8_t ch, int16_t val) {
|
|
||||||
ch_buf[ch] = val;
|
|
||||||
}
|
|
||||||
|
|
||||||
void consoleScope(void) {
|
|
||||||
#if defined DEBUG_SERIAL_SERVOTERM && (defined DEBUG_SERIAL_USART2 || defined DEBUG_SERIAL_USART3)
|
|
||||||
uart_buf[0] = 0xff;
|
|
||||||
uart_buf[1] = CLAMP(ch_buf[0]+127, 0, 255);
|
|
||||||
uart_buf[2] = CLAMP(ch_buf[1]+127, 0, 255);
|
|
||||||
uart_buf[3] = CLAMP(ch_buf[2]+127, 0, 255);
|
|
||||||
uart_buf[4] = CLAMP(ch_buf[3]+127, 0, 255);
|
|
||||||
uart_buf[5] = CLAMP(ch_buf[4]+127, 0, 255);
|
|
||||||
uart_buf[6] = CLAMP(ch_buf[5]+127, 0, 255);
|
|
||||||
uart_buf[7] = CLAMP(ch_buf[6]+127, 0, 255);
|
|
||||||
uart_buf[8] = CLAMP(ch_buf[7]+127, 0, 255);
|
|
||||||
uart_buf[9] = '\n';
|
|
||||||
|
|
||||||
#ifdef DEBUG_SERIAL_USART2
|
|
||||||
if(__HAL_DMA_GET_COUNTER(huart2.hdmatx) == 0) {
|
|
||||||
HAL_UART_Transmit_DMA(&huart2, (uint8_t *)uart_buf, strLength);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef DEBUG_SERIAL_USART3
|
|
||||||
if(__HAL_DMA_GET_COUNTER(huart3.hdmatx) == 0) {
|
|
||||||
HAL_UART_Transmit_DMA(&huart3, (uint8_t *)uart_buf, strLength);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined DEBUG_SERIAL_ASCII && (defined DEBUG_SERIAL_USART2 || defined DEBUG_SERIAL_USART3)
|
|
||||||
// memset((void *)(uintptr_t)uart_buf, 0, sizeof(uart_buf));
|
|
||||||
int strLength;
|
|
||||||
strLength = sprintf((char *)(uintptr_t)uart_buf,
|
|
||||||
"1:%i 2:%i 3:%i 4:%i 5:%i 6:%i 7:%i 8:%i\r\n",
|
|
||||||
ch_buf[0], ch_buf[1], ch_buf[2], ch_buf[3], ch_buf[4], ch_buf[5], ch_buf[6], ch_buf[7]);
|
|
||||||
|
|
||||||
#ifdef DEBUG_SERIAL_USART2
|
|
||||||
if(__HAL_DMA_GET_COUNTER(huart2.hdmatx) == 0) {
|
|
||||||
HAL_UART_Transmit_DMA(&huart2, (uint8_t *)uart_buf, strLength);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef DEBUG_SERIAL_USART3
|
|
||||||
if(__HAL_DMA_GET_COUNTER(huart3.hdmatx) == 0) {
|
|
||||||
HAL_UART_Transmit_DMA(&huart3, (uint8_t *)uart_buf, strLength);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void consoleLog(char *message)
|
|
||||||
{
|
|
||||||
#if defined DEBUG_SERIAL_ASCII && (defined DEBUG_SERIAL_USART2 || defined DEBUG_SERIAL_USART3)
|
|
||||||
#ifdef DEBUG_SERIAL_USART2
|
|
||||||
if(__HAL_DMA_GET_COUNTER(huart2.hdmatx) == 0) {
|
|
||||||
HAL_UART_Transmit_DMA(&huart2, (uint8_t *)message, strlen((char *)(uintptr_t)message));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#ifdef DEBUG_SERIAL_USART3
|
|
||||||
if(__HAL_DMA_GET_COUNTER(huart3.hdmatx) == 0) {
|
|
||||||
HAL_UART_Transmit_DMA(&huart3, (uint8_t *)message, strlen((char *)(uintptr_t)message));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
}
|
|
39
Src/main.c
39
Src/main.c
|
@ -26,7 +26,6 @@
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "comms.h"
|
|
||||||
#include "BLDC_controller.h" /* BLDC's header file */
|
#include "BLDC_controller.h" /* BLDC's header file */
|
||||||
#include "rtwtypes.h"
|
#include "rtwtypes.h"
|
||||||
|
|
||||||
|
@ -52,6 +51,8 @@ extern volatile adc_buf_t adc_buffer;
|
||||||
extern UART_HandleTypeDef huart2;
|
extern UART_HandleTypeDef huart2;
|
||||||
extern UART_HandleTypeDef huart3;
|
extern UART_HandleTypeDef huart3;
|
||||||
|
|
||||||
|
volatile uint8_t uart_buf[200];
|
||||||
|
|
||||||
// Matlab defines - from auto-code generation
|
// Matlab defines - from auto-code generation
|
||||||
//---------------
|
//---------------
|
||||||
extern P rtP_Left; /* Block parameters (auto storage) */
|
extern P rtP_Left; /* Block parameters (auto storage) */
|
||||||
|
@ -191,6 +192,10 @@ int main(void) {
|
||||||
poweronMelody();
|
poweronMelody();
|
||||||
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);
|
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);
|
||||||
|
|
||||||
|
printf("\n# hoverboard-firmware-hack-FOC\n");
|
||||||
|
printf("# GCC Version: %s\n",__VERSION__);
|
||||||
|
printf("# Build Date: %s\n\n",__DATE__);
|
||||||
|
|
||||||
int16_t speedL = 0, speedR = 0;
|
int16_t speedL = 0, speedR = 0;
|
||||||
int16_t lastSpeedL = 0, lastSpeedR = 0;
|
int16_t lastSpeedL = 0, lastSpeedR = 0;
|
||||||
|
|
||||||
|
@ -212,7 +217,7 @@ int main(void) {
|
||||||
shortBeep(4); HAL_Delay(100);
|
shortBeep(4); HAL_Delay(100);
|
||||||
steerFixdt = speedFixdt = 0; // reset filters
|
steerFixdt = speedFixdt = 0; // reset filters
|
||||||
enable = 1; // enable motors
|
enable = 1; // enable motors
|
||||||
consoleLog("-- Motors enabled --\r\n");
|
printf("# -- Motors enabled --\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// ####### VARIANT_HOVERCAR #######
|
// ####### VARIANT_HOVERCAR #######
|
||||||
|
@ -410,15 +415,16 @@ int main(void) {
|
||||||
// ####### DEBUG SERIAL OUT #######
|
// ####### DEBUG SERIAL OUT #######
|
||||||
#if defined(DEBUG_SERIAL_USART2) || defined(DEBUG_SERIAL_USART3)
|
#if defined(DEBUG_SERIAL_USART2) || defined(DEBUG_SERIAL_USART3)
|
||||||
if (main_loop_counter % 25 == 0) { // Send data periodically every 125 ms
|
if (main_loop_counter % 25 == 0) { // Send data periodically every 125 ms
|
||||||
setScopeChannel(0, (int16_t)input1); // 1: INPUT1
|
printf("1:%i 2:%i 3:%i 4:%i 5:%i 6:%i 7:%i 8:%i\r\n",
|
||||||
setScopeChannel(1, (int16_t)input2); // 2: INPUT2
|
input1, // 1: INPUT1
|
||||||
setScopeChannel(2, (int16_t)speedR); // 3: output command: [-1000, 1000]
|
input2, // 2: INPUT2
|
||||||
setScopeChannel(3, (int16_t)speedL); // 4: output command: [-1000, 1000]
|
speedR, // 3: output command: [-1000, 1000]
|
||||||
setScopeChannel(4, (int16_t)adc_buffer.batt1); // 5: for battery voltage calibration
|
speedL, // 4: output command: [-1000, 1000]
|
||||||
setScopeChannel(5, (int16_t)(batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC)); // 6: for verifying battery voltage calibration
|
adc_buffer.batt1, // 5: for battery voltage calibration
|
||||||
setScopeChannel(6, (int16_t)board_temp_adcFilt); // 7: for board temperature calibration
|
batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC, // 6: for verifying battery voltage calibration
|
||||||
setScopeChannel(7, (int16_t)board_temp_deg_c); // 8: for verifying board temperature calibration
|
board_temp_adcFilt, // 7: for board temperature calibration
|
||||||
consoleScope();
|
board_temp_deg_c); // 8: for verifying board temperature calibration
|
||||||
|
printf("# Battery empty: %4.2fV: power off\n", batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC / 100.0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -459,21 +465,31 @@ int main(void) {
|
||||||
|
|
||||||
// ####### BEEP AND EMERGENCY POWEROFF #######
|
// ####### BEEP AND EMERGENCY POWEROFF #######
|
||||||
if ((TEMP_POWEROFF_ENABLE && board_temp_deg_c >= TEMP_POWEROFF && speedAvgAbs < 20) || (batVoltage < BAT_DEAD && speedAvgAbs < 20)) { // poweroff before mainboard burns OR low bat 3
|
if ((TEMP_POWEROFF_ENABLE && board_temp_deg_c >= TEMP_POWEROFF && speedAvgAbs < 20) || (batVoltage < BAT_DEAD && speedAvgAbs < 20)) { // poweroff before mainboard burns OR low bat 3
|
||||||
|
if (board_temp_deg_c >= TEMP_POWEROFF) printf("# Error: STM32 overtemp: %4.1f°C: power off\n", board_temp_deg_c / 10.0);
|
||||||
|
if (batVoltage < BAT_DEAD) printf("# Battery empty: %4.2fV: power off\n", batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC / 100.0);
|
||||||
poweroff();
|
poweroff();
|
||||||
} else if (rtY_Left.z_errCode || rtY_Right.z_errCode) { // disable motors and beep in case of Motor error - fast beep
|
} else if (rtY_Left.z_errCode || rtY_Right.z_errCode) { // disable motors and beep in case of Motor error - fast beep
|
||||||
enable = 0;
|
enable = 0;
|
||||||
|
if (rtY_Left.z_errCode) printf("# Warning: rtY_Left.z_errCode: %i\n", rtY_Left.z_errCode);
|
||||||
|
if (rtY_Right.z_errCode) printf("# Warning: rtY_Right.z_errCode: %i\n", rtY_Right.z_errCode);
|
||||||
buzzerFreq = 8;
|
buzzerFreq = 8;
|
||||||
buzzerPattern = 1;
|
buzzerPattern = 1;
|
||||||
} else if (timeoutFlagADC || timeoutFlagSerial || timeoutCnt > TIMEOUT) { // beep in case of ADC timeout, Serial timeout or General timeout - fast beep
|
} else if (timeoutFlagADC || timeoutFlagSerial || timeoutCnt > TIMEOUT) { // beep in case of ADC timeout, Serial timeout or General timeout - fast beep
|
||||||
|
if (timeoutFlagADC) printf("# Warning: ADC timeout\n");
|
||||||
|
if (timeoutFlagSerial) printf("# Warning: Serial timeout\n");
|
||||||
|
if (timeoutCnt > TIMEOUT) printf("# Warning: General timeout\n");
|
||||||
buzzerFreq = 24;
|
buzzerFreq = 24;
|
||||||
buzzerPattern = 1;
|
buzzerPattern = 1;
|
||||||
} else if (TEMP_WARNING_ENABLE && board_temp_deg_c >= TEMP_WARNING) { // beep if mainboard gets hot
|
} else if (TEMP_WARNING_ENABLE && board_temp_deg_c >= TEMP_WARNING) { // beep if mainboard gets hot
|
||||||
|
printf("# Warning: STM32 is getting hot: %4.1f°C\n", board_temp_deg_c / 10.0);
|
||||||
buzzerFreq = 4;
|
buzzerFreq = 4;
|
||||||
buzzerPattern = 1;
|
buzzerPattern = 1;
|
||||||
} else if (BAT_LVL1_ENABLE && batVoltage < BAT_LVL1) { // low bat 1: fast beep
|
} else if (BAT_LVL1_ENABLE && batVoltage < BAT_LVL1) { // low bat 1: fast beep
|
||||||
|
printf("# Warning: Battery is getting empty 1: %4.2fV\n", batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC / 100.0);
|
||||||
buzzerFreq = 5;
|
buzzerFreq = 5;
|
||||||
buzzerPattern = 6;
|
buzzerPattern = 6;
|
||||||
} else if (BAT_LVL2_ENABLE && batVoltage < BAT_LVL2) { // low bat 2: slow beep
|
} else if (BAT_LVL2_ENABLE && batVoltage < BAT_LVL2) { // low bat 2: slow beep
|
||||||
|
printf("# Warning: Battery is getting empty 2: %4.2fV\n", batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC / 100.0);
|
||||||
buzzerFreq = 5;
|
buzzerFreq = 5;
|
||||||
buzzerPattern = 42;
|
buzzerPattern = 42;
|
||||||
} else if (BEEPS_BACKWARD && ((speed < -50 && speedAvg < 0) || MultipleTapBrake.b_multipleTap)) { // backward beep
|
} else if (BEEPS_BACKWARD && ((speed < -50 && speedAvg < 0) || MultipleTapBrake.b_multipleTap)) { // backward beep
|
||||||
|
@ -494,6 +510,7 @@ int main(void) {
|
||||||
inactivity_timeout_counter++;
|
inactivity_timeout_counter++;
|
||||||
}
|
}
|
||||||
if (inactivity_timeout_counter > (INACTIVITY_TIMEOUT * 60 * 1000) / (DELAY_IN_MAIN_LOOP + 1)) { // rest of main loop needs maybe 1ms
|
if (inactivity_timeout_counter > (INACTIVITY_TIMEOUT * 60 * 1000) / (DELAY_IN_MAIN_LOOP + 1)) { // rest of main loop needs maybe 1ms
|
||||||
|
printf("# inactivity timeout: power off\n");
|
||||||
poweroff();
|
poweroff();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
60
Src/setup.c
60
Src/setup.c
|
@ -89,11 +89,11 @@ void UART3_Init(void)
|
||||||
|
|
||||||
/* DMA interrupt init */
|
/* DMA interrupt init */
|
||||||
/* DMA1_Channel2_IRQn interrupt configuration */
|
/* DMA1_Channel2_IRQn interrupt configuration */
|
||||||
HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
|
// HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
|
||||||
HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
|
// HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
|
||||||
/* DMA1_Channel3_IRQn interrupt configuration */
|
/* DMA1_Channel3_IRQn interrupt configuration */
|
||||||
HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);
|
// HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);
|
||||||
HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
|
// HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
|
||||||
|
|
||||||
huart3.Instance = USART3;
|
huart3.Instance = USART3;
|
||||||
huart3.Init.BaudRate = USART3_BAUD;
|
huart3.Init.BaudRate = USART3_BAUD;
|
||||||
|
@ -149,16 +149,22 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
|
||||||
__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart2_rx);
|
__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart2_rx);
|
||||||
|
|
||||||
/* USART2_TX Init */
|
/* USART2_TX Init */
|
||||||
hdma_usart2_tx.Instance = DMA1_Channel7;
|
// hdma_usart2_tx.Instance = DMA1_Channel7;
|
||||||
hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
|
// hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
|
||||||
hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
|
// hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||||
hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
|
// hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
|
||||||
hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
// hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||||
hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
// hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||||
hdma_usart2_tx.Init.Mode = DMA_NORMAL;
|
// hdma_usart2_tx.Init.Mode = DMA_NORMAL;
|
||||||
hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
|
// hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
|
||||||
HAL_DMA_Init(&hdma_usart2_tx);
|
// HAL_DMA_Init(&hdma_usart2_tx);
|
||||||
__HAL_LINKDMA(uartHandle,hdmatx,hdma_usart2_tx);
|
// __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart2_tx);
|
||||||
|
USART2->CR3 |= USART_CR3_DMAT; // | USART_CR3_DMAR | USART_CR3_OVRDIS;
|
||||||
|
DMA1_Channel7->CCR = 0;
|
||||||
|
DMA1_Channel7->CPAR = (uint32_t) & (USART3->DR);
|
||||||
|
DMA1_Channel7->CNDTR = 0;
|
||||||
|
DMA1_Channel7->CCR = DMA_CCR_MINC | DMA_CCR_DIR;
|
||||||
|
DMA1->IFCR = DMA_IFCR_CTCIF2 | DMA_IFCR_CHTIF2 | DMA_IFCR_CGIF2;
|
||||||
|
|
||||||
/* USART2 interrupt Init */
|
/* USART2 interrupt Init */
|
||||||
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
|
HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
|
||||||
|
@ -204,16 +210,22 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
|
||||||
__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart3_rx);
|
__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart3_rx);
|
||||||
|
|
||||||
/* USART3_TX Init */
|
/* USART3_TX Init */
|
||||||
hdma_usart3_tx.Instance = DMA1_Channel2;
|
// hdma_usart3_tx.Instance = DMA1_Channel2;
|
||||||
hdma_usart3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
|
// hdma_usart3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
|
||||||
hdma_usart3_tx.Init.PeriphInc = DMA_PINC_DISABLE;
|
// hdma_usart3_tx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||||
hdma_usart3_tx.Init.MemInc = DMA_MINC_ENABLE;
|
// hdma_usart3_tx.Init.MemInc = DMA_MINC_ENABLE;
|
||||||
hdma_usart3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
// hdma_usart3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||||
hdma_usart3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
// hdma_usart3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||||
hdma_usart3_tx.Init.Mode = DMA_NORMAL;
|
// hdma_usart3_tx.Init.Mode = DMA_NORMAL;
|
||||||
hdma_usart3_tx.Init.Priority = DMA_PRIORITY_LOW;
|
// hdma_usart3_tx.Init.Priority = DMA_PRIORITY_LOW;
|
||||||
HAL_DMA_Init(&hdma_usart3_tx);
|
// HAL_DMA_Init(&hdma_usart3_tx);
|
||||||
__HAL_LINKDMA(uartHandle,hdmatx,hdma_usart3_tx);
|
// __HAL_LINKDMA(uartHandle,hdmatx,hdma_usart3_tx);
|
||||||
|
USART3->CR3 |= USART_CR3_DMAT; // | USART_CR3_DMAR | USART_CR3_OVRDIS;
|
||||||
|
DMA1_Channel2->CCR = 0;
|
||||||
|
DMA1_Channel2->CPAR = (uint32_t) & (USART3->DR);
|
||||||
|
DMA1_Channel2->CNDTR = 0;
|
||||||
|
DMA1_Channel2->CCR = DMA_CCR_MINC | DMA_CCR_DIR;
|
||||||
|
DMA1->IFCR = DMA_IFCR_CTCIF2 | DMA_IFCR_CHTIF2 | DMA_IFCR_CGIF2;
|
||||||
|
|
||||||
/* USART3 interrupt Init */
|
/* USART3 interrupt Init */
|
||||||
HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
|
HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
#include <reent.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
extern volatile uint8_t uart_buf[200];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* printf sends its output to this function, this function sends it to the uart dma output buffer
|
||||||
|
*/
|
||||||
|
__attribute__((__used__)) int _write(int fd, const char *ptr, int len){
|
||||||
|
#if defined DEBUG_SERIAL_ASCII && (defined DEBUG_SERIAL_USART2 || defined DEBUG_SERIAL_USART3)
|
||||||
|
#ifdef DEBUG_SERIAL_USART2
|
||||||
|
while(DMA1_Channel7->CNDTR != 0); // wait
|
||||||
|
memcpy(uart_buf,ptr,len); // copy to buffer
|
||||||
|
DMA1_Channel7->CCR &= ~DMA_CCR_EN;
|
||||||
|
DMA1_Channel7->CNDTR = len; // set number of bytes to read
|
||||||
|
DMA1_Channel7->CMAR = (uint32_t)uart_buf; // set buffer to read from
|
||||||
|
DMA1_Channel7->CCR |= DMA_CCR_EN;
|
||||||
|
#endif
|
||||||
|
#ifdef DEBUG_SERIAL_USART3
|
||||||
|
while(DMA1_Channel2->CNDTR != 0); // wait
|
||||||
|
memcpy(uart_buf,ptr,len); // copy to buffer
|
||||||
|
DMA1_Channel2->CCR &= ~DMA_CCR_EN;
|
||||||
|
DMA1_Channel2->CNDTR = len; // set number of bytes to read
|
||||||
|
DMA1_Channel2->CMAR = (uint32_t)uart_buf; // set buffer to read from
|
||||||
|
DMA1_Channel2->CCR |= DMA_CCR_EN;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
return len;
|
||||||
|
}
|
59
Src/util.c
59
Src/util.c
|
@ -24,7 +24,6 @@
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "comms.h"
|
|
||||||
#include "eeprom.h"
|
#include "eeprom.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "BLDC_controller.h"
|
#include "BLDC_controller.h"
|
||||||
|
@ -458,26 +457,26 @@ int checkInputType(int16_t min, int16_t mid, int16_t max){
|
||||||
HAL_Delay(10);
|
HAL_Delay(10);
|
||||||
if ((min / threshold) == (max / threshold) || (mid / threshold) == (max / threshold) || min > max || mid > max) {
|
if ((min / threshold) == (max / threshold) || (mid / threshold) == (max / threshold) || min > max || mid > max) {
|
||||||
type = 0;
|
type = 0;
|
||||||
consoleLog("Input is ignored"); // (MIN and MAX) OR (MID and MAX) are close, disable input
|
printf("# Input is ignored"); // (MIN and MAX) OR (MID and MAX) are close, disable input
|
||||||
} else {
|
} else {
|
||||||
if ((min / threshold) == (mid / threshold)){
|
if ((min / threshold) == (mid / threshold)){
|
||||||
type = 1;
|
type = 1;
|
||||||
consoleLog("Input is a normal pot"); // MIN and MID are close, it's a normal pot
|
printf("# Input is a normal pot"); // MIN and MID are close, it's a normal pot
|
||||||
} else {
|
} else {
|
||||||
type = 2;
|
type = 2;
|
||||||
consoleLog("Input is a mid-resting pot"); // it's a mid resting pot
|
printf("# Input is a mid-resting pot"); // it's a mid resting pot
|
||||||
}
|
}
|
||||||
HAL_Delay(10);
|
HAL_Delay(10);
|
||||||
#ifdef CONTROL_ADC
|
#ifdef CONTROL_ADC
|
||||||
if ((min + INPUT_MARGIN - ADC_PROTECT_THRESH) > 0 && (max - INPUT_MARGIN + ADC_PROTECT_THRESH) < 4095) {
|
if ((min + INPUT_MARGIN - ADC_PROTECT_THRESH) > 0 && (max - INPUT_MARGIN + ADC_PROTECT_THRESH) < 4095) {
|
||||||
consoleLog(" and protected");
|
printf(" and protected");
|
||||||
longBeep(2); // Indicate protection by a beep
|
longBeep(2); // Indicate protection by a beep
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
HAL_Delay(10);
|
HAL_Delay(10);
|
||||||
consoleLog("\n");
|
printf("\n");
|
||||||
HAL_Delay(10);
|
HAL_Delay(10);
|
||||||
|
|
||||||
return type;
|
return type;
|
||||||
|
@ -499,7 +498,10 @@ void adcCalibLim(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(VARIANT_HOVERBOARD) && !defined(VARIANT_TRANSPOTTER)
|
#if !defined(VARIANT_HOVERBOARD) && !defined(VARIANT_TRANSPOTTER)
|
||||||
consoleLog("Input calibration started...\n");
|
printf("# Input calibration started...\n");
|
||||||
|
printf("# move the potentiometers freely to the min and max limits repeatedly\n");
|
||||||
|
printf("# release potentiometers to the resting postion\n");
|
||||||
|
printf("# press the power button to confirm or wait for the 20 sec timeout\n");
|
||||||
|
|
||||||
readInput();
|
readInput();
|
||||||
// Inititalization: MIN = a high value, MAX = a low value
|
// Inititalization: MIN = a high value, MAX = a low value
|
||||||
|
@ -533,10 +535,10 @@ void adcCalibLim(void) {
|
||||||
INPUT1_MIN_CAL = INPUT1_MIN_temp + INPUT_MARGIN;
|
INPUT1_MIN_CAL = INPUT1_MIN_temp + INPUT_MARGIN;
|
||||||
INPUT1_MID_CAL = INPUT1_MID_temp;
|
INPUT1_MID_CAL = INPUT1_MID_temp;
|
||||||
INPUT1_MAX_CAL = INPUT1_MAX_temp - INPUT_MARGIN;
|
INPUT1_MAX_CAL = INPUT1_MAX_temp - INPUT_MARGIN;
|
||||||
consoleLog("Input1 OK\n"); HAL_Delay(10);
|
printf("# Input1 OK\n"); HAL_Delay(10);
|
||||||
} else {
|
} else {
|
||||||
INPUT1_TYP_CAL = 0; // Disable input
|
INPUT1_TYP_CAL = 0; // Disable input
|
||||||
consoleLog("Input1 Fail\n"); HAL_Delay(10);
|
printf("# Input1 Fail\n"); HAL_Delay(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
INPUT2_TYP_CAL = checkInputType(INPUT2_MIN_temp, INPUT2_MID_temp, INPUT2_MAX_temp);
|
INPUT2_TYP_CAL = checkInputType(INPUT2_MIN_temp, INPUT2_MID_temp, INPUT2_MAX_temp);
|
||||||
|
@ -544,23 +546,14 @@ void adcCalibLim(void) {
|
||||||
INPUT2_MIN_CAL = INPUT2_MIN_temp + INPUT_MARGIN;
|
INPUT2_MIN_CAL = INPUT2_MIN_temp + INPUT_MARGIN;
|
||||||
INPUT2_MID_CAL = INPUT2_MID_temp;
|
INPUT2_MID_CAL = INPUT2_MID_temp;
|
||||||
INPUT2_MAX_CAL = INPUT2_MAX_temp - INPUT_MARGIN;
|
INPUT2_MAX_CAL = INPUT2_MAX_temp - INPUT_MARGIN;
|
||||||
consoleLog("Input2 OK\n"); HAL_Delay(10);
|
printf("# Input2 OK\n"); HAL_Delay(10);
|
||||||
} else {
|
} else {
|
||||||
INPUT2_TYP_CAL = 0; // Disable input
|
INPUT2_TYP_CAL = 0; // Disable input
|
||||||
consoleLog("Input2 Fail\n"); HAL_Delay(10);
|
printf("# Input2 Fail\n"); HAL_Delay(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
inp_cal_valid = 1; // Mark calibration to be saved in Flash at shutdown
|
inp_cal_valid = 1; // Mark calibration to be saved in Flash at shutdown
|
||||||
consoleLog("Limits: "); HAL_Delay(10);
|
printf("# Limits: INPUT1_TYP_CAL:%i INPUT1_MIN_CAL:%i INPUT1_MID_CAL:%i INPUT1_MAX_CAL:%i INPUT2_TYP_CAL:%i INPUT2_MIN_CAL:%i INPUT2_MID_CAL:%i INPUT2_MAX_CAL:%i\n",
|
||||||
setScopeChannel(0, (int16_t)INPUT1_TYP_CAL);
|
INPUT1_TYP_CAL, INPUT1_MIN_CAL, INPUT1_MID_CAL, INPUT1_MAX_CAL, INPUT2_TYP_CAL, INPUT2_MIN_CAL, INPUT2_MID_CAL, INPUT2_MAX_CAL);
|
||||||
setScopeChannel(1, (int16_t)INPUT1_MIN_CAL);
|
|
||||||
setScopeChannel(2, (int16_t)INPUT1_MID_CAL);
|
|
||||||
setScopeChannel(3, (int16_t)INPUT1_MAX_CAL);
|
|
||||||
setScopeChannel(4, (int16_t)INPUT2_TYP_CAL);
|
|
||||||
setScopeChannel(5, (int16_t)INPUT2_MIN_CAL);
|
|
||||||
setScopeChannel(6, (int16_t)INPUT2_MID_CAL);
|
|
||||||
setScopeChannel(7, (int16_t)INPUT2_MAX_CAL);
|
|
||||||
consoleScope();
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -576,7 +569,9 @@ void updateCurSpdLim(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(VARIANT_HOVERBOARD) && !defined(VARIANT_TRANSPOTTER)
|
#if !defined(VARIANT_HOVERBOARD) && !defined(VARIANT_TRANSPOTTER)
|
||||||
consoleLog("Torque and Speed limits update started...\n");
|
printf("# Torque and Speed limits update started...\n");
|
||||||
|
printf("# move and hold the pots to a desired limit position for Current and Speed\n");
|
||||||
|
printf("# press the power button to confirm or wait for the 10 sec timeout\n");
|
||||||
|
|
||||||
int32_t input1_fixdt = input1 << 16;
|
int32_t input1_fixdt = input1 << 16;
|
||||||
int32_t input2_fixdt = input2 << 16;
|
int32_t input2_fixdt = input2 << 16;
|
||||||
|
@ -608,17 +603,9 @@ void updateCurSpdLim(void) {
|
||||||
cur_spd_valid += 2; // Mark update to be saved in Flash at shutdown
|
cur_spd_valid += 2; // Mark update to be saved in Flash at shutdown
|
||||||
}
|
}
|
||||||
|
|
||||||
consoleLog("Limits: "); HAL_Delay(10);
|
// cur_spd_valid: 0 = No limit changed, 1 = Current limit changed, 2 = Speed limit changed, 3 = Both limits changed
|
||||||
setScopeChannel(0, (int16_t)cur_spd_valid); // 0 = No limit changed, 1 = Current limit changed, 2 = Speed limit changed, 3 = Both limits changed
|
printf("# Limits: cur_spd_valid:%i input1_fixdt:%li cur_factor:%i rtP_Left.i_max:%i input2_fixdt:%li spd_factor:%i rtP_Left.n_max:%i\n",
|
||||||
setScopeChannel(1, (int16_t)input1_fixdt);
|
cur_spd_valid, input1_fixdt, cur_factor, rtP_Left.i_max, input2_fixdt, spd_factor, rtP_Left.n_max);
|
||||||
setScopeChannel(2, (int16_t)cur_factor);
|
|
||||||
setScopeChannel(3, (int16_t)rtP_Left.i_max);
|
|
||||||
setScopeChannel(4, (int16_t)0);
|
|
||||||
setScopeChannel(5, (int16_t)input2_fixdt);
|
|
||||||
setScopeChannel(6, (int16_t)spd_factor);
|
|
||||||
setScopeChannel(7, (int16_t)rtP_Left.n_max);
|
|
||||||
consoleScope();
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -752,7 +739,7 @@ void cruiseControl(uint8_t button) {
|
||||||
void poweroff(void) {
|
void poweroff(void) {
|
||||||
buzzerPattern = 0;
|
buzzerPattern = 0;
|
||||||
enable = 0;
|
enable = 0;
|
||||||
consoleLog("-- Motors disabled --\r\n");
|
printf("# -- Motors disabled --\n");
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
buzzerFreq = (uint8_t)i;
|
buzzerFreq = (uint8_t)i;
|
||||||
HAL_Delay(100);
|
HAL_Delay(100);
|
||||||
|
@ -1107,7 +1094,7 @@ void usart_process_debug(uint8_t *userCommand, uint32_t len)
|
||||||
{
|
{
|
||||||
for (; len > 0; len--, userCommand++) {
|
for (; len > 0; len--, userCommand++) {
|
||||||
if (*userCommand != '\n' && *userCommand != '\r') { // Do not accept 'new line' and 'carriage return' commands
|
if (*userCommand != '\n' && *userCommand != '\r') { // Do not accept 'new line' and 'carriage return' commands
|
||||||
consoleLog("-- Command received --\r\n");
|
printf("# -- Command received --\n");
|
||||||
// handle_input(*userCommand); // -> Create this function to handle the user commands
|
// handle_input(*userCommand); // -> Create this function to handle the user commands
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,7 @@ monitor_speed = 38400
|
||||||
build_flags =
|
build_flags =
|
||||||
-DUSE_HAL_DRIVER
|
-DUSE_HAL_DRIVER
|
||||||
-DSTM32F103xE
|
-DSTM32F103xE
|
||||||
|
-Wl,-u,_printf_float ; enable float for printf
|
||||||
-Wl,-T./STM32F103RCTx_FLASH.ld
|
-Wl,-T./STM32F103RCTx_FLASH.ld
|
||||||
-Wl,-lc
|
-Wl,-lc
|
||||||
-Wl,-lm
|
-Wl,-lm
|
||||||
|
@ -60,6 +61,7 @@ monitor_speed = 38400
|
||||||
build_flags =
|
build_flags =
|
||||||
-DUSE_HAL_DRIVER
|
-DUSE_HAL_DRIVER
|
||||||
-DSTM32F103xE
|
-DSTM32F103xE
|
||||||
|
-Wl,-u,_printf_float ; enable float for printf
|
||||||
-Wl,-T./STM32F103RCTx_FLASH.ld
|
-Wl,-T./STM32F103RCTx_FLASH.ld
|
||||||
-Wl,-lc
|
-Wl,-lc
|
||||||
-Wl,-lm
|
-Wl,-lm
|
||||||
|
@ -79,6 +81,7 @@ upload_protocol = stlink
|
||||||
build_flags =
|
build_flags =
|
||||||
-DUSE_HAL_DRIVER
|
-DUSE_HAL_DRIVER
|
||||||
-DSTM32F103xE
|
-DSTM32F103xE
|
||||||
|
-Wl,-u,_printf_float ; enable float for printf
|
||||||
-Wl,-T./STM32F103RCTx_FLASH.ld
|
-Wl,-T./STM32F103RCTx_FLASH.ld
|
||||||
-Wl,-lc
|
-Wl,-lc
|
||||||
-Wl,-lm
|
-Wl,-lm
|
||||||
|
@ -98,6 +101,7 @@ upload_protocol = stlink
|
||||||
build_flags =
|
build_flags =
|
||||||
-DUSE_HAL_DRIVER
|
-DUSE_HAL_DRIVER
|
||||||
-DSTM32F103xE
|
-DSTM32F103xE
|
||||||
|
-Wl,-u,_printf_float ; enable float for printf
|
||||||
-Wl,-T./STM32F103RCTx_FLASH.ld
|
-Wl,-T./STM32F103RCTx_FLASH.ld
|
||||||
-Wl,-lc
|
-Wl,-lc
|
||||||
-Wl,-lm
|
-Wl,-lm
|
||||||
|
@ -117,6 +121,7 @@ upload_protocol = stlink
|
||||||
build_flags =
|
build_flags =
|
||||||
-DUSE_HAL_DRIVER
|
-DUSE_HAL_DRIVER
|
||||||
-DSTM32F103xE
|
-DSTM32F103xE
|
||||||
|
-Wl,-u,_printf_float ; enable float for printf
|
||||||
-Wl,-T./STM32F103RCTx_FLASH.ld
|
-Wl,-T./STM32F103RCTx_FLASH.ld
|
||||||
-Wl,-lc
|
-Wl,-lc
|
||||||
-Wl,-lm
|
-Wl,-lm
|
||||||
|
@ -136,6 +141,7 @@ upload_protocol = stlink
|
||||||
build_flags =
|
build_flags =
|
||||||
-DUSE_HAL_DRIVER
|
-DUSE_HAL_DRIVER
|
||||||
-DSTM32F103xE
|
-DSTM32F103xE
|
||||||
|
-Wl,-u,_printf_float ; enable float for printf
|
||||||
-Wl,-T./STM32F103RCTx_FLASH.ld
|
-Wl,-T./STM32F103RCTx_FLASH.ld
|
||||||
-Wl,-lc
|
-Wl,-lc
|
||||||
-Wl,-lm
|
-Wl,-lm
|
||||||
|
@ -159,6 +165,7 @@ monitor_speed = 38400
|
||||||
build_flags =
|
build_flags =
|
||||||
-DUSE_HAL_DRIVER
|
-DUSE_HAL_DRIVER
|
||||||
-DSTM32F103xE
|
-DSTM32F103xE
|
||||||
|
-Wl,-u,_printf_float ; enable float for printf
|
||||||
-Wl,-T./STM32F103RCTx_FLASH.ld
|
-Wl,-T./STM32F103RCTx_FLASH.ld
|
||||||
-Wl,-lc
|
-Wl,-lc
|
||||||
-Wl,-lm
|
-Wl,-lm
|
||||||
|
@ -182,6 +189,7 @@ monitor_speed = 38400
|
||||||
build_flags =
|
build_flags =
|
||||||
-DUSE_HAL_DRIVER
|
-DUSE_HAL_DRIVER
|
||||||
-DSTM32F103xE
|
-DSTM32F103xE
|
||||||
|
-Wl,-u,_printf_float ; enable float for printf
|
||||||
-Wl,-T./STM32F103RCTx_FLASH.ld
|
-Wl,-T./STM32F103RCTx_FLASH.ld
|
||||||
-Wl,-lc
|
-Wl,-lc
|
||||||
-Wl,-lm
|
-Wl,-lm
|
||||||
|
@ -201,6 +209,7 @@ upload_protocol = stlink
|
||||||
build_flags =
|
build_flags =
|
||||||
-DUSE_HAL_DRIVER
|
-DUSE_HAL_DRIVER
|
||||||
-DSTM32F103xE
|
-DSTM32F103xE
|
||||||
|
-Wl,-u,_printf_float ; enable float for printf
|
||||||
-Wl,-T./STM32F103RCTx_FLASH.ld
|
-Wl,-T./STM32F103RCTx_FLASH.ld
|
||||||
-Wl,-lc
|
-Wl,-lc
|
||||||
-Wl,-lm
|
-Wl,-lm
|
||||||
|
@ -221,6 +230,7 @@ upload_protocol = stlink
|
||||||
build_flags =
|
build_flags =
|
||||||
-DUSE_HAL_DRIVER
|
-DUSE_HAL_DRIVER
|
||||||
-DSTM32F103xE
|
-DSTM32F103xE
|
||||||
|
-Wl,-u,_printf_float ; enable float for printf
|
||||||
-Wl,-T./STM32F103RCTx_FLASH.ld
|
-Wl,-T./STM32F103RCTx_FLASH.ld
|
||||||
-Wl,-lc
|
-Wl,-lc
|
||||||
-Wl,-lm
|
-Wl,-lm
|
||||||
|
|
Loading…
Reference in New Issue