Fixed printf - works with default UART settings
- still some clean up to do
This commit is contained in:
parent
31f0f915cf
commit
d1286e246b
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#endif
|
#endif
|
||||||
#define TIMEOUT 20 // number of wrong / missing input commands before emergency off
|
#define TIMEOUT 20 // number of wrong / missing input commands before emergency off
|
||||||
#define A2BIT_CONV 50 // A to bit for current conversion on ADC. Example: 1 A = 50, 2 A = 100, etc
|
#define A2BIT_CONV 50 // A to bit for current conversion on ADC. Example: 1 A = 50, 2 A = 100, etc
|
||||||
|
// #define PRINTF_FLOAT_SUPPORT // [-] Uncomment this for printf to support float on Serial Debug. It will increase code size! Better to avoid it!
|
||||||
|
|
||||||
// ADC conversion time definitions
|
// ADC conversion time definitions
|
||||||
#define ADC_CONV_TIME_1C5 (14) //Total ADC clock cycles / conversion = ( 1.5+12.5)
|
#define ADC_CONV_TIME_1C5 (14) //Total ADC clock cycles / conversion = ( 1.5+12.5)
|
||||||
|
@ -256,7 +257,7 @@
|
||||||
* After calibration you can optionally write the values to the following defines
|
* After calibration you can optionally write the values to the following defines
|
||||||
* Procedure:
|
* Procedure:
|
||||||
* - connect gnd, rx and tx of a usb-uart converter in 3.3V mode to the right sensor board cable (do NOT use the red 15V wire!)
|
* - connect gnd, rx and tx of a usb-uart converter in 3.3V mode to the right sensor board cable (do NOT use the red 15V wire!)
|
||||||
* - readout values using a serial terminal in 38400 boud
|
* - readout values using a serial terminal in 115200 baud rate
|
||||||
* - turn the potis to minimum position, write value 1 to INPUT1_MIN and value 2 to INPUT2_MIN
|
* - turn the potis to minimum position, write value 1 to INPUT1_MIN and value 2 to INPUT2_MIN
|
||||||
* - turn the potis to maximum position, write value 1 to INPUT1_MAX and value 2 to INPUT2_MAX
|
* - turn the potis to maximum position, write value 1 to INPUT1_MAX and value 2 to INPUT2_MAX
|
||||||
* - for middle resting potis: Let the potis in the middle resting position, write value 1 to INPUT1_MID and value 2 to INPUT2_MID
|
* - for middle resting potis: Let the potis in the middle resting position, write value 1 to INPUT1_MID and value 2 to INPUT2_MID
|
||||||
|
|
|
@ -183,6 +183,10 @@
|
||||||
#define ARRAY_LEN(x) (uint32_t)(sizeof(x) / sizeof(*(x)))
|
#define ARRAY_LEN(x) (uint32_t)(sizeof(x) / sizeof(*(x)))
|
||||||
#define MAP(x, in_min, in_max, out_min, out_max) (((((x) - (in_min)) * ((out_max) - (out_min))) / ((in_max) - (in_min))) + (out_min))
|
#define MAP(x, in_min, in_max, out_min, out_max) (((((x) - (in_min)) * ((out_max) - (out_min))) / ((in_max) - (in_min))) + (out_min))
|
||||||
|
|
||||||
|
#if defined(PRINTF_FLOAT_SUPPORT) && (defined(DEBUG_SERIAL_USART2) || defined(DEBUG_SERIAL_USART3)) && defined(__GNUC__)
|
||||||
|
asm(".global _printf_float"); // this is the magic trick for printf to support float. Warning: It will increase code considerably! Better to avoid!
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16_t dcr;
|
uint16_t dcr;
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
#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];
|
||||||
|
|
||||||
|
/* retarget the C library printf function to the USART */
|
||||||
|
#if defined(DEBUG_SERIAL_USART2) || defined(DEBUG_SERIAL_USART3)
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
|
||||||
|
#else
|
||||||
|
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
|
||||||
|
#endif
|
||||||
|
PUTCHAR_PROTOTYPE {
|
||||||
|
#if defined(DEBUG_SERIAL_USART2)
|
||||||
|
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 1000);
|
||||||
|
#elif defined(DEBUG_SERIAL_USART3)
|
||||||
|
HAL_UART_Transmit(&huart3, (uint8_t *)&ch, 1, 1000);
|
||||||
|
#endif
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
int _write(int file, char *data, int len) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < len; i++) { __io_putchar( *data++ );}
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
31
Src/main.c
31
Src/main.c
|
@ -20,12 +20,14 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h> // for abs()
|
#include <stdlib.h> // for abs()
|
||||||
#include "stm32f1xx_hal.h"
|
#include "stm32f1xx_hal.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#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"
|
||||||
|
|
||||||
|
@ -189,10 +191,6 @@ 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;
|
||||||
|
|
||||||
|
@ -214,7 +212,7 @@ int main(void) {
|
||||||
beepShort(4); HAL_Delay(100);
|
beepShort(4); HAL_Delay(100);
|
||||||
steerFixdt = speedFixdt = 0; // reset filters
|
steerFixdt = speedFixdt = 0; // reset filters
|
||||||
enable = 1; // enable motors
|
enable = 1; // enable motors
|
||||||
printf("# -- Motors enabled --\n");
|
printf("-- Motors enabled --\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
// ####### VARIANT_HOVERCAR #######
|
// ####### VARIANT_HOVERCAR #######
|
||||||
|
@ -412,11 +410,11 @@ 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
|
||||||
printf("1:%i 2:%i 3:%i 4:%i 5:%i 6:%i 7:%i 8:%i\r\n",
|
printf("in1:%i in2:%i spdL:%i spdR:%i adcBat:%i BatV:%i adcTemp:%i Temp:%i\r\n",
|
||||||
input1, // 1: INPUT1
|
input1, // 1: INPUT1
|
||||||
input2, // 2: INPUT2
|
input2, // 2: INPUT2
|
||||||
speedR, // 3: output command: [-1000, 1000]
|
speedL, // 3: output command: [-1000, 1000]
|
||||||
speedL, // 4: output command: [-1000, 1000]
|
speedR, // 4: output command: [-1000, 1000]
|
||||||
adc_buffer.batt1, // 5: for battery voltage calibration
|
adc_buffer.batt1, // 5: for battery voltage calibration
|
||||||
batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC, // 6: for verifying battery voltage calibration
|
batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC, // 6: for verifying battery voltage calibration
|
||||||
board_temp_adcFilt, // 7: for board temperature calibration
|
board_temp_adcFilt, // 7: for board temperature calibration
|
||||||
|
@ -461,31 +459,29 @@ 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) { // 1 beep (low pitch): Motor error, disable motors
|
} else if (rtY_Left.z_errCode || rtY_Right.z_errCode) { // 1 beep (low pitch): Motor error, disable motors
|
||||||
enable = 0;
|
enable = 0;
|
||||||
beepCount(1, 24, 1);
|
beepCount(1, 24, 1);
|
||||||
printf("# Warning: Left_err: %i Right_err: %i\n", rtY_Left.z_errCode);
|
printf("#ErrL: %i ErrR: %i\r\n", rtY_Left.z_errCode, rtY_Right.z_errCode);
|
||||||
} else if (timeoutFlagADC) { // 2 beeps (low pitch): ADC timeout
|
} else if (timeoutFlagADC) { // 2 beeps (low pitch): ADC timeout
|
||||||
beepCount(2, 24, 1);
|
beepCount(2, 24, 1);
|
||||||
printf("# Warning: ADC timeout\n");
|
printf("#ADC timeout\r\n");
|
||||||
} else if (timeoutFlagSerial) { // 3 beeps (low pitch): Serial timeout
|
} else if (timeoutFlagSerial) { // 3 beeps (low pitch): Serial timeout
|
||||||
beepCount(3, 24, 1);
|
beepCount(3, 24, 1);
|
||||||
printf("# Warning: Serial timeout\n");
|
printf("#Serial timeout\r\n");
|
||||||
} else if (timeoutCnt > TIMEOUT) { // 4 beeps (low pitch): General timeout (PPM, PWM, Nunchuck)
|
} else if (timeoutCnt > TIMEOUT) { // 4 beeps (low pitch): General timeout (PPM, PWM, Nunchuck)
|
||||||
beepCount(4, 24, 1);
|
beepCount(4, 24, 1);
|
||||||
printf("# Warning: General timeout\n");
|
printf("#General timeout\r\n");
|
||||||
} else if (TEMP_WARNING_ENABLE && board_temp_deg_c >= TEMP_WARNING) { // 5 beeps (low pitch): Mainboard temperature warning
|
} else if (TEMP_WARNING_ENABLE && board_temp_deg_c >= TEMP_WARNING) { // 5 beeps (low pitch): Mainboard temperature warning
|
||||||
beepCount(5, 24, 1);
|
beepCount(5, 24, 1);
|
||||||
printf("# Warning: STM32 is getting hot: %4.1f°C\n", board_temp_deg_c / 10.0);
|
printf("#STM32 hot: %i\r\n", board_temp_deg_c);
|
||||||
} else if (BAT_LVL1_ENABLE && batVoltage < BAT_LVL1) { // 1 beep fast (medium pitch): Low bat 1
|
} else if (BAT_LVL1_ENABLE && batVoltage < BAT_LVL1) { // 1 beep fast (medium pitch): Low bat 1
|
||||||
beepCount(0, 10, 6);
|
beepCount(0, 10, 6);
|
||||||
printf("# Warning: Battery is getting empty 1: %4.2fV\n", batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC / 100.0);
|
printf("#Battery empty: %i\r\n", batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC);
|
||||||
} else if (BAT_LVL2_ENABLE && batVoltage < BAT_LVL2) { // 1 beep slow (medium pitch): Low bat 2
|
} else if (BAT_LVL2_ENABLE && batVoltage < BAT_LVL2) { // 1 beep slow (medium pitch): Low bat 2
|
||||||
beepCount(0, 10, 30);
|
beepCount(0, 10, 30);
|
||||||
printf("# Warning: Battery is getting empty 2: %4.2fV\n", batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC / 100.0);
|
printf("#Battery empty: %i\r\n", batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC);
|
||||||
} else if (BEEPS_BACKWARD && ((speed < -50 && speedAvg < 0) || MultipleTapBrake.b_multipleTap)) { // 1 beep fast (high pitch): Backward spinning motors
|
} else if (BEEPS_BACKWARD && ((speed < -50 && speedAvg < 0) || MultipleTapBrake.b_multipleTap)) { // 1 beep fast (high pitch): Backward spinning motors
|
||||||
beepCount(0, 5, 1);
|
beepCount(0, 5, 1);
|
||||||
backwardDrive = 1;
|
backwardDrive = 1;
|
||||||
|
@ -502,7 +498,6 @@ 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,22 +149,16 @@ 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);
|
||||||
|
@ -210,22 +204,16 @@ 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);
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
#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;
|
|
||||||
}
|
|
30
Src/util.c
30
Src/util.c
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Includes
|
// Includes
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h> // for abs()
|
#include <stdlib.h> // for abs()
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "stm32f1xx_hal.h"
|
#include "stm32f1xx_hal.h"
|
||||||
|
@ -467,14 +468,14 @@ 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;
|
||||||
printf("# 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;
|
||||||
printf("# 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;
|
||||||
printf("# 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
|
||||||
|
@ -486,7 +487,7 @@ int checkInputType(int16_t min, int16_t mid, int16_t max){
|
||||||
}
|
}
|
||||||
|
|
||||||
HAL_Delay(10);
|
HAL_Delay(10);
|
||||||
printf("\n");
|
printf("\r\n");
|
||||||
HAL_Delay(10);
|
HAL_Delay(10);
|
||||||
|
|
||||||
return type;
|
return type;
|
||||||
|
@ -542,10 +543,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;
|
||||||
printf("# Input1 OK\r\n"); HAL_Delay(10);
|
printf("Input1 OK\r\n"); HAL_Delay(10);
|
||||||
} else {
|
} else {
|
||||||
INPUT1_TYP_CAL = 0; // Disable input
|
INPUT1_TYP_CAL = 0; // Disable input
|
||||||
printf("# Input1 Fail\r\n"); HAL_Delay(10);
|
printf("Input1 Fail\r\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);
|
||||||
|
@ -553,14 +554,15 @@ 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;
|
||||||
printf("# Input2 OK\r\n"); HAL_Delay(10);
|
printf("Input2 OK\r\n"); HAL_Delay(10);
|
||||||
} else {
|
} else {
|
||||||
INPUT2_TYP_CAL = 0; // Disable input
|
INPUT2_TYP_CAL = 0; // Disable input
|
||||||
printf("# Input2 Fail\r\n"); HAL_Delay(10);
|
printf("Input2 Fail\r\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
|
||||||
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",
|
printf("Limits Input1: TYP:%i MIN:%i MID:%i MAX:%i\r\nLimits Input2: TYP:%i MIN:%i MID:%i MAX:%i\r\n",
|
||||||
INPUT1_TYP_CAL, INPUT1_MIN_CAL, INPUT1_MID_CAL, INPUT1_MAX_CAL, INPUT2_TYP_CAL, INPUT2_MIN_CAL, INPUT2_MID_CAL, INPUT2_MAX_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);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -607,10 +609,10 @@ void updateCurSpdLim(void) {
|
||||||
rtP_Left.n_max = rtP_Right.n_max = (int16_t)((N_MOT_MAX * spd_factor) >> 12); // fixdt(0,16,16) to fixdt(1,16,4)
|
rtP_Left.n_max = rtP_Right.n_max = (int16_t)((N_MOT_MAX * spd_factor) >> 12); // fixdt(0,16,16) to fixdt(1,16,4)
|
||||||
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
|
||||||
}
|
}
|
||||||
|
|
||||||
// cur_spd_valid: 0 = No limit changed, 1 = Current limit changed, 2 = Speed limit changed, 3 = Both limits changed
|
// 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",
|
printf("Limits (%i)\r\nCurrent: fixdt:%li factor%i i_max:%i \r\nSpeed: fixdt:%li factor:%i n_max:%i\r\n",
|
||||||
cur_spd_valid, input1_fixdt, cur_factor, rtP_Left.i_max, input2_fixdt, spd_factor, rtP_Left.n_max);
|
cur_spd_valid, input1_fixdt, cur_factor, rtP_Left.i_max, input2_fixdt, spd_factor, rtP_Left.n_max);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1100,7 +1102,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
|
||||||
printf("# -- Command received --\n");
|
printf("Command = %c\r\n", *userCommand);
|
||||||
// handle_input(*userCommand); // -> Create this function to handle the user commands
|
// handle_input(*userCommand); // -> Create this function to handle the user commands
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue