V1.0
This commit is contained in:
		@ -1,9 +0,0 @@
 | 
			
		||||
#ifndef INC_PWM_CONTROL_H_
 | 
			
		||||
#define INC_PWM_CONTROL_H_
 | 
			
		||||
 | 
			
		||||
#include "stm32f3xx_hal_conf.h"
 | 
			
		||||
 | 
			
		||||
void PWMControl_UpdatePWMs(uint8_t pwrgndfans );
 | 
			
		||||
void PWMControl_init(TIM_HandleTypeDef* timer3);
 | 
			
		||||
 | 
			
		||||
#endif /* INC_CHANNEL_CONTROL_H_ */
 | 
			
		||||
@ -25,9 +25,9 @@ CCR: 1/20 -> 500, 2/20 -> 1000
 | 
			
		||||
 | 
			
		||||
//#define BATTERY_COOLING_FREQ        20000
 | 
			
		||||
 | 
			
		||||
void PWM_control_init(TIM_HandleTypeDef* powerground, TIM_HandleTypeDef* battery_cooling);
 | 
			
		||||
 | 
			
		||||
void PWM_control_init(TIM_HandleTypeDef* pg, TIM_HandleTypeDef* bat_cool, TIM_HandleTypeDef* esc_cool);
 | 
			
		||||
void PWM_powerground_control(uint8_t percent);
 | 
			
		||||
void PWM_battery_cooling_control(uint8_t percent);
 | 
			
		||||
void PWM_esc_cooling(uint8_t percent);
 | 
			
		||||
 | 
			
		||||
#endif /* INC_CHANNEL_CONTROL_H */
 | 
			
		||||
 | 
			
		||||
@ -1,64 +0,0 @@
 | 
			
		||||
#ifndef CAN_HALAL_H
 | 
			
		||||
#define CAN_HALAL_H
 | 
			
		||||
 | 
			
		||||
// Define family macros if none are defined and we recognize a chip macro
 | 
			
		||||
#if !defined(STM32F3) && !defined(STM32H7)
 | 
			
		||||
#if defined(STM32F302x6) || defined(STM32F302x8) || defined(STM32F302xB) ||    \
 | 
			
		||||
    defined(STM32F302xC)
 | 
			
		||||
#define STM32F3
 | 
			
		||||
#endif
 | 
			
		||||
#if defined(STM32H7A3xx)
 | 
			
		||||
#define STM32H7
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(STM32F3)
 | 
			
		||||
#include "stm32f3xx_hal.h"
 | 
			
		||||
#define FTCAN_IS_BXCAN
 | 
			
		||||
#define FTCAN_NUM_FILTERS 13
 | 
			
		||||
#elif defined(STM32H7)
 | 
			
		||||
#include "stm32h7xx_hal.h"
 | 
			
		||||
#define FTCAN_IS_FDCAN
 | 
			
		||||
#ifndef FTCAN_NUM_FILTERS
 | 
			
		||||
    #error "Please configure the number of filters in CubeMX, and then add a compiler define for FTCAN_NUM_FILTERS"
 | 
			
		||||
#endif
 | 
			
		||||
#else
 | 
			
		||||
#error "Couldn't detect STM family"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(FTCAN_IS_BXCAN)
 | 
			
		||||
HAL_StatusTypeDef ftcan_init(CAN_HandleTypeDef *handle);
 | 
			
		||||
#elif defined(FTCAN_IS_FDCAN)
 | 
			
		||||
HAL_StatusTypeDef ftcan_init(FDCAN_HandleTypeDef *handle);
 | 
			
		||||
#else
 | 
			
		||||
#error "Unknown CAN peripheral"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
HAL_StatusTypeDef ftcan_transmit(uint16_t id, const uint8_t *data,
 | 
			
		||||
                                 size_t datalen);
 | 
			
		||||
 | 
			
		||||
HAL_StatusTypeDef ftcan_add_filter(uint16_t id, uint16_t mask);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Define this function to be notified of incoming CAN messages
 | 
			
		||||
 */
 | 
			
		||||
void ftcan_msg_received_cb(uint16_t id, size_t datalen, const uint8_t *data);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Read num_bytes bytes from a message (unmarshalled network byte order). The
 | 
			
		||||
 * msg pointer is advanced by the corresponding number of bytes.
 | 
			
		||||
 *
 | 
			
		||||
 * Both methods return a 64-bit integer, but you can safely cast it to a smaller
 | 
			
		||||
 * integer type.
 | 
			
		||||
 */
 | 
			
		||||
uint64_t ftcan_unmarshal_unsigned(const uint8_t **data, size_t num_bytes);
 | 
			
		||||
int64_t ftcan_unmarshal_signed(const uint8_t **data, size_t num_bytes);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Write num_bytes to a message (marshalled in network byte order). The pointer
 | 
			
		||||
 * is advanced by the corresponding number of bytes and returned.
 | 
			
		||||
 */
 | 
			
		||||
uint8_t *ftcan_marshal_unsigned(uint8_t *data, uint64_t val, size_t num_bytes);
 | 
			
		||||
uint8_t *ftcan_marshal_signed(uint8_t *data, int64_t val, size_t num_bytes);
 | 
			
		||||
 | 
			
		||||
#endif // CAN_HALAL_H
 | 
			
		||||
@ -59,28 +59,40 @@ void Error_Handler(void);
 | 
			
		||||
/* USER CODE END EFP */
 | 
			
		||||
 | 
			
		||||
/* Private defines -----------------------------------------------------------*/
 | 
			
		||||
#define RELAY_EN_Pin GPIO_PIN_0
 | 
			
		||||
#define RELAY_EN_GPIO_Port GPIOA
 | 
			
		||||
#define _60V_EN_Pin GPIO_PIN_1
 | 
			
		||||
#define _60V_EN_GPIO_Port GPIOA
 | 
			
		||||
#define CSB_Pin GPIO_PIN_4
 | 
			
		||||
#define CSB_GPIO_Port GPIOA
 | 
			
		||||
#define STATUS_LED_R_Pin GPIO_PIN_0
 | 
			
		||||
#define ESC_L_PWM_Pin GPIO_PIN_0
 | 
			
		||||
#define ESC_L_PWM_GPIO_Port GPIOB
 | 
			
		||||
#define ESC_R_PWM_Pin GPIO_PIN_1
 | 
			
		||||
#define ESC_R_PWM_GPIO_Port GPIOB
 | 
			
		||||
#define BAT_COOLING_PWM_Pin GPIO_PIN_10
 | 
			
		||||
#define BAT_COOLING_PWM_GPIO_Port GPIOB
 | 
			
		||||
#define BAT_COOLING_ENABLE_Pin GPIO_PIN_11
 | 
			
		||||
#define BAT_COOLING_ENABLE_GPIO_Port GPIOB
 | 
			
		||||
#define ESC_COOLING_ENABLE_Pin GPIO_PIN_14
 | 
			
		||||
#define ESC_COOLING_ENABLE_GPIO_Port GPIOB
 | 
			
		||||
#define ESC_COOLING_PWM_Pin GPIO_PIN_15
 | 
			
		||||
#define ESC_COOLING_PWM_GPIO_Port GPIOB
 | 
			
		||||
#define EEPROM___WC__Pin GPIO_PIN_8
 | 
			
		||||
#define EEPROM___WC__GPIO_Port GPIOA
 | 
			
		||||
#define EEPROM_SCL_Pin GPIO_PIN_9
 | 
			
		||||
#define EEPROM_SCL_GPIO_Port GPIOA
 | 
			
		||||
#define EEPROM_SDA_Pin GPIO_PIN_10
 | 
			
		||||
#define EEPROM_SDA_GPIO_Port GPIOA
 | 
			
		||||
#define TMP_SCL_Pin GPIO_PIN_15
 | 
			
		||||
#define TMP_SCL_GPIO_Port GPIOA
 | 
			
		||||
#define RELAY_ENABLE_Pin GPIO_PIN_4
 | 
			
		||||
#define RELAY_ENABLE_GPIO_Port GPIOB
 | 
			
		||||
#define PRECHARGE_ENABLE_Pin GPIO_PIN_5
 | 
			
		||||
#define PRECHARGE_ENABLE_GPIO_Port GPIOB
 | 
			
		||||
#define STATUS_LED_R_Pin GPIO_PIN_6
 | 
			
		||||
#define STATUS_LED_R_GPIO_Port GPIOB
 | 
			
		||||
#define STATUS_LED_B_Pin GPIO_PIN_1
 | 
			
		||||
#define STATUS_LED_B_GPIO_Port GPIOB
 | 
			
		||||
#define STATUS_LED_G_Pin GPIO_PIN_2
 | 
			
		||||
#define STATUS_LED_G_Pin GPIO_PIN_7
 | 
			
		||||
#define STATUS_LED_G_GPIO_Port GPIOB
 | 
			
		||||
#define PRECHARGE_EN_Pin GPIO_PIN_11
 | 
			
		||||
#define PRECHARGE_EN_GPIO_Port GPIOB
 | 
			
		||||
#define PWM_Battery_Cooling_Pin GPIO_PIN_15
 | 
			
		||||
#define PWM_Battery_Cooling_GPIO_Port GPIOB
 | 
			
		||||
#define RELAY_BATT_SIDE_ON_Pin GPIO_PIN_8
 | 
			
		||||
#define RELAY_BATT_SIDE_ON_GPIO_Port GPIOA
 | 
			
		||||
#define RELAY_ESC_SIDE_ON_Pin GPIO_PIN_9
 | 
			
		||||
#define RELAY_ESC_SIDE_ON_GPIO_Port GPIOA
 | 
			
		||||
#define CURRENT_SENSOR_ON_Pin GPIO_PIN_10
 | 
			
		||||
#define CURRENT_SENSOR_ON_GPIO_Port GPIOA
 | 
			
		||||
#define STATUS_LED_B_Pin GPIO_PIN_8
 | 
			
		||||
#define STATUS_LED_B_GPIO_Port GPIOB
 | 
			
		||||
#define TMP_SDA_Pin GPIO_PIN_9
 | 
			
		||||
#define TMP_SDA_GPIO_Port GPIOB
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN Private defines */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -58,7 +58,7 @@
 | 
			
		||||
/*#define HAL_RTC_MODULE_ENABLED   */
 | 
			
		||||
#define HAL_SPI_MODULE_ENABLED
 | 
			
		||||
#define HAL_TIM_MODULE_ENABLED
 | 
			
		||||
#define HAL_UART_MODULE_ENABLED
 | 
			
		||||
/*#define HAL_UART_MODULE_ENABLED   */
 | 
			
		||||
/*#define HAL_USART_MODULE_ENABLED   */
 | 
			
		||||
/*#define HAL_IRDA_MODULE_ENABLED   */
 | 
			
		||||
/*#define HAL_SMARTCARD_MODULE_ENABLED   */
 | 
			
		||||
 | 
			
		||||
@ -1,31 +0,0 @@
 | 
			
		||||
#include "PWM_Control.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
uint8_t timer2_running = 0;
 | 
			
		||||
TIM_HandleTypeDef* pwmtimer2;
 | 
			
		||||
 | 
			
		||||
void PWMControl_init( TIM_HandleTypeDef* timer2) 
 | 
			
		||||
{
 | 
			
		||||
  pwmtimer2 = timer2;
 | 
			
		||||
  PWMControl_UpdatePWMs(0);
 | 
			
		||||
}
 | 
			
		||||
                         
 | 
			
		||||
 | 
			
		||||
 void PWMControl_UpdatePWMs(uint8_t pwrgndfans)
 | 
			
		||||
 
 | 
			
		||||
 {
 | 
			
		||||
 | 
			
		||||
  pwmtimer2->Instance->CCR3 = pwrgndfans << 8;
 | 
			
		||||
 | 
			
		||||
  if (timer2_running) {
 | 
			
		||||
    if ((pwrgndfans == 0)) {
 | 
			
		||||
      timer2_running = 0;
 | 
			
		||||
      HAL_TIM_PWM_Stop(pwmtimer2, TIM_CHANNEL_3); 
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
    if ( (pwrgndfans != 0)) {
 | 
			
		||||
      timer2_running = 1;
 | 
			
		||||
      HAL_TIM_PWM_Start(pwmtimer2, TIM_CHANNEL_3);       
 | 
			
		||||
}
 | 
			
		||||
} 
 | 
			
		||||
}               
 | 
			
		||||
@ -1,18 +1,16 @@
 | 
			
		||||
#include "PWM_control.h"
 | 
			
		||||
 | 
			
		||||
uint8_t battery_cooling_status;
 | 
			
		||||
//uint32_t powerground1_CCR, powerground2_CCR, battery_cooling_CCR;
 | 
			
		||||
 | 
			
		||||
TIM_HandleTypeDef* powerground, *battery_cooling;
 | 
			
		||||
TIM_HandleTypeDef *powerground, *battery_cooling, *esc_cooling;
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Pulse width modulation mode allows for generating a signal with a frequency determined by 
 | 
			
		||||
  the value of the TIMx_ARR register and a duty cycle determined by the value of the TIMx_CCRx register. 
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
void PWM_control_init(TIM_HandleTypeDef* pg, TIM_HandleTypeDef* bat_cool){
 | 
			
		||||
void PWM_control_init(TIM_HandleTypeDef* pg, TIM_HandleTypeDef* bat_cool, TIM_HandleTypeDef* esc_cool){
 | 
			
		||||
  powerground_status = 0;
 | 
			
		||||
  battery_cooling_status = 0;
 | 
			
		||||
 | 
			
		||||
  HAL_TIM_PWM_Start(pg, TIM_CHANNEL_1);          //TIM15CH1
 | 
			
		||||
  HAL_TIM_PWM_Start(pg, TIM_CHANNEL_2);          //TIM15CH2
 | 
			
		||||
@ -20,6 +18,8 @@ void PWM_control_init(TIM_HandleTypeDef* pg, TIM_HandleTypeDef* bat_cool){
 | 
			
		||||
 | 
			
		||||
  powerground = pg;
 | 
			
		||||
  battery_cooling = bat_cool;
 | 
			
		||||
  esc_cooling = esc_cool;
 | 
			
		||||
  
 | 
			
		||||
  __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_1, 2000);
 | 
			
		||||
  __HAL_TIM_SET_COMPARE(powerground, TIM_CHANNEL_2, 2000);
 | 
			
		||||
  //__HAL_TIM_SET_COMPARE(battery_cooling, TIM_CHANNEL_3, 2000);
 | 
			
		||||
@ -38,4 +38,5 @@ void PWM_powerground_control(uint8_t percent){
 | 
			
		||||
  //TIM15->CCR1 = (TIM15->ARR*POWERGROUND_MAX_DUTY_CYCLE-TIM15->ARR*POWERGROUND_MIN_DUTY_CYCLE) * (percent/100.0) + TIM15->ARR*POWERGROUND_MIN_DUTY_CYCLE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void PWM_battery_cooling_control(uint8_t percent){}
 | 
			
		||||
void PWM_battery_cooling_control(uint8_t percent){}
 | 
			
		||||
void PWM_esc_cooling(uint8_t percent){}
 | 
			
		||||
 | 
			
		||||
@ -1,273 +0,0 @@
 | 
			
		||||
#include "can-halal.h"
 | 
			
		||||
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#if defined(FTCAN_IS_BXCAN)
 | 
			
		||||
static CAN_HandleTypeDef *hcan;
 | 
			
		||||
 | 
			
		||||
HAL_StatusTypeDef ftcan_init(CAN_HandleTypeDef *handle) {
 | 
			
		||||
  hcan = handle;
 | 
			
		||||
 | 
			
		||||
  HAL_StatusTypeDef status =
 | 
			
		||||
      HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING);
 | 
			
		||||
  if (status != HAL_OK) {
 | 
			
		||||
    return status;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return HAL_CAN_Start(hcan);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
HAL_StatusTypeDef ftcan_transmit(uint16_t id, const uint8_t *data,
 | 
			
		||||
                                 size_t datalen) {
 | 
			
		||||
  static CAN_TxHeaderTypeDef header;
 | 
			
		||||
  header.StdId = id;
 | 
			
		||||
  header.IDE = CAN_ID_STD;
 | 
			
		||||
  header.RTR = CAN_RTR_DATA;
 | 
			
		||||
  header.DLC = datalen;
 | 
			
		||||
  uint32_t mailbox;
 | 
			
		||||
  return HAL_CAN_AddTxMessage(hcan, &header, data, &mailbox);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
HAL_StatusTypeDef ftcan_add_filter(uint16_t id, uint16_t mask) {
 | 
			
		||||
  static uint32_t next_filter_no = 0;
 | 
			
		||||
  static CAN_FilterTypeDef filter;
 | 
			
		||||
  if (next_filter_no % 2 == 0) {
 | 
			
		||||
    filter.FilterIdHigh = id << 5;
 | 
			
		||||
    filter.FilterMaskIdHigh = mask << 5;
 | 
			
		||||
    filter.FilterIdLow = id << 5;
 | 
			
		||||
    filter.FilterMaskIdLow = mask << 5;
 | 
			
		||||
  } else {
 | 
			
		||||
    // Leave high filter untouched from the last configuration
 | 
			
		||||
    filter.FilterIdLow = id << 5;
 | 
			
		||||
    filter.FilterMaskIdLow = mask << 5;
 | 
			
		||||
  }
 | 
			
		||||
  filter.FilterFIFOAssignment = CAN_FILTER_FIFO0;
 | 
			
		||||
  filter.FilterBank = next_filter_no / 2;
 | 
			
		||||
  if (filter.FilterBank > FTCAN_NUM_FILTERS + 1) {
 | 
			
		||||
    return HAL_ERROR;
 | 
			
		||||
  }
 | 
			
		||||
  filter.FilterMode = CAN_FILTERMODE_IDMASK;
 | 
			
		||||
  filter.FilterScale = CAN_FILTERSCALE_16BIT;
 | 
			
		||||
  filter.FilterActivation = CAN_FILTER_ENABLE;
 | 
			
		||||
 | 
			
		||||
  // Disable slave filters
 | 
			
		||||
  // TODO: Some STM32 have multiple CAN peripherals, and one uses the slave
 | 
			
		||||
  // filter bank
 | 
			
		||||
  filter.SlaveStartFilterBank = FTCAN_NUM_FILTERS;
 | 
			
		||||
 | 
			
		||||
  HAL_StatusTypeDef status = HAL_CAN_ConfigFilter(hcan, &filter);
 | 
			
		||||
  if (status == HAL_OK) {
 | 
			
		||||
    next_filter_no++;
 | 
			
		||||
  }
 | 
			
		||||
  return status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *handle) {
 | 
			
		||||
  if (handle != hcan) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
  CAN_RxHeaderTypeDef header;
 | 
			
		||||
  uint8_t data[8];
 | 
			
		||||
  if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &header, data) != HAL_OK) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (header.IDE != CAN_ID_STD) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ftcan_msg_received_cb(header.StdId, header.DLC, data);
 | 
			
		||||
}
 | 
			
		||||
#elif defined(FTCAN_IS_FDCAN)
 | 
			
		||||
static FDCAN_HandleTypeDef *hcan;
 | 
			
		||||
 | 
			
		||||
HAL_StatusTypeDef ftcan_init(FDCAN_HandleTypeDef *handle) {
 | 
			
		||||
  hcan = handle;
 | 
			
		||||
 | 
			
		||||
  HAL_StatusTypeDef status =
 | 
			
		||||
      HAL_FDCAN_ActivateNotification(hcan, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);
 | 
			
		||||
  if (status != HAL_OK) {
 | 
			
		||||
    return status;
 | 
			
		||||
  }
 | 
			
		||||
  // Reject non-matching messages
 | 
			
		||||
  status =
 | 
			
		||||
      HAL_FDCAN_ConfigGlobalFilter(hcan, FDCAN_REJECT, FDCAN_REJECT,
 | 
			
		||||
                                   FDCAN_REJECT_REMOTE, FDCAN_REJECT_REMOTE);
 | 
			
		||||
  if (status != HAL_OK) {
 | 
			
		||||
    return status;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return HAL_FDCAN_Start(hcan);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
HAL_StatusTypeDef ftcan_transmit(uint16_t id, const uint8_t *data,
 | 
			
		||||
                                 size_t datalen) {
 | 
			
		||||
  static FDCAN_TxHeaderTypeDef header;
 | 
			
		||||
  header.Identifier = id;
 | 
			
		||||
  header.IdType = FDCAN_STANDARD_ID;
 | 
			
		||||
  header.TxFrameType = FDCAN_DATA_FRAME;
 | 
			
		||||
  switch (datalen) {
 | 
			
		||||
  case 0:
 | 
			
		||||
    header.DataLength = FDCAN_DLC_BYTES_0;
 | 
			
		||||
    break;
 | 
			
		||||
  case 1:
 | 
			
		||||
    header.DataLength = FDCAN_DLC_BYTES_1;
 | 
			
		||||
    break;
 | 
			
		||||
  case 2:
 | 
			
		||||
    header.DataLength = FDCAN_DLC_BYTES_2;
 | 
			
		||||
    break;
 | 
			
		||||
  case 3:
 | 
			
		||||
    header.DataLength = FDCAN_DLC_BYTES_3;
 | 
			
		||||
    break;
 | 
			
		||||
  case 4:
 | 
			
		||||
    header.DataLength = FDCAN_DLC_BYTES_4;
 | 
			
		||||
    break;
 | 
			
		||||
  case 5:
 | 
			
		||||
    header.DataLength = FDCAN_DLC_BYTES_5;
 | 
			
		||||
    break;
 | 
			
		||||
  case 6:
 | 
			
		||||
    header.DataLength = FDCAN_DLC_BYTES_6;
 | 
			
		||||
    break;
 | 
			
		||||
  case 7:
 | 
			
		||||
    header.DataLength = FDCAN_DLC_BYTES_7;
 | 
			
		||||
    break;
 | 
			
		||||
  case 8:
 | 
			
		||||
  default:
 | 
			
		||||
    header.DataLength = FDCAN_DLC_BYTES_8;
 | 
			
		||||
    break;
 | 
			
		||||
  }
 | 
			
		||||
  header.ErrorStateIndicator = FDCAN_ESI_PASSIVE;
 | 
			
		||||
  header.BitRateSwitch = FDCAN_BRS_OFF;
 | 
			
		||||
  header.FDFormat = FDCAN_CLASSIC_CAN;
 | 
			
		||||
  header.TxEventFifoControl = FDCAN_NO_TX_EVENTS;
 | 
			
		||||
 | 
			
		||||
  // HAL_FDCAN_AddMessageToTxFifoQ doesn't modify the data, but it's not marked
 | 
			
		||||
  // as const for some reason.
 | 
			
		||||
  uint8_t *data_nonconst = (uint8_t *)data;
 | 
			
		||||
  return HAL_FDCAN_AddMessageToTxFifoQ(hcan, &header, data_nonconst);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
HAL_StatusTypeDef ftcan_add_filter(uint16_t id, uint16_t mask) {
 | 
			
		||||
  static uint32_t next_filter_no = 0;
 | 
			
		||||
  static FDCAN_FilterTypeDef filter;
 | 
			
		||||
  filter.IdType = FDCAN_STANDARD_ID;
 | 
			
		||||
  filter.FilterIndex = next_filter_no;
 | 
			
		||||
  if (filter.FilterIndex > FTCAN_NUM_FILTERS + 1) {
 | 
			
		||||
    return HAL_ERROR;
 | 
			
		||||
  }
 | 
			
		||||
  filter.FilterType = FDCAN_FILTER_MASK;
 | 
			
		||||
  filter.FilterConfig = FDCAN_FILTER_TO_RXFIFO0;
 | 
			
		||||
  filter.FilterID1 = id;
 | 
			
		||||
  filter.FilterID2 = mask;
 | 
			
		||||
 | 
			
		||||
  HAL_StatusTypeDef status = HAL_FDCAN_ConfigFilter(hcan, &filter);
 | 
			
		||||
  if (status == HAL_OK) {
 | 
			
		||||
    next_filter_no++;
 | 
			
		||||
  }
 | 
			
		||||
  return status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *handle,
 | 
			
		||||
                               uint32_t RxFifo0ITs) {
 | 
			
		||||
  if (handle != hcan || (RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE) == RESET) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static FDCAN_RxHeaderTypeDef header;
 | 
			
		||||
  static uint8_t data[8];
 | 
			
		||||
  if (HAL_FDCAN_GetRxMessage(hcan, FDCAN_RX_FIFO0, &header, data) != HAL_OK) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (header.FDFormat != FDCAN_CLASSIC_CAN ||
 | 
			
		||||
      header.RxFrameType != FDCAN_DATA_FRAME ||
 | 
			
		||||
      header.IdType != FDCAN_STANDARD_ID) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  size_t datalen;
 | 
			
		||||
  switch (header.DataLength) {
 | 
			
		||||
  case FDCAN_DLC_BYTES_0:
 | 
			
		||||
    datalen = 0;
 | 
			
		||||
    break;
 | 
			
		||||
  case FDCAN_DLC_BYTES_1:
 | 
			
		||||
    datalen = 1;
 | 
			
		||||
    break;
 | 
			
		||||
  case FDCAN_DLC_BYTES_2:
 | 
			
		||||
    datalen = 2;
 | 
			
		||||
    break;
 | 
			
		||||
  case FDCAN_DLC_BYTES_3:
 | 
			
		||||
    datalen = 3;
 | 
			
		||||
    break;
 | 
			
		||||
  case FDCAN_DLC_BYTES_4:
 | 
			
		||||
    datalen = 4;
 | 
			
		||||
    break;
 | 
			
		||||
  case FDCAN_DLC_BYTES_5:
 | 
			
		||||
    datalen = 5;
 | 
			
		||||
    break;
 | 
			
		||||
  case FDCAN_DLC_BYTES_6:
 | 
			
		||||
    datalen = 6;
 | 
			
		||||
    break;
 | 
			
		||||
  case FDCAN_DLC_BYTES_7:
 | 
			
		||||
    datalen = 7;
 | 
			
		||||
    break;
 | 
			
		||||
  case FDCAN_DLC_BYTES_8:
 | 
			
		||||
    datalen = 8;
 | 
			
		||||
    break;
 | 
			
		||||
  default:
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ftcan_msg_received_cb(header.Identifier, datalen, data);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
__weak void ftcan_msg_received_cb(uint16_t id, size_t datalen,
 | 
			
		||||
                                  const uint8_t *data) {}
 | 
			
		||||
 | 
			
		||||
uint64_t ftcan_unmarshal_unsigned(const uint8_t **data_ptr, size_t num_bytes) {
 | 
			
		||||
  if (num_bytes > 8) {
 | 
			
		||||
    num_bytes = 8;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const uint8_t *data = *data_ptr;
 | 
			
		||||
  uint64_t result = 0;
 | 
			
		||||
  for (size_t i = 0; i < num_bytes; i++) {
 | 
			
		||||
    result <<= 8;
 | 
			
		||||
    result |= data[i];
 | 
			
		||||
  }
 | 
			
		||||
  *data_ptr += num_bytes;
 | 
			
		||||
  return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int64_t ftcan_unmarshal_signed(const uint8_t **data_ptr, size_t num_bytes) {
 | 
			
		||||
  if (num_bytes > 8) {
 | 
			
		||||
    num_bytes = 8;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  uint64_t result_unsigned = ftcan_unmarshal_unsigned(data_ptr, num_bytes);
 | 
			
		||||
  // Sign extend by shifting left, then copying to a signed int and shifting
 | 
			
		||||
  // back to the right
 | 
			
		||||
  size_t diff_to_64 = 64 - num_bytes * 8;
 | 
			
		||||
  result_unsigned <<= diff_to_64;
 | 
			
		||||
  int64_t result;
 | 
			
		||||
  memcpy(&result, &result_unsigned, 8);
 | 
			
		||||
  return result >> diff_to_64;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t *ftcan_marshal_unsigned(uint8_t *data, uint64_t val, size_t num_bytes) {
 | 
			
		||||
  if (num_bytes > 8) {
 | 
			
		||||
    num_bytes = 8;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  for (int i = num_bytes - 1; i >= 0; i--) {
 | 
			
		||||
    data[i] = val & 0xFF;
 | 
			
		||||
    val >>= 8;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return data + num_bytes;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t *ftcan_marshal_signed(uint8_t *data, int64_t val, size_t num_bytes) {
 | 
			
		||||
  return ftcan_marshal_unsigned(data, val, num_bytes);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										389
									
								
								Core/Src/main.c
									
									
									
									
									
								
							
							
						
						
									
										389
									
								
								Core/Src/main.c
									
									
									
									
									
								
							@ -47,19 +47,25 @@
 | 
			
		||||
/* Private macro -------------------------------------------------------------*/
 | 
			
		||||
/* USER CODE BEGIN PM */
 | 
			
		||||
 | 
			
		||||
// htim2 CH3,4 BAT_COOLING_PWM,ENABLE
 | 
			
		||||
// htim3 CH3,4 ESC_L_PWM,R_PWM
 | 
			
		||||
// htim4 CH1,2,3 LED R,G,B
 | 
			
		||||
// htim15 CH1,2 ESC_COOLING_ENABLE,PWM
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PM */
 | 
			
		||||
 | 
			
		||||
/* Private variables ---------------------------------------------------------*/
 | 
			
		||||
CAN_HandleTypeDef hcan;
 | 
			
		||||
 | 
			
		||||
I2C_HandleTypeDef hi2c1;
 | 
			
		||||
I2C_HandleTypeDef hi2c2;
 | 
			
		||||
 | 
			
		||||
SPI_HandleTypeDef hspi1;
 | 
			
		||||
 | 
			
		||||
TIM_HandleTypeDef htim1;
 | 
			
		||||
TIM_HandleTypeDef htim2;
 | 
			
		||||
 | 
			
		||||
UART_HandleTypeDef huart1;
 | 
			
		||||
TIM_HandleTypeDef htim3;
 | 
			
		||||
TIM_HandleTypeDef htim4;
 | 
			
		||||
TIM_HandleTypeDef htim15;
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN PV */
 | 
			
		||||
 | 
			
		||||
@ -71,9 +77,11 @@ static void MX_GPIO_Init(void);
 | 
			
		||||
static void MX_CAN_Init(void);
 | 
			
		||||
static void MX_I2C1_Init(void);
 | 
			
		||||
static void MX_SPI1_Init(void);
 | 
			
		||||
static void MX_USART1_UART_Init(void);
 | 
			
		||||
static void MX_TIM1_Init(void);
 | 
			
		||||
static void MX_TIM15_Init(void);
 | 
			
		||||
static void MX_I2C2_Init(void);
 | 
			
		||||
static void MX_TIM2_Init(void);
 | 
			
		||||
static void MX_TIM3_Init(void);
 | 
			
		||||
static void MX_TIM4_Init(void);
 | 
			
		||||
/* USER CODE BEGIN PFP */
 | 
			
		||||
 | 
			
		||||
/* USER CODE END PFP */
 | 
			
		||||
@ -115,15 +123,17 @@ int main(void)
 | 
			
		||||
  MX_CAN_Init();
 | 
			
		||||
  MX_I2C1_Init();
 | 
			
		||||
  MX_SPI1_Init();
 | 
			
		||||
  MX_USART1_UART_Init();
 | 
			
		||||
  MX_TIM1_Init();
 | 
			
		||||
  MX_TIM15_Init();
 | 
			
		||||
  MX_I2C2_Init();
 | 
			
		||||
  MX_TIM2_Init();
 | 
			
		||||
  MX_TIM3_Init();
 | 
			
		||||
  MX_TIM4_Init();
 | 
			
		||||
  /* USER CODE BEGIN 2 */
 | 
			
		||||
  sm_init();
 | 
			
		||||
  tmp1075_init(&hi2c1);
 | 
			
		||||
  AMS_Init(&hspi1);
 | 
			
		||||
  can_init(&hcan);
 | 
			
		||||
  PWM_control_init(&htim15, &htim1);
 | 
			
		||||
  PWM_control_init(&htim3, &htim2, &htim15);
 | 
			
		||||
  HAL_Delay(10);
 | 
			
		||||
  /* USER CODE END 2 */
 | 
			
		||||
 | 
			
		||||
@ -178,11 +188,9 @@ void SystemClock_Config(void)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_I2C1
 | 
			
		||||
                              |RCC_PERIPHCLK_TIM1;
 | 
			
		||||
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
 | 
			
		||||
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1|RCC_PERIPHCLK_I2C2;
 | 
			
		||||
  PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_HSI;
 | 
			
		||||
  PeriphClkInit.Tim1ClockSelection = RCC_TIM1CLK_HCLK;
 | 
			
		||||
  PeriphClkInit.I2c2ClockSelection = RCC_I2C2CLKSOURCE_HSI;
 | 
			
		||||
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
@ -274,6 +282,54 @@ static void MX_I2C1_Init(void)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief I2C2 Initialization Function
 | 
			
		||||
  * @param None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
static void MX_I2C2_Init(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN I2C2_Init 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2C2_Init 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN I2C2_Init 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2C2_Init 1 */
 | 
			
		||||
  hi2c2.Instance = I2C2;
 | 
			
		||||
  hi2c2.Init.Timing = 0x2000090E;
 | 
			
		||||
  hi2c2.Init.OwnAddress1 = 0;
 | 
			
		||||
  hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
 | 
			
		||||
  hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
 | 
			
		||||
  hi2c2.Init.OwnAddress2 = 0;
 | 
			
		||||
  hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
 | 
			
		||||
  hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
 | 
			
		||||
  hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
 | 
			
		||||
  if (HAL_I2C_Init(&hi2c2) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /** Configure Analogue filter
 | 
			
		||||
  */
 | 
			
		||||
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /** Configure Digital filter
 | 
			
		||||
  */
 | 
			
		||||
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE BEGIN I2C2_Init 2 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2C2_Init 2 */
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief SPI1 Initialization Function
 | 
			
		||||
  * @param None
 | 
			
		||||
@ -314,76 +370,6 @@ static void MX_SPI1_Init(void)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief TIM1 Initialization Function
 | 
			
		||||
  * @param None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
static void MX_TIM1_Init(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM1_Init 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_Init 0 */
 | 
			
		||||
 | 
			
		||||
  TIM_MasterConfigTypeDef sMasterConfig = {0};
 | 
			
		||||
  TIM_OC_InitTypeDef sConfigOC = {0};
 | 
			
		||||
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM1_Init 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_Init 1 */
 | 
			
		||||
  htim1.Instance = TIM1;
 | 
			
		||||
  htim1.Init.Prescaler = 0;
 | 
			
		||||
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
 | 
			
		||||
  htim1.Init.Period = 65535;
 | 
			
		||||
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 | 
			
		||||
  htim1.Init.RepetitionCounter = 0;
 | 
			
		||||
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 | 
			
		||||
  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
 | 
			
		||||
  sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
 | 
			
		||||
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
 | 
			
		||||
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
 | 
			
		||||
  sConfigOC.Pulse = 0;
 | 
			
		||||
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
 | 
			
		||||
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
 | 
			
		||||
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
 | 
			
		||||
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
 | 
			
		||||
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
 | 
			
		||||
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
 | 
			
		||||
  sBreakDeadTimeConfig.DeadTime = 0;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakFilter = 0;
 | 
			
		||||
  sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
 | 
			
		||||
  sBreakDeadTimeConfig.Break2Filter = 0;
 | 
			
		||||
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
 | 
			
		||||
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE BEGIN TIM1_Init 2 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_Init 2 */
 | 
			
		||||
  HAL_TIM_MspPostInit(&htim1);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief TIM2 Initialization Function
 | 
			
		||||
  * @param None
 | 
			
		||||
@ -401,15 +387,14 @@ static void MX_TIM2_Init(void)
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM2_Init 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_Init 1 */
 | 
			
		||||
  htim15.Instance = TIM15;
 | 
			
		||||
  htim15.Init.Prescaler = 7;
 | 
			
		||||
  htim15.Init.CounterMode = TIM_COUNTERMODE_UP;
 | 
			
		||||
  htim15.Init.Period = 39999;
 | 
			
		||||
  htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 | 
			
		||||
  htim15.Init.RepetitionCounter = 0;
 | 
			
		||||
  htim15.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 | 
			
		||||
  if (HAL_TIM_PWM_Init(&htim15) != HAL_OK)
 | 
			
		||||
  /* USER CODE END TIM2_Init 1 */
 | 
			
		||||
  htim2.Instance = TIM2;
 | 
			
		||||
  htim2.Init.Prescaler = 0;
 | 
			
		||||
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
 | 
			
		||||
  htim2.Init.Period = 4294967295;
 | 
			
		||||
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 | 
			
		||||
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 | 
			
		||||
  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
@ -435,37 +420,182 @@ static void MX_TIM2_Init(void)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief USART1 Initialization Function
 | 
			
		||||
  * @brief TIM3 Initialization Function
 | 
			
		||||
  * @param None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
static void MX_USART1_UART_Init(void)
 | 
			
		||||
static void MX_TIM3_Init(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN USART1_Init 0 */
 | 
			
		||||
  /* USER CODE BEGIN TIM3_Init 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USART1_Init 0 */
 | 
			
		||||
  /* USER CODE END TIM3_Init 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN USART1_Init 1 */
 | 
			
		||||
  TIM_MasterConfigTypeDef sMasterConfig = {0};
 | 
			
		||||
  TIM_OC_InitTypeDef sConfigOC = {0};
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USART1_Init 1 */
 | 
			
		||||
  huart1.Instance = USART1;
 | 
			
		||||
  huart1.Init.BaudRate = 38400;
 | 
			
		||||
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
 | 
			
		||||
  huart1.Init.StopBits = UART_STOPBITS_1;
 | 
			
		||||
  huart1.Init.Parity = UART_PARITY_NONE;
 | 
			
		||||
  huart1.Init.Mode = UART_MODE_TX_RX;
 | 
			
		||||
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 | 
			
		||||
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
 | 
			
		||||
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
 | 
			
		||||
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
 | 
			
		||||
  if (HAL_UART_Init(&huart1) != HAL_OK)
 | 
			
		||||
  /* USER CODE BEGIN TIM3_Init 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM3_Init 1 */
 | 
			
		||||
  htim3.Instance = TIM3;
 | 
			
		||||
  htim3.Init.Prescaler = 0;
 | 
			
		||||
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
 | 
			
		||||
  htim3.Init.Period = 65535;
 | 
			
		||||
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 | 
			
		||||
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 | 
			
		||||
  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE BEGIN USART1_Init 2 */
 | 
			
		||||
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
 | 
			
		||||
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
 | 
			
		||||
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
 | 
			
		||||
  sConfigOC.Pulse = 0;
 | 
			
		||||
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
 | 
			
		||||
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
 | 
			
		||||
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE BEGIN TIM3_Init 2 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USART1_Init 2 */
 | 
			
		||||
  /* USER CODE END TIM3_Init 2 */
 | 
			
		||||
  HAL_TIM_MspPostInit(&htim3);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief TIM4 Initialization Function
 | 
			
		||||
  * @param None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
static void MX_TIM4_Init(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM4_Init 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM4_Init 0 */
 | 
			
		||||
 | 
			
		||||
  TIM_MasterConfigTypeDef sMasterConfig = {0};
 | 
			
		||||
  TIM_OC_InitTypeDef sConfigOC = {0};
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM4_Init 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM4_Init 1 */
 | 
			
		||||
  htim4.Instance = TIM4;
 | 
			
		||||
  htim4.Init.Prescaler = 0;
 | 
			
		||||
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
 | 
			
		||||
  htim4.Init.Period = 65535;
 | 
			
		||||
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 | 
			
		||||
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 | 
			
		||||
  if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
 | 
			
		||||
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
 | 
			
		||||
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
 | 
			
		||||
  sConfigOC.Pulse = 0;
 | 
			
		||||
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
 | 
			
		||||
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
 | 
			
		||||
  if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE BEGIN TIM4_Init 2 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM4_Init 2 */
 | 
			
		||||
  HAL_TIM_MspPostInit(&htim4);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
  * @brief TIM15 Initialization Function
 | 
			
		||||
  * @param None
 | 
			
		||||
  * @retval None
 | 
			
		||||
  */
 | 
			
		||||
static void MX_TIM15_Init(void)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM15_Init 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_Init 0 */
 | 
			
		||||
 | 
			
		||||
  TIM_MasterConfigTypeDef sMasterConfig = {0};
 | 
			
		||||
  TIM_OC_InitTypeDef sConfigOC = {0};
 | 
			
		||||
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM15_Init 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_Init 1 */
 | 
			
		||||
  htim15.Instance = TIM15;
 | 
			
		||||
  htim15.Init.Prescaler = 0;
 | 
			
		||||
  htim15.Init.CounterMode = TIM_COUNTERMODE_UP;
 | 
			
		||||
  htim15.Init.Period = 65535;
 | 
			
		||||
  htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 | 
			
		||||
  htim15.Init.RepetitionCounter = 0;
 | 
			
		||||
  htim15.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 | 
			
		||||
  if (HAL_TIM_PWM_Init(&htim15) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
 | 
			
		||||
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
 | 
			
		||||
  if (HAL_TIMEx_MasterConfigSynchronization(&htim15, &sMasterConfig) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
 | 
			
		||||
  sConfigOC.Pulse = 0;
 | 
			
		||||
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
 | 
			
		||||
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
 | 
			
		||||
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
 | 
			
		||||
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
 | 
			
		||||
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
 | 
			
		||||
  if (HAL_TIM_PWM_ConfigChannel(&htim15, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  if (HAL_TIM_PWM_ConfigChannel(&htim15, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
 | 
			
		||||
  sBreakDeadTimeConfig.DeadTime = 0;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
 | 
			
		||||
  sBreakDeadTimeConfig.BreakFilter = 0;
 | 
			
		||||
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
 | 
			
		||||
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim15, &sBreakDeadTimeConfig) != HAL_OK)
 | 
			
		||||
  {
 | 
			
		||||
    Error_Handler();
 | 
			
		||||
  }
 | 
			
		||||
  /* USER CODE BEGIN TIM15_Init 2 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_Init 2 */
 | 
			
		||||
  HAL_TIM_MspPostInit(&htim15);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -487,13 +617,10 @@ static void MX_GPIO_Init(void)
 | 
			
		||||
  __HAL_RCC_GPIOB_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin Output Level */
 | 
			
		||||
  HAL_GPIO_WritePin(GPIOA, RELAY_EN_Pin|_60V_EN_Pin|CSB_Pin, GPIO_PIN_RESET);
 | 
			
		||||
  HAL_GPIO_WritePin(GPIOA, CSB_Pin|EEPROM___WC__Pin, GPIO_PIN_RESET);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin Output Level */
 | 
			
		||||
  HAL_GPIO_WritePin(GPIOB, STATUS_LED_R_Pin|STATUS_LED_B_Pin|STATUS_LED_G_Pin, GPIO_PIN_SET);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pin Output Level */
 | 
			
		||||
  HAL_GPIO_WritePin(PRECHARGE_EN_GPIO_Port, PRECHARGE_EN_Pin, GPIO_PIN_RESET);
 | 
			
		||||
  HAL_GPIO_WritePin(GPIOB, BAT_COOLING_ENABLE_Pin|RELAY_ENABLE_Pin|PRECHARGE_ENABLE_Pin, GPIO_PIN_RESET);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : PC13 PC14 PC15 */
 | 
			
		||||
  GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
 | 
			
		||||
@ -501,33 +628,31 @@ static void MX_GPIO_Init(void)
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : RELAY_EN_Pin _60V_EN_Pin CSB_Pin */
 | 
			
		||||
  GPIO_InitStruct.Pin = RELAY_EN_Pin|_60V_EN_Pin|CSB_Pin;
 | 
			
		||||
  /*Configure GPIO pins : PA0 PA1 PA2 PA3 */
 | 
			
		||||
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : CSB_Pin EEPROM___WC__Pin */
 | 
			
		||||
  GPIO_InitStruct.Pin = CSB_Pin|EEPROM___WC__Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : STATUS_LED_R_Pin STATUS_LED_B_Pin STATUS_LED_G_Pin PRECHARGE_EN_Pin */
 | 
			
		||||
  GPIO_InitStruct.Pin = STATUS_LED_R_Pin|STATUS_LED_B_Pin|STATUS_LED_G_Pin|PRECHARGE_EN_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : PB10 PB12 PB13 PB14
 | 
			
		||||
                           PB4 PB5 PB8 */
 | 
			
		||||
  GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14
 | 
			
		||||
                          |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_8;
 | 
			
		||||
  /*Configure GPIO pins : PB2 PB12 PB13 */
 | 
			
		||||
  GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_12|GPIO_PIN_13;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /*Configure GPIO pins : RELAY_BATT_SIDE_ON_Pin RELAY_ESC_SIDE_ON_Pin CURRENT_SENSOR_ON_Pin */
 | 
			
		||||
  GPIO_InitStruct.Pin = RELAY_BATT_SIDE_ON_Pin|RELAY_ESC_SIDE_ON_Pin|CURRENT_SENSOR_ON_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 | 
			
		||||
  /*Configure GPIO pins : BAT_COOLING_ENABLE_Pin RELAY_ENABLE_Pin PRECHARGE_ENABLE_Pin */
 | 
			
		||||
  GPIO_InitStruct.Pin = BAT_COOLING_ENABLE_Pin|RELAY_ENABLE_Pin|PRECHARGE_ENABLE_Pin;
 | 
			
		||||
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 | 
			
		||||
  GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
/* USER CODE BEGIN MX_GPIO_Init_2 */
 | 
			
		||||
/* USER CODE END MX_GPIO_Init_2 */
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,7 @@
 | 
			
		||||
#include "AMS_HighLevel.h"
 | 
			
		||||
#include "TMP1075.h"
 | 
			
		||||
#include "errors.h"
 | 
			
		||||
#include "main.h"
 | 
			
		||||
#include "stm32f3xx_hal.h"
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
@ -189,11 +190,11 @@ void sm_set_relay(Relay relay, bool closed){
 | 
			
		||||
  GPIO_PinState state = closed ? GPIO_PIN_SET : GPIO_PIN_RESET;
 | 
			
		||||
  switch (relay) {
 | 
			
		||||
    case RELAY_MAIN:
 | 
			
		||||
      HAL_GPIO_WritePin(RELAY_EN_GPIO_Port, RELAY_EN_Pin, state);
 | 
			
		||||
      HAL_GPIO_WritePin(RELAY_ENABLE_GPIO_Port, RELAY_ENABLE_Pin, state);
 | 
			
		||||
      relay_closed = closed;
 | 
			
		||||
      break;
 | 
			
		||||
    case RELAY_PRECHARGE:
 | 
			
		||||
      HAL_GPIO_WritePin(PRECHARGE_EN_GPIO_Port, PRECHARGE_EN_Pin, state);
 | 
			
		||||
      HAL_GPIO_WritePin(PRECHARGE_ENABLE_GPIO_Port, PRECHARGE_ENABLE_Pin, state);
 | 
			
		||||
      precharge_closed = closed;
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -59,7 +59,7 @@
 | 
			
		||||
/* USER CODE END 0 */
 | 
			
		||||
 | 
			
		||||
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
 | 
			
		||||
                                        /**
 | 
			
		||||
                                                                                /**
 | 
			
		||||
  * Initializes the Global MSP.
 | 
			
		||||
  */
 | 
			
		||||
void HAL_MspInit(void)
 | 
			
		||||
@ -173,19 +173,19 @@ void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
 | 
			
		||||
    PA15     ------> I2C1_SCL
 | 
			
		||||
    PB9     ------> I2C1_SDA
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = GPIO_PIN_15;
 | 
			
		||||
    GPIO_InitStruct.Pin = TMP_SCL_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
 | 
			
		||||
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
    HAL_GPIO_Init(TMP_SCL_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
    GPIO_InitStruct.Pin = GPIO_PIN_9;
 | 
			
		||||
    GPIO_InitStruct.Pin = TMP_SDA_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
 | 
			
		||||
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
    HAL_GPIO_Init(TMP_SDA_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
    /* Peripheral clock enable */
 | 
			
		||||
    __HAL_RCC_I2C1_CLK_ENABLE();
 | 
			
		||||
@ -193,6 +193,30 @@ void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2C1_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(hi2c->Instance==I2C2)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN I2C2_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2C2_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOA_CLK_ENABLE();
 | 
			
		||||
    /**I2C2 GPIO Configuration
 | 
			
		||||
    PA9     ------> I2C2_SCL
 | 
			
		||||
    PA10     ------> I2C2_SDA
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = EEPROM_SCL_Pin|EEPROM_SDA_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C2;
 | 
			
		||||
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
    /* Peripheral clock enable */
 | 
			
		||||
    __HAL_RCC_I2C2_CLK_ENABLE();
 | 
			
		||||
  /* USER CODE BEGIN I2C2_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2C2_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -216,14 +240,34 @@ void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
 | 
			
		||||
    PA15     ------> I2C1_SCL
 | 
			
		||||
    PB9     ------> I2C1_SDA
 | 
			
		||||
    */
 | 
			
		||||
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_15);
 | 
			
		||||
    HAL_GPIO_DeInit(TMP_SCL_GPIO_Port, TMP_SCL_Pin);
 | 
			
		||||
 | 
			
		||||
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_9);
 | 
			
		||||
    HAL_GPIO_DeInit(TMP_SDA_GPIO_Port, TMP_SDA_Pin);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN I2C1_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2C1_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(hi2c->Instance==I2C2)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN I2C2_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2C2_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_I2C2_CLK_DISABLE();
 | 
			
		||||
 | 
			
		||||
    /**I2C2 GPIO Configuration
 | 
			
		||||
    PA9     ------> I2C2_SCL
 | 
			
		||||
    PA10     ------> I2C2_SDA
 | 
			
		||||
    */
 | 
			
		||||
    HAL_GPIO_DeInit(EEPROM_SCL_GPIO_Port, EEPROM_SCL_Pin);
 | 
			
		||||
 | 
			
		||||
    HAL_GPIO_DeInit(EEPROM_SDA_GPIO_Port, EEPROM_SDA_Pin);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN I2C2_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END I2C2_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -302,18 +346,7 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi)
 | 
			
		||||
*/
 | 
			
		||||
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)
 | 
			
		||||
{
 | 
			
		||||
  if(htim_pwm->Instance==TIM1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM1_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_MspInit 0 */
 | 
			
		||||
    /* Peripheral clock enable */
 | 
			
		||||
    __HAL_RCC_TIM1_CLK_ENABLE();
 | 
			
		||||
  /* USER CODE BEGIN TIM1_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(htim_pwm->Instance==TIM2)
 | 
			
		||||
  if(htim_pwm->Instance==TIM2)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM2_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
@ -324,53 +357,132 @@ void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM2_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(htim_pwm->Instance==TIM3)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM3_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM3_MspInit 0 */
 | 
			
		||||
    /* Peripheral clock enable */
 | 
			
		||||
    __HAL_RCC_TIM3_CLK_ENABLE();
 | 
			
		||||
  /* USER CODE BEGIN TIM3_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM3_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(htim_pwm->Instance==TIM4)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM4_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM4_MspInit 0 */
 | 
			
		||||
    /* Peripheral clock enable */
 | 
			
		||||
    __HAL_RCC_TIM4_CLK_ENABLE();
 | 
			
		||||
  /* USER CODE BEGIN TIM4_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM4_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(htim_pwm->Instance==TIM15)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM15_MspInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_MspInit 0 */
 | 
			
		||||
    /* Peripheral clock enable */
 | 
			
		||||
    __HAL_RCC_TIM15_CLK_ENABLE();
 | 
			
		||||
  /* USER CODE BEGIN TIM15_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
 | 
			
		||||
{
 | 
			
		||||
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 | 
			
		||||
  if(htim->Instance==TIM1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM1_MspPostInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_MspPostInit 0 */
 | 
			
		||||
    __HAL_RCC_GPIOB_CLK_ENABLE();
 | 
			
		||||
    /**TIM1 GPIO Configuration
 | 
			
		||||
    PB15     ------> TIM1_CH3N
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = PWM_Battery_Cooling_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF4_TIM1;
 | 
			
		||||
    HAL_GPIO_Init(PWM_Battery_Cooling_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM1_MspPostInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_MspPostInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(htim->Instance==TIM2)
 | 
			
		||||
  if(htim->Instance==TIM2)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM2_MspPostInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM2_MspPostInit 0 */
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOA_CLK_ENABLE();
 | 
			
		||||
    __HAL_RCC_GPIOB_CLK_ENABLE();
 | 
			
		||||
    /**TIM2 GPIO Configuration
 | 
			
		||||
    PA2     ------> TIM2_CH3
 | 
			
		||||
    PB10     ------> TIM2_CH3
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = GPIO_PIN_2;
 | 
			
		||||
    GPIO_InitStruct.Pin = BAT_COOLING_PWM_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM2;
 | 
			
		||||
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 | 
			
		||||
    HAL_GPIO_Init(BAT_COOLING_PWM_GPIO_Port, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM2_MspPostInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM2_MspPostInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(htim->Instance==TIM3)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM3_MspPostInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM3_MspPostInit 0 */
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOB_CLK_ENABLE();
 | 
			
		||||
    /**TIM3 GPIO Configuration
 | 
			
		||||
    PB0     ------> TIM3_CH3
 | 
			
		||||
    PB1     ------> TIM3_CH4
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = ESC_L_PWM_Pin|ESC_R_PWM_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
 | 
			
		||||
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM3_MspPostInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM3_MspPostInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(htim->Instance==TIM4)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM4_MspPostInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM4_MspPostInit 0 */
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOB_CLK_ENABLE();
 | 
			
		||||
    /**TIM4 GPIO Configuration
 | 
			
		||||
    PB6     ------> TIM4_CH1
 | 
			
		||||
    PB7     ------> TIM4_CH2
 | 
			
		||||
    PB8     ------> TIM4_CH3
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = STATUS_LED_R_Pin|STATUS_LED_G_Pin|STATUS_LED_B_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF2_TIM4;
 | 
			
		||||
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM4_MspPostInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM4_MspPostInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(htim->Instance==TIM15)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM15_MspPostInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_MspPostInit 0 */
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOB_CLK_ENABLE();
 | 
			
		||||
    /**TIM15 GPIO Configuration
 | 
			
		||||
    PB14     ------> TIM15_CH1
 | 
			
		||||
    PB15     ------> TIM15_CH2
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = ESC_COOLING_ENABLE_Pin|ESC_COOLING_PWM_Pin;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF1_TIM15;
 | 
			
		||||
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN TIM15_MspPostInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_MspPostInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
/**
 | 
			
		||||
@ -381,18 +493,7 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
 | 
			
		||||
*/
 | 
			
		||||
void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* htim_pwm)
 | 
			
		||||
{
 | 
			
		||||
  if(htim_pwm->Instance==TIM1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM1_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_TIM1_CLK_DISABLE();
 | 
			
		||||
  /* USER CODE BEGIN TIM1_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM1_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(htim_pwm->Instance==TIM2)
 | 
			
		||||
  if(htim_pwm->Instance==TIM2)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM2_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
@ -403,70 +504,38 @@ void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* htim_pwm)
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM2_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @brief UART MSP Initialization
 | 
			
		||||
* This function configures the hardware resources used in this example
 | 
			
		||||
* @param huart: UART handle pointer
 | 
			
		||||
* @retval None
 | 
			
		||||
*/
 | 
			
		||||
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
 | 
			
		||||
{
 | 
			
		||||
  GPIO_InitTypeDef GPIO_InitStruct = {0};
 | 
			
		||||
  if(huart->Instance==USART1)
 | 
			
		||||
  else if(htim_pwm->Instance==TIM3)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN USART1_MspInit 0 */
 | 
			
		||||
  /* USER CODE BEGIN TIM3_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USART1_MspInit 0 */
 | 
			
		||||
    /* Peripheral clock enable */
 | 
			
		||||
    __HAL_RCC_USART1_CLK_ENABLE();
 | 
			
		||||
 | 
			
		||||
    __HAL_RCC_GPIOB_CLK_ENABLE();
 | 
			
		||||
    /**USART1 GPIO Configuration
 | 
			
		||||
    PB6     ------> USART1_TX
 | 
			
		||||
    PB7     ------> USART1_RX
 | 
			
		||||
    */
 | 
			
		||||
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
 | 
			
		||||
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 | 
			
		||||
    GPIO_InitStruct.Pull = GPIO_NOPULL;
 | 
			
		||||
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
 | 
			
		||||
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
 | 
			
		||||
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN USART1_MspInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USART1_MspInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* @brief UART MSP De-Initialization
 | 
			
		||||
* This function freeze the hardware resources used in this example
 | 
			
		||||
* @param huart: UART handle pointer
 | 
			
		||||
* @retval None
 | 
			
		||||
*/
 | 
			
		||||
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
 | 
			
		||||
{
 | 
			
		||||
  if(huart->Instance==USART1)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN USART1_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USART1_MspDeInit 0 */
 | 
			
		||||
  /* USER CODE END TIM3_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_USART1_CLK_DISABLE();
 | 
			
		||||
    __HAL_RCC_TIM3_CLK_DISABLE();
 | 
			
		||||
  /* USER CODE BEGIN TIM3_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
    /**USART1 GPIO Configuration
 | 
			
		||||
    PB6     ------> USART1_TX
 | 
			
		||||
    PB7     ------> USART1_RX
 | 
			
		||||
    */
 | 
			
		||||
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
 | 
			
		||||
  /* USER CODE END TIM3_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(htim_pwm->Instance==TIM4)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM4_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE BEGIN USART1_MspDeInit 1 */
 | 
			
		||||
  /* USER CODE END TIM4_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_TIM4_CLK_DISABLE();
 | 
			
		||||
  /* USER CODE BEGIN TIM4_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END USART1_MspDeInit 1 */
 | 
			
		||||
  /* USER CODE END TIM4_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
  else if(htim_pwm->Instance==TIM15)
 | 
			
		||||
  {
 | 
			
		||||
  /* USER CODE BEGIN TIM15_MspDeInit 0 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_MspDeInit 0 */
 | 
			
		||||
    /* Peripheral clock disable */
 | 
			
		||||
    __HAL_RCC_TIM15_CLK_DISABLE();
 | 
			
		||||
  /* USER CODE BEGIN TIM15_MspDeInit 1 */
 | 
			
		||||
 | 
			
		||||
  /* USER CODE END TIM15_MspDeInit 1 */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user