Read switch & encoder
This commit is contained in:
parent
5014142b80
commit
b672a3e930
16
.mxproject
16
.mxproject
File diff suppressed because one or more lines are too long
@ -1,8 +1,10 @@
|
||||
#ifndef INC_DISPLAY_H
|
||||
#define INC_DISPLAY_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
void display_init();
|
||||
void display_update_voltage();
|
||||
void display_update_voltage(int32_t v);
|
||||
void display_update_state();
|
||||
void display_update();
|
||||
|
||||
|
@ -44,17 +44,33 @@ typedef enum {
|
||||
STATE_ERR_CHARGE,
|
||||
STATE_ERR_DISCHARGE
|
||||
} VPState;
|
||||
|
||||
typedef enum {
|
||||
ERR_NONE,
|
||||
ERR_BAT_GT_CHARGE,
|
||||
ERR_BAT_LT_DISCHARGE,
|
||||
ERR_VBAT_TOO_LOW,
|
||||
ERR_VCDC_TOO_LOW,
|
||||
ERR_OVERVOLTAGE,
|
||||
ERR_UNDERVOLTAGE,
|
||||
} ErrReason;
|
||||
/* USER CODE END ET */
|
||||
|
||||
/* Exported constants --------------------------------------------------------*/
|
||||
/* USER CODE BEGIN EC */
|
||||
extern float voltage;
|
||||
extern int32_t v_bat;
|
||||
extern int32_t v_charge_discharge;
|
||||
extern int32_t v_thresh;
|
||||
extern VPState state;
|
||||
extern ErrReason error;
|
||||
/* USER CODE END EC */
|
||||
|
||||
/* Exported macro ------------------------------------------------------------*/
|
||||
/* USER CODE BEGIN EM */
|
||||
|
||||
#define V_MIN_VOLT 1.0
|
||||
#define V_MIN (V_MIN_VOLT * 100) // 0.01V resolution
|
||||
#define V_MAX 11000 // 0.01V resolution
|
||||
#define DEBOUNCE_TIME 100
|
||||
/* USER CODE END EM */
|
||||
|
||||
/* Exported functions prototypes ---------------------------------------------*/
|
||||
@ -71,12 +87,8 @@ void Error_Handler(void);
|
||||
#define C_D_SEL_GPIO_Port GPIOB
|
||||
#define ENC_S_Pin GPIO_PIN_3
|
||||
#define ENC_S_GPIO_Port GPIOB
|
||||
#define ENC_A_Pin GPIO_PIN_4
|
||||
#define ENC_A_GPIO_Port GPIOB
|
||||
#define ENC_B_Pin GPIO_PIN_5
|
||||
#define ENC_B_GPIO_Port GPIOB
|
||||
#define UV_LED_Pin GPIO_PIN_7
|
||||
#define UV_LED_GPIO_Port GPIOB
|
||||
#define ERR_LED_Pin GPIO_PIN_7
|
||||
#define ERR_LED_GPIO_Port GPIOB
|
||||
|
||||
/* USER CODE BEGIN Private defines */
|
||||
|
||||
|
@ -49,7 +49,7 @@
|
||||
/*#define HAL_RNG_MODULE_ENABLED */
|
||||
/*#define HAL_RTC_MODULE_ENABLED */
|
||||
/*#define HAL_SPI_MODULE_ENABLED */
|
||||
/*#define HAL_TIM_MODULE_ENABLED */
|
||||
#define HAL_TIM_MODULE_ENABLED
|
||||
/*#define HAL_UART_MODULE_ENABLED */
|
||||
/*#define HAL_USART_MODULE_ENABLED */
|
||||
/*#define HAL_IRDA_MODULE_ENABLED */
|
||||
|
@ -7,38 +7,47 @@
|
||||
#include "ssd1306.h"
|
||||
#include "ssd1306_conf.h"
|
||||
|
||||
// printf("%f", ...) doesn't work on STM
|
||||
static int float_to_str(char *buf, size_t len, float val,
|
||||
size_t decimal_digits) {
|
||||
if (len < 2) {
|
||||
return 0;
|
||||
#define xstr(a) str(a)
|
||||
#define str(a) #a
|
||||
|
||||
static const char *err_msg(ErrReason err) {
|
||||
switch (err) {
|
||||
case ERR_NONE:
|
||||
return "UNKNOWN ERR";
|
||||
case ERR_BAT_GT_CHARGE:
|
||||
return "VBAT > VPSU";
|
||||
case ERR_BAT_LT_DISCHARGE:
|
||||
return "VBAT < VLOAD";
|
||||
case ERR_VBAT_TOO_LOW:
|
||||
return "VBAT < " xstr(V_MIN_VOLT);
|
||||
case ERR_VCDC_TOO_LOW:
|
||||
if (state == STATE_CHARGE || state == STATE_ERR_CHARGE ||
|
||||
state == STATE_SETUP_CHARGE) {
|
||||
return "VPSU < " xstr(V_MIN_VOLT);
|
||||
} else {
|
||||
return "VLOAD < " xstr(V_MIN_VOLT);
|
||||
}
|
||||
case ERR_OVERVOLTAGE:
|
||||
return "OVERVOLTAGE";
|
||||
case ERR_UNDERVOLTAGE:
|
||||
return "UNDERVOLTAGE";
|
||||
}
|
||||
|
||||
// len = NUL + decimal digits + . + integer digits
|
||||
int int_digits = len - decimal_digits - 2;
|
||||
|
||||
int chars = snprintf(buf, len, "%*d", int_digits, (int)val);
|
||||
buf[chars] = '.';
|
||||
chars++;
|
||||
|
||||
val -= (int)val;
|
||||
for (size_t i = 0; i < decimal_digits; i++) {
|
||||
val *= 10;
|
||||
}
|
||||
return chars + snprintf(buf + chars, len - chars, "%d", (int)val);
|
||||
return "UNKNOWN ERROR";
|
||||
}
|
||||
|
||||
void display_init() {
|
||||
ssd1306_Init();
|
||||
display_update_voltage();
|
||||
display_update_voltage(v_thresh);
|
||||
ssd1306_WriteChar('V', Font_16x26, White);
|
||||
display_update_state();
|
||||
ssd1306_UpdateScreen();
|
||||
}
|
||||
|
||||
void display_update_voltage() {
|
||||
void display_update_voltage(int32_t v) {
|
||||
char voltage_buf[7];
|
||||
float_to_str(voltage_buf, sizeof(voltage_buf), voltage, 2);
|
||||
char *ptr = voltage_buf;
|
||||
ptr += snprintf(ptr, 4, "%3d", v / 100);
|
||||
snprintf(ptr, 4, ".%02d", v % 100);
|
||||
ssd1306_SetCursor(0, 38);
|
||||
ssd1306_WriteString(voltage_buf, Font_16x26, White);
|
||||
}
|
||||
@ -46,6 +55,7 @@ void display_update_voltage() {
|
||||
void display_update_state() {
|
||||
switch (state) {
|
||||
case STATE_SETUP_CHARGE:
|
||||
display_update_voltage(v_thresh);
|
||||
ssd1306_FillRectangle(0, 0, SSD1306_WIDTH - 1, 30, Black);
|
||||
ssd1306_SetCursor(0, 0);
|
||||
ssd1306_WriteString("Charge", Font_6x8, White);
|
||||
@ -53,6 +63,7 @@ void display_update_state() {
|
||||
ssd1306_WriteString("Press to close relay", Font_6x8, White);
|
||||
break;
|
||||
case STATE_SETUP_DISCHARGE:
|
||||
display_update_voltage(v_thresh);
|
||||
ssd1306_FillRectangle(0, 0, SSD1306_WIDTH - 1, 30, Black);
|
||||
ssd1306_SetCursor(0, 0);
|
||||
ssd1306_WriteString("Discharge", Font_6x8, White);
|
||||
@ -60,34 +71,39 @@ void display_update_state() {
|
||||
ssd1306_WriteString("Press to close relay", Font_6x8, White);
|
||||
break;
|
||||
case STATE_CHARGE:
|
||||
display_update_voltage(v_bat);
|
||||
ssd1306_FillRectangle(0, 0, SSD1306_WIDTH - 1, 30, Black);
|
||||
ssd1306_SetCursor(0, 0);
|
||||
ssd1306_WriteString("CHARGING", Font_11x18, White);
|
||||
break;
|
||||
case STATE_DISCHARGE:
|
||||
display_update_voltage(v_bat);
|
||||
ssd1306_FillRectangle(0, 0, SSD1306_WIDTH - 1, 30, Black);
|
||||
ssd1306_SetCursor(0, 0);
|
||||
ssd1306_WriteString("DISCHARGING", Font_11x18, White);
|
||||
break;
|
||||
case STATE_ERR_CHARGE:
|
||||
display_update_voltage(v_bat);
|
||||
ssd1306_FillRectangle(0, 0, SSD1306_WIDTH - 1, 30, White);
|
||||
ssd1306_FillRectangle(3, 3, SSD1306_WIDTH - 1 - 3, 30 - 3, Black);
|
||||
ssd1306_SetCursor(10, 5);
|
||||
ssd1306_WriteString("OVERVOLTAGE", Font_6x8, White);
|
||||
ssd1306_WriteString("ERROR:", Font_6x8, White);
|
||||
ssd1306_SetCursor(10, 15);
|
||||
ssd1306_WriteString("DETECTED", Font_6x8, White);
|
||||
ssd1306_WriteString(err_msg(error), Font_6x8, White);
|
||||
break;
|
||||
case STATE_ERR_DISCHARGE:
|
||||
display_update_voltage(v_bat);
|
||||
ssd1306_FillRectangle(0, 0, SSD1306_WIDTH - 1, 30, White);
|
||||
ssd1306_FillRectangle(3, 3, SSD1306_WIDTH - 1 - 3, 30 - 3, Black);
|
||||
ssd1306_SetCursor(10, 5);
|
||||
ssd1306_WriteString("UNDERVOLTAGE", Font_6x8, White);
|
||||
ssd1306_WriteString("ERROR:", Font_6x8, White);
|
||||
ssd1306_SetCursor(10, 15);
|
||||
ssd1306_WriteString("DETECTED", Font_6x8, White);
|
||||
ssd1306_WriteString(err_msg(error), Font_6x8, White);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void display_update() {
|
||||
display_update_voltage();
|
||||
display_update_state();
|
||||
ssd1306_UpdateScreen();
|
||||
}
|
||||
|
236
Core/Src/main.c
236
Core/Src/main.c
@ -18,13 +18,15 @@
|
||||
/* USER CODE END Header */
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "main.h"
|
||||
#include "display.h"
|
||||
#include "stm32f0xx_hal.h"
|
||||
|
||||
/* Private includes ----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN Includes */
|
||||
#include "display.h"
|
||||
#include "ssd1306.h"
|
||||
#include "stm32f0xx_hal_gpio.h"
|
||||
#include "stm32f0xx_hal_tim.h"
|
||||
#include <stdio.h>
|
||||
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
@ -46,9 +48,14 @@ ADC_HandleTypeDef hadc;
|
||||
|
||||
I2C_HandleTypeDef hi2c1;
|
||||
|
||||
TIM_HandleTypeDef htim3;
|
||||
|
||||
/* USER CODE BEGIN PV */
|
||||
float voltage = 11.5;
|
||||
int32_t v_bat;
|
||||
int32_t v_charge_discharge;
|
||||
int32_t v_thresh = 1150;
|
||||
VPState state = STATE_SETUP_CHARGE;
|
||||
ErrReason error = ERR_NONE;
|
||||
/* USER CODE END PV */
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
@ -56,13 +63,140 @@ void SystemClock_Config(void);
|
||||
static void MX_GPIO_Init(void);
|
||||
static void MX_ADC_Init(void);
|
||||
static void MX_I2C1_Init(void);
|
||||
static void MX_TIM3_Init(void);
|
||||
/* USER CODE BEGIN PFP */
|
||||
|
||||
/* USER CODE END PFP */
|
||||
|
||||
/* Private user code ---------------------------------------------------------*/
|
||||
/* USER CODE BEGIN 0 */
|
||||
int switch_pressed() {
|
||||
static uint32_t last_press = 0;
|
||||
if (HAL_GPIO_ReadPin(ENC_S_GPIO_Port, ENC_S_Pin) == GPIO_PIN_RESET) {
|
||||
if (HAL_GetTick() - last_press > DEBOUNCE_TIME) {
|
||||
last_press = HAL_GetTick();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void update_thresh() {
|
||||
int16_t delta = htim3.Instance->CNT - 0x8000;
|
||||
delta /= 4;
|
||||
if (delta != 0) {
|
||||
// Clockwise should increase, so invert the sign here
|
||||
v_thresh -= delta * 10;
|
||||
if (v_thresh < V_MIN) {
|
||||
v_thresh = V_MIN;
|
||||
} else if (v_thresh > V_MAX) {
|
||||
v_thresh = V_MAX;
|
||||
}
|
||||
htim3.Instance->CNT -= delta * 4;
|
||||
}
|
||||
}
|
||||
|
||||
VPState update_setup_charge() {
|
||||
HAL_GPIO_WritePin(ERR_LED_GPIO_Port, ERR_LED_Pin, GPIO_PIN_RESET);
|
||||
HAL_GPIO_WritePin(RELAY_SET_GPIO_Port, RELAY_SET_Pin, GPIO_PIN_RESET);
|
||||
|
||||
update_thresh();
|
||||
|
||||
if (HAL_GPIO_ReadPin(C_D_SEL_GPIO_Port, C_D_SEL_Pin) == GPIO_PIN_RESET) {
|
||||
return STATE_SETUP_DISCHARGE;
|
||||
}
|
||||
|
||||
if (switch_pressed()) {
|
||||
if (v_bat > v_charge_discharge) {
|
||||
error = ERR_BAT_GT_CHARGE;
|
||||
return STATE_ERR_CHARGE;
|
||||
} else if (v_bat < V_MIN) {
|
||||
error = ERR_VBAT_TOO_LOW;
|
||||
return STATE_ERR_CHARGE;
|
||||
} else if (v_charge_discharge < V_MIN) {
|
||||
error = ERR_VCDC_TOO_LOW;
|
||||
return STATE_ERR_CHARGE;
|
||||
}
|
||||
return STATE_CHARGE;
|
||||
}
|
||||
return STATE_SETUP_CHARGE;
|
||||
}
|
||||
|
||||
VPState update_setup_discharge() {
|
||||
HAL_GPIO_WritePin(ERR_LED_GPIO_Port, ERR_LED_Pin, GPIO_PIN_RESET);
|
||||
HAL_GPIO_WritePin(RELAY_SET_GPIO_Port, RELAY_SET_Pin, GPIO_PIN_RESET);
|
||||
|
||||
update_thresh();
|
||||
|
||||
if (HAL_GPIO_ReadPin(C_D_SEL_GPIO_Port, C_D_SEL_Pin) == GPIO_PIN_SET) {
|
||||
return STATE_SETUP_CHARGE;
|
||||
}
|
||||
|
||||
if (switch_pressed()) {
|
||||
if (v_bat < v_charge_discharge) {
|
||||
error = ERR_BAT_LT_DISCHARGE;
|
||||
return STATE_ERR_DISCHARGE;
|
||||
} else if (v_bat < V_MIN) {
|
||||
error = ERR_VBAT_TOO_LOW;
|
||||
return STATE_ERR_DISCHARGE;
|
||||
} else if (v_charge_discharge < V_MIN) {
|
||||
error = ERR_VCDC_TOO_LOW;
|
||||
return STATE_ERR_DISCHARGE;
|
||||
}
|
||||
return STATE_DISCHARGE;
|
||||
}
|
||||
return STATE_SETUP_DISCHARGE;
|
||||
}
|
||||
|
||||
VPState update_charge() {
|
||||
HAL_GPIO_WritePin(ERR_LED_GPIO_Port, ERR_LED_Pin, GPIO_PIN_RESET);
|
||||
HAL_GPIO_WritePin(RELAY_SET_GPIO_Port, RELAY_SET_Pin, GPIO_PIN_SET);
|
||||
|
||||
if (v_bat < V_MIN) {
|
||||
error = ERR_VBAT_TOO_LOW;
|
||||
return STATE_ERR_CHARGE;
|
||||
} else if (v_bat > v_thresh) {
|
||||
error = ERR_OVERVOLTAGE;
|
||||
return STATE_ERR_CHARGE;
|
||||
}
|
||||
return STATE_CHARGE;
|
||||
}
|
||||
|
||||
VPState update_discharge() {
|
||||
HAL_GPIO_WritePin(ERR_LED_GPIO_Port, ERR_LED_Pin, GPIO_PIN_RESET);
|
||||
HAL_GPIO_WritePin(RELAY_SET_GPIO_Port, RELAY_SET_Pin, GPIO_PIN_SET);
|
||||
|
||||
if (v_bat < V_MIN) {
|
||||
error = ERR_VBAT_TOO_LOW;
|
||||
return STATE_ERR_DISCHARGE;
|
||||
} else if (v_bat < v_thresh) {
|
||||
error = ERR_UNDERVOLTAGE;
|
||||
return STATE_ERR_DISCHARGE;
|
||||
}
|
||||
return STATE_DISCHARGE;
|
||||
}
|
||||
|
||||
VPState update_err_charge() {
|
||||
HAL_GPIO_WritePin(ERR_LED_GPIO_Port, ERR_LED_Pin, GPIO_PIN_SET);
|
||||
HAL_GPIO_WritePin(RELAY_SET_GPIO_Port, RELAY_SET_Pin, GPIO_PIN_RESET);
|
||||
|
||||
if (switch_pressed()) {
|
||||
error = ERR_NONE;
|
||||
return STATE_SETUP_CHARGE;
|
||||
}
|
||||
return STATE_ERR_CHARGE;
|
||||
}
|
||||
|
||||
VPState update_err_discharge() {
|
||||
HAL_GPIO_WritePin(ERR_LED_GPIO_Port, ERR_LED_Pin, GPIO_PIN_SET);
|
||||
HAL_GPIO_WritePin(RELAY_SET_GPIO_Port, RELAY_SET_Pin, GPIO_PIN_RESET);
|
||||
|
||||
if (switch_pressed()) {
|
||||
error = ERR_NONE;
|
||||
return STATE_SETUP_DISCHARGE;
|
||||
}
|
||||
return STATE_ERR_DISCHARGE;
|
||||
}
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/**
|
||||
@ -95,7 +229,10 @@ int main(void) {
|
||||
MX_GPIO_Init();
|
||||
MX_ADC_Init();
|
||||
MX_I2C1_Init();
|
||||
MX_TIM3_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
htim3.Instance->CNT = 0x8000;
|
||||
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
|
||||
display_init();
|
||||
/* USER CODE END 2 */
|
||||
|
||||
@ -103,17 +240,30 @@ int main(void) {
|
||||
/* USER CODE BEGIN WHILE */
|
||||
while (1) {
|
||||
/* USER CODE END WHILE */
|
||||
|
||||
/* USER CODE BEGIN 3 */
|
||||
voltage += 1;
|
||||
if (HAL_GetTick() > 3000) {
|
||||
state = STATE_DISCHARGE;
|
||||
} else if (HAL_GetTick() > 2000) {
|
||||
state = STATE_ERR_CHARGE;
|
||||
} else if (HAL_GetTick() > 1000) {
|
||||
state = STATE_CHARGE;
|
||||
switch (state) {
|
||||
case STATE_SETUP_CHARGE:
|
||||
state = update_setup_charge();
|
||||
break;
|
||||
case STATE_SETUP_DISCHARGE:
|
||||
state = update_setup_discharge();
|
||||
break;
|
||||
case STATE_CHARGE:
|
||||
state = update_charge();
|
||||
break;
|
||||
case STATE_DISCHARGE:
|
||||
state = update_discharge();
|
||||
break;
|
||||
case STATE_ERR_CHARGE:
|
||||
state = update_err_charge();
|
||||
break;
|
||||
case STATE_ERR_DISCHARGE:
|
||||
state = update_err_discharge();
|
||||
break;
|
||||
}
|
||||
display_update();
|
||||
HAL_Delay(100);
|
||||
HAL_Delay(10);
|
||||
}
|
||||
/* USER CODE END 3 */
|
||||
}
|
||||
@ -262,6 +412,51 @@ static void MX_I2C1_Init(void) {
|
||||
/* USER CODE END I2C1_Init 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief TIM3 Initialization Function
|
||||
* @param None
|
||||
* @retval None
|
||||
*/
|
||||
static void MX_TIM3_Init(void) {
|
||||
|
||||
/* USER CODE BEGIN TIM3_Init 0 */
|
||||
|
||||
/* USER CODE END TIM3_Init 0 */
|
||||
|
||||
TIM_Encoder_InitTypeDef sConfig = {0};
|
||||
TIM_MasterConfigTypeDef sMasterConfig = {0};
|
||||
|
||||
/* 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;
|
||||
sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
|
||||
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
|
||||
sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
|
||||
sConfig.IC1Prescaler = TIM_ICPSC_DIV2;
|
||||
sConfig.IC1Filter = 10;
|
||||
sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
|
||||
sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
|
||||
sConfig.IC2Prescaler = TIM_ICPSC_DIV2;
|
||||
sConfig.IC2Filter = 10;
|
||||
if (HAL_TIM_Encoder_Init(&htim3, &sConfig) != HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
|
||||
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
||||
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
/* USER CODE BEGIN TIM3_Init 2 */
|
||||
|
||||
/* USER CODE END TIM3_Init 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief GPIO Initialization Function
|
||||
* @param None
|
||||
@ -269,6 +464,8 @@ static void MX_I2C1_Init(void) {
|
||||
*/
|
||||
static void MX_GPIO_Init(void) {
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
/* USER CODE BEGIN MX_GPIO_Init_1 */
|
||||
/* USER CODE END MX_GPIO_Init_1 */
|
||||
|
||||
/* GPIO Ports Clock Enable */
|
||||
__HAL_RCC_GPIOF_CLK_ENABLE();
|
||||
@ -279,7 +476,7 @@ static void MX_GPIO_Init(void) {
|
||||
HAL_GPIO_WritePin(RELAY_SET_GPIO_Port, RELAY_SET_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pin Output Level */
|
||||
HAL_GPIO_WritePin(UV_LED_GPIO_Port, UV_LED_Pin, GPIO_PIN_RESET);
|
||||
HAL_GPIO_WritePin(ERR_LED_GPIO_Port, ERR_LED_Pin, GPIO_PIN_RESET);
|
||||
|
||||
/*Configure GPIO pin : RELAY_SET_Pin */
|
||||
GPIO_InitStruct.Pin = RELAY_SET_Pin;
|
||||
@ -288,18 +485,21 @@ static void MX_GPIO_Init(void) {
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(RELAY_SET_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pins : C_D_SEL_Pin ENC_S_Pin ENC_A_Pin ENC_B_Pin */
|
||||
GPIO_InitStruct.Pin = C_D_SEL_Pin | ENC_S_Pin | ENC_A_Pin | ENC_B_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||
/*Configure GPIO pins : C_D_SEL_Pin ENC_S_Pin */
|
||||
GPIO_InitStruct.Pin = C_D_SEL_Pin | ENC_S_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/*Configure GPIO pin : UV_LED_Pin */
|
||||
GPIO_InitStruct.Pin = UV_LED_Pin;
|
||||
/*Configure GPIO pin : ERR_LED_Pin */
|
||||
GPIO_InitStruct.Pin = ERR_LED_Pin;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
HAL_GPIO_Init(UV_LED_GPIO_Port, &GPIO_InitStruct);
|
||||
HAL_GPIO_Init(ERR_LED_GPIO_Port, &GPIO_InitStruct);
|
||||
|
||||
/* USER CODE BEGIN MX_GPIO_Init_2 */
|
||||
/* USER CODE END MX_GPIO_Init_2 */
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 4 */
|
||||
|
@ -206,6 +206,71 @@ void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief TIM_Encoder MSP Initialization
|
||||
* This function configures the hardware resources used in this example
|
||||
* @param htim_encoder: TIM_Encoder handle pointer
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* htim_encoder)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
if(htim_encoder->Instance==TIM3)
|
||||
{
|
||||
/* USER CODE BEGIN TIM3_MspInit 0 */
|
||||
|
||||
/* USER CODE END TIM3_MspInit 0 */
|
||||
/* Peripheral clock enable */
|
||||
__HAL_RCC_TIM3_CLK_ENABLE();
|
||||
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE();
|
||||
/**TIM3 GPIO Configuration
|
||||
PB4 ------> TIM3_CH1
|
||||
PB5 ------> TIM3_CH2
|
||||
*/
|
||||
GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||
GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/* USER CODE BEGIN TIM3_MspInit 1 */
|
||||
|
||||
/* USER CODE END TIM3_MspInit 1 */
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief TIM_Encoder MSP De-Initialization
|
||||
* This function freeze the hardware resources used in this example
|
||||
* @param htim_encoder: TIM_Encoder handle pointer
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef* htim_encoder)
|
||||
{
|
||||
if(htim_encoder->Instance==TIM3)
|
||||
{
|
||||
/* USER CODE BEGIN TIM3_MspDeInit 0 */
|
||||
|
||||
/* USER CODE END TIM3_MspDeInit 0 */
|
||||
/* Peripheral clock disable */
|
||||
__HAL_RCC_TIM3_CLK_DISABLE();
|
||||
|
||||
/**TIM3 GPIO Configuration
|
||||
PB4 ------> TIM3_CH1
|
||||
PB5 ------> TIM3_CH2
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_4|GPIO_PIN_5);
|
||||
|
||||
/* USER CODE BEGIN TIM3_MspDeInit 1 */
|
||||
|
||||
/* USER CODE END TIM3_MspDeInit 1 */
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
/* USER CODE END 1 */
|
||||
|
64
Makefile
64
Makefile
@ -1,5 +1,5 @@
|
||||
##########################################################################################################################
|
||||
# File automatically-generated by tool: [projectgenerator] version: [3.18.0-B7] date: [Fri Mar 10 18:58:36 CET 2023]
|
||||
# File automatically-generated by tool: [projectgenerator] version: [3.19.2] date: [Tue Apr 11 18:36:37 CEST 2023]
|
||||
##########################################################################################################################
|
||||
|
||||
# ------------------------------------------------
|
||||
@ -35,31 +35,31 @@ BUILD_DIR = build
|
||||
# source
|
||||
######################################
|
||||
# C sources
|
||||
C_SOURCES = \
|
||||
Core/Src/main.c \
|
||||
Core/Src/stm32f0xx_it.c \
|
||||
Core/Src/stm32f0xx_hal_msp.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_adc.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_adc_ex.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rcc.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rcc_ex.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_i2c.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_i2c_ex.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_gpio.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_dma.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_cortex.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_pwr.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_pwr_ex.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_flash.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_flash_ex.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_exti.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_tim.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_tim_ex.c \
|
||||
Core/Src/system_stm32f0xx.c
|
||||
C_SOURCES = \
|
||||
Core/Src/main.c \
|
||||
Core/Src/stm32f0xx_it.c \
|
||||
Core/Src/stm32f0xx_hal_msp.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_adc.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_adc_ex.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rcc.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rcc_ex.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_i2c.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_i2c_ex.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_gpio.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_dma.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_cortex.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_pwr.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_pwr_ex.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_flash.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_flash_ex.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_exti.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_tim.c \
|
||||
Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_tim_ex.c \
|
||||
Core/Src/system_stm32f0xx.c
|
||||
|
||||
# ASM sources
|
||||
ASM_SOURCES = \
|
||||
ASM_SOURCES = \
|
||||
startup_stm32f042x6.s
|
||||
|
||||
|
||||
@ -103,8 +103,8 @@ MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)
|
||||
AS_DEFS =
|
||||
|
||||
# C defines
|
||||
C_DEFS = \
|
||||
-DUSE_HAL_DRIVER \
|
||||
C_DEFS = \
|
||||
-DUSE_HAL_DRIVER \
|
||||
-DSTM32F042x6
|
||||
|
||||
|
||||
@ -112,11 +112,11 @@ C_DEFS = \
|
||||
AS_INCLUDES =
|
||||
|
||||
# C includes
|
||||
C_INCLUDES = \
|
||||
-ICore/Inc \
|
||||
-IDrivers/STM32F0xx_HAL_Driver/Inc \
|
||||
-IDrivers/STM32F0xx_HAL_Driver/Inc/Legacy \
|
||||
-IDrivers/CMSIS/Device/ST/STM32F0xx/Include \
|
||||
C_INCLUDES = \
|
||||
-ICore/Inc \
|
||||
-IDrivers/STM32F0xx_HAL_Driver/Inc \
|
||||
-IDrivers/STM32F0xx_HAL_Driver/Inc/Legacy \
|
||||
-IDrivers/CMSIS/Device/ST/STM32F0xx/Include \
|
||||
-IDrivers/CMSIS/Include
|
||||
|
||||
|
||||
@ -189,4 +189,4 @@ clean:
|
||||
#######################################
|
||||
-include $(wildcard $(BUILD_DIR)/*.d)
|
||||
|
||||
# *** EOF ***
|
||||
# *** EOF ***
|
||||
|
@ -191,8 +191,14 @@ vpath %.cpp $(sort $(dir $(CPP_SOURCES)))
|
||||
# list of C objects
|
||||
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
|
||||
vpath %.c $(sort $(dir $(C_SOURCES)))
|
||||
|
||||
# list of ASM program objects
|
||||
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))
|
||||
# list of ASM program objects
|
||||
UPPER_CASE_ASM_SOURCES = $(filter %.S,$(ASM_SOURCES))
|
||||
LOWER_CASE_ASM_SOURCES = $(filter %.s,$(ASM_SOURCES))
|
||||
|
||||
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(UPPER_CASE_ASM_SOURCES:.S=.o)))
|
||||
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(LOWER_CASE_ASM_SOURCES:.s=.o)))
|
||||
vpath %.s $(sort $(dir $(ASM_SOURCES)))
|
||||
|
||||
$(BUILD_DIR)/%.o: %.cpp STM32Make.make | $(BUILD_DIR)
|
||||
@ -207,6 +213,9 @@ $(BUILD_DIR)/%.o: %.c STM32Make.make | $(BUILD_DIR)
|
||||
$(BUILD_DIR)/%.o: %.s STM32Make.make | $(BUILD_DIR)
|
||||
$(AS) -c $(CFLAGS) $< -o $@
|
||||
|
||||
$(BUILD_DIR)/%.o: %.S STM32Make.make | $(BUILD_DIR)
|
||||
$(AS) -c $(CFLAGS) $< -o $@
|
||||
|
||||
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) STM32Make.make
|
||||
$(CC) $(OBJECTS) $(LDFLAGS) -o $@
|
||||
$(SZ) $@
|
||||
|
@ -12,7 +12,8 @@ Mcu.IP1=I2C1
|
||||
Mcu.IP2=NVIC
|
||||
Mcu.IP3=RCC
|
||||
Mcu.IP4=SYS
|
||||
Mcu.IPNb=5
|
||||
Mcu.IP5=TIM3
|
||||
Mcu.IPNb=6
|
||||
Mcu.Name=STM32F042K(4-6)Tx
|
||||
Mcu.Package=LQFP32
|
||||
Mcu.Pin0=PF0-OSC_IN
|
||||
@ -33,8 +34,8 @@ Mcu.PinsNb=14
|
||||
Mcu.ThirdPartyNb=0
|
||||
Mcu.UserConstants=
|
||||
Mcu.UserName=STM32F042K6Tx
|
||||
MxCube.Version=6.7.0
|
||||
MxDb.Version=DB.6.0.70
|
||||
MxCube.Version=6.8.0
|
||||
MxDb.Version=DB.6.0.80
|
||||
NVIC.ForceEnableDMAVector=true
|
||||
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
@ -56,21 +57,17 @@ PA2.Signal=GPIO_Output
|
||||
PB0.GPIOParameters=GPIO_Label
|
||||
PB0.GPIO_Label=C_D_SEL
|
||||
PB0.Locked=true
|
||||
PB0.Signal=GPIO_Input
|
||||
PB0.Signal=GPXTI0
|
||||
PB3.GPIOParameters=GPIO_Label
|
||||
PB3.GPIO_Label=ENC_S
|
||||
PB3.Locked=true
|
||||
PB3.Signal=GPIO_Input
|
||||
PB4.GPIOParameters=GPIO_Label
|
||||
PB4.GPIO_Label=ENC_A
|
||||
PB3.Signal=GPXTI3
|
||||
PB4.Locked=true
|
||||
PB4.Signal=GPIO_Input
|
||||
PB5.GPIOParameters=GPIO_Label
|
||||
PB5.GPIO_Label=ENC_B
|
||||
PB4.Signal=S_TIM3_CH1
|
||||
PB5.Locked=true
|
||||
PB5.Signal=GPIO_Input
|
||||
PB5.Signal=S_TIM3_CH2
|
||||
PB7.GPIOParameters=GPIO_Label
|
||||
PB7.GPIO_Label=UV_LED
|
||||
PB7.GPIO_Label=ERR_LED
|
||||
PB7.Locked=true
|
||||
PB7.Signal=GPIO_Output
|
||||
PB8.Locked=true
|
||||
@ -101,12 +98,13 @@ ProjectManager.PreviousToolchain=
|
||||
ProjectManager.ProjectBuild=false
|
||||
ProjectManager.ProjectFileName=VoltageProtector.ioc
|
||||
ProjectManager.ProjectName=VoltageProtector
|
||||
ProjectManager.ProjectStructure=
|
||||
ProjectManager.RegisterCallBack=
|
||||
ProjectManager.StackSize=0x400
|
||||
ProjectManager.TargetToolchain=Makefile
|
||||
ProjectManager.ToolChainLocation=
|
||||
ProjectManager.UnderRoot=false
|
||||
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_ADC_Init-ADC-false-HAL-true,4-MX_I2C1_Init-I2C1-false-HAL-true
|
||||
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_ADC_Init-ADC-false-HAL-true,4-MX_I2C1_Init-I2C1-false-HAL-true,5-MX_TIM3_Init-TIM3-false-HAL-true
|
||||
RCC.AHBFreq_Value=48000000
|
||||
RCC.APB1Freq_Value=48000000
|
||||
RCC.APB1TimFreq_Value=48000000
|
||||
@ -125,6 +123,24 @@ RCC.SYSCLKSource=RCC_SYSCLKSOURCE_HSI48
|
||||
RCC.TimSysFreq_Value=48000000
|
||||
RCC.USART1Freq_Value=48000000
|
||||
RCC.VCOOutput2Freq_Value=8000000
|
||||
SH.GPXTI0.0=GPIO_EXTI0
|
||||
SH.GPXTI0.ConfNb=1
|
||||
SH.GPXTI3.0=GPIO_EXTI3
|
||||
SH.GPXTI3.ConfNb=1
|
||||
SH.S_TIM3_CH1.0=TIM3_CH1,Encoder_Interface
|
||||
SH.S_TIM3_CH1.ConfNb=1
|
||||
SH.S_TIM3_CH2.0=TIM3_CH2,Encoder_Interface
|
||||
SH.S_TIM3_CH2.ConfNb=1
|
||||
TIM3.ClockDivision=TIM_CLOCKDIVISION_DIV1
|
||||
TIM3.EncoderMode=TIM_ENCODERMODE_TI12
|
||||
TIM3.IC1Filter=10
|
||||
TIM3.IC1Polarity=TIM_ICPOLARITY_RISING
|
||||
TIM3.IC1Prescaler=TIM_ICPSC_DIV2
|
||||
TIM3.IC2Filter=10
|
||||
TIM3.IC2Polarity=TIM_ICPOLARITY_RISING
|
||||
TIM3.IC2Prescaler=TIM_ICPSC_DIV2
|
||||
TIM3.IPParameters=EncoderMode,IC1Polarity,IC2Polarity,IC1Filter,IC2Filter,ClockDivision,Prescaler,IC1Prescaler,IC2Prescaler
|
||||
TIM3.Prescaler=0
|
||||
VP_SYS_VS_Systick.Mode=SysTick
|
||||
VP_SYS_VS_Systick.Signal=SYS_VS_Systick
|
||||
board=custom
|
||||
|
Loading…
x
Reference in New Issue
Block a user