Compare commits

...

3 Commits

Author SHA1 Message Date
b61a11b4fe Куча всего
1.В Keil добавлен таргет для тестирования прошивки на STM32F417
2. Матлаб все еще не до конца понятно как имено построить модель чтобы токи не подлетали от малейшего открытия тиристоров
2025-11-19 02:19:30 +03:00
5d8dc1183b Ничего не понятно. При регулировании и плавном уменьшении угла ток в какой-то момент резко взлетает и все уходит в колебательный процесс. 2025-11-18 23:45:03 +03:00
e1d6f1139d чебля 2025-11-18 22:30:20 +03:00
41 changed files with 2475 additions and 341 deletions

2
.gitignore vendored
View File

@ -62,3 +62,5 @@ JLinkLog.txt
/MATLAB/MCU.lib
/MATLAB/MCU.mexw64.manifest
/MATLAB/upp_r2023.slx.autosave
/UPP/MDK-ARM/DebugConfig/
/UPP/MDK-ARM/Debug_F417

View File

@ -421,6 +421,7 @@ void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState Pin
{
GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U;
}
__GPIO_BSRR_Sim(GPIOx);
}
/**
@ -442,6 +443,7 @@ void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
/* Set selected pins that were at low level, and reset ones that were high */
GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin);
__GPIO_BSRR_Sim(GPIOx);
}
/**

View File

@ -16,6 +16,18 @@ void Simulate_GPIO_BSRR(void)
#ifdef GPIOD
__GPIO_BSRR_Sim(GPIOD);
#endif
#ifdef GPIOE
__GPIO_BSRR_Sim(GPIOE);
#endif
#ifdef GPIOF
__GPIO_BSRR_Sim(GPIOF);
#endif
#ifdef GPIOG
__GPIO_BSRR_Sim(GPIOG);
#endif
#ifdef GPIOH
__GPIO_BSRR_Sim(GPIOH);
#endif
}

View File

@ -26,6 +26,7 @@ void Simulate_Periph_Sim(void)
{
Simulate_TIMs();
Simulate_ADCs();
Simulate_GPIO_BSRR();
}
// MCU PERIPH DEINIT

View File

@ -37,9 +37,10 @@ const int inOffsets[IN_PORT_NUMB] = {
*/
const int outLengths[OUT_PORT_NUMB] = {
THYR_PORT_1_WIDTH,
PM_PORT_2_WIDTH,
ANGLE_PORT_3_WIDTH,
OUT_PORT_4_WIDTH
DO_PORT_2_WIDTH,
PM_PORT_3_WIDTH,
ANGLE_PORT_4_WIDTH,
OUT_PORT_5_WIDTH
};
/**
* @brief Таблица смещений в выходном массиве OUT
@ -48,7 +49,8 @@ const int outOffsets[OUT_PORT_NUMB] = {
OFFSET_OUT_ARRAY_1,
OFFSET_OUT_ARRAY_2,
OFFSET_OUT_ARRAY_3,
OFFSET_OUT_ARRAY_4
OFFSET_OUT_ARRAY_4,
OFFSET_OUT_ARRAY_5
};
// INPUT/OUTPUTS AUTO-PARAMS END

View File

@ -57,11 +57,12 @@
#define ADC_PORT_1_WIDTH 6
#define IN_PORT_2_WIDTH 16
#define OUT_PORT_NUMB 4
#define OUT_PORT_NUMB 5
#define THYR_PORT_1_WIDTH 6
#define PM_PORT_2_WIDTH 32
#define ANGLE_PORT_3_WIDTH 16
#define OUT_PORT_4_WIDTH 16
#define DO_PORT_2_WIDTH 3
#define PM_PORT_3_WIDTH 32
#define ANGLE_PORT_4_WIDTH 16
#define OUT_PORT_5_WIDTH 16
// INPUT/OUTPUTS PARAMS END
/** WRAPPER_CONF
@ -100,13 +101,14 @@
#define OFFSET_IN_ARRAY_2 (OFFSET_IN_ARRAY_1 + ADC_PORT_1_WIDTH)
/// === Полный размер буфера ===
#define TOTAL_OUT_SIZE (THYR_PORT_1_WIDTH + PM_PORT_2_WIDTH + ANGLE_PORT_3_WIDTH + OUT_PORT_4_WIDTH)
#define TOTAL_OUT_SIZE (THYR_PORT_1_WIDTH + DO_PORT_2_WIDTH + PM_PORT_3_WIDTH + ANGLE_PORT_4_WIDTH + OUT_PORT_5_WIDTH)
/// === Смещения массивов (внутри общего буфера) ===
#define OFFSET_OUT_ARRAY_1 0
#define OFFSET_OUT_ARRAY_2 (OFFSET_OUT_ARRAY_1 + THYR_PORT_1_WIDTH)
#define OFFSET_OUT_ARRAY_3 (OFFSET_OUT_ARRAY_2 + PM_PORT_2_WIDTH)
#define OFFSET_OUT_ARRAY_4 (OFFSET_OUT_ARRAY_3 + ANGLE_PORT_3_WIDTH)
#define OFFSET_OUT_ARRAY_3 (OFFSET_OUT_ARRAY_2 + DO_PORT_2_WIDTH)
#define OFFSET_OUT_ARRAY_4 (OFFSET_OUT_ARRAY_3 + PM_PORT_3_WIDTH)
#define OFFSET_OUT_ARRAY_5 (OFFSET_OUT_ARRAY_4 + ANGLE_PORT_4_WIDTH)
// INPUT/OUTPUTS AUTO-PARAMS END

View File

@ -27,6 +27,7 @@ void app_init(void) {
UPP_SetDefault(1, 1);
UPP_Init();
UPP_PreWhile();
UPP_DO.CEN(DISABLE);
// USER APP INIT END
}

View File

@ -10,7 +10,7 @@ float dbg[16];
extern float iref_dbg;
#define PIN_READ(_verbname_) (_verbname_##_GPIO_Port->ODR & (_verbname_##_Pin)) ? 1 : 0
void Write_Thyristors(real_T* Buffer, int ind_port)
void Write_UPP_Outputs(real_T* Buffer, int ind_port)
{
int pwm1_pin = PIN_READ(PWM1);
int pwm2_pin = PIN_READ(PWM2);
@ -18,14 +18,39 @@ void Write_Thyristors(real_T* Buffer, int ind_port)
int pwm4_pin = PIN_READ(PWM4);
int pwm5_pin = PIN_READ(PWM5);
int pwm6_pin = PIN_READ(PWM6);
int err = PIN_READ(RDO1);
int work = PIN_READ(RDO2);
int ready = PIN_READ(RDO3);
if (CEN_GPIO_Port->ODR & CEN_Pin)
{
WriteOutputArray(0, ind_port, 0);
WriteOutputArray(0, ind_port, 1);
WriteOutputArray(0, ind_port, 2);
WriteOutputArray(0, ind_port, 3);
WriteOutputArray(0, ind_port, 4);
WriteOutputArray(0, ind_port, 5);
WriteOutputArray(0, ind_port+1, 0);
WriteOutputArray(0, ind_port+1, 1);
WriteOutputArray(0, ind_port+1, 2);
}
else
{
WriteOutputArray(pwm1_pin, ind_port, 0);
WriteOutputArray(pwm2_pin, ind_port, 1);
WriteOutputArray(pwm3_pin, ind_port, 2);
WriteOutputArray(pwm4_pin, ind_port, 3);
WriteOutputArray(pwm5_pin, ind_port, 4);
WriteOutputArray(pwm6_pin, ind_port, 5);
WriteOutputArray(ready, ind_port+1, 0);
WriteOutputArray(work, ind_port+1, 1);
WriteOutputArray(err, ind_port+1, 2);
}
WriteOutputArray(pwm1_pin, ind_port, 0);
WriteOutputArray(pwm2_pin, ind_port, 1);
WriteOutputArray(pwm3_pin, ind_port, 2);
WriteOutputArray(pwm4_pin, ind_port, 3);
WriteOutputArray(pwm5_pin, ind_port, 4);
WriteOutputArray(pwm6_pin, ind_port, 5);
}
void Write_PowerMonitor(real_T* Buffer, int ind_port)
@ -66,14 +91,14 @@ void Write_AngleControl(real_T* Buffer, int ind_port)
{
int nn = 0;
WriteOutputArray(iref_dbg, ind_port, nn++);
WriteOutputArray(upp.hangle.Iref, ind_port, nn++);
WriteOutputArray(upp.pm.measured.final.Iamp, ind_port, nn++);
WriteOutputArray(upp.hangle.alpha, ind_port, nn++);
WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR1) - upp.hangle.htim->Instance->CNT, 2, nn++);
WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR2) - upp.hangle.htim->Instance->CNT, 2, nn++);
WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR3) - upp.hangle.htim->Instance->CNT, 2, nn++);
WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR1) - upp.hangle.htim->Instance->CNT, ind_port, nn++);
WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR2) - upp.hangle.htim->Instance->CNT, ind_port, nn++);
WriteOutputArray((long long)(upp.hangle.htim->Instance->CCR3) - upp.hangle.htim->Instance->CNT, ind_port, nn++);
}
@ -98,6 +123,10 @@ void app_readInputs(const real_T* Buffer) {
MB_INTERNAL.param.angle.PID_Kp = ReadInputArray(1, 4) * 10000;
MB_INTERNAL.param.angle.PID_Ki = ReadInputArray(1, 5) * 10000;
MB_INTERNAL.param.angle.PID_Kd = ReadInputArray(1, 6) * 10000;
MB_INTERNAL.param.angle.PID_ExpAlpha = ReadInputArray(1, 7) * 65535;
MB_INTERNAL.param.nominal.U = ReadInputArray(1, 8) * 10000;
MB_INTERNAL.param.nominal.I = ReadInputArray(1, 9) * 65535;
// USER APP INPUT END
}
@ -108,11 +137,11 @@ void app_readInputs(const real_T* Buffer) {
*/
void app_writeOutputBuffer(real_T* Buffer) {
// USER APP OUTPUT START
Write_Thyristors(Buffer, 0);
Write_UPP_Outputs(Buffer, 0);
Write_PowerMonitor(Buffer, 1);
Write_PowerMonitor(Buffer, 2);
Write_AngleControl(Buffer, 2);
Write_AngleControl(Buffer, 3);
int nn = 0;
//WriteOutputArray(upp.hangle.htim->Instance->CNT, 2, nn++);

View File

@ -1,7 +1,7 @@
clear all
Ts = 5e-6;
Vnom = 690;
Vnom = 400;
Fnom = 50;
Temperature1 = 2.22; % 20 градусов

Binary file not shown.

@ -1 +1 @@
Subproject commit 272642b310043355b0af95e0410afbbcb74d17b7
Subproject commit 2344926f92f837703ae7a6d484daf6ca3210472a

View File

@ -20,6 +20,7 @@
#ifndef _MODBUS_CONFIG_H_
#define _MODBUS_CONFIG_H_
#include "upp_defs.h"
#include "upp_io.h"
// Общие параметры
#define MODBUS_DEVICE_ID 1 ///< Адрес устройства в сети Modbus
@ -40,8 +41,8 @@
// Периферия (опционально)
//#define mb_huart huart1 ///< Удобный дефайн для модбасовского uart
//#define mb_htim htim3 ///< Удобный дефайн для модбасовского таймера
//#define RS_EnableReceive() ///< Функция изменения направления передачи на ПРИЕМ для RS-485
//#define RS_EnableTransmit() ///< Функция изменения направления передачи на ПЕРЕДАЧУ для RS-485
#define RS_EnableReceive() UPP_UART1_SetDirection(GPIO_PIN_RESET) ///< Функция изменения направления передачи на ПРИЕМ для RS-485
#define RS_EnableTransmit() UPP_UART1_SetDirection(GPIO_PIN_RESET) ///< Функция изменения направления передачи на ПЕРЕДАЧУ для RS-485
// Модули modbus

View File

@ -99,9 +99,10 @@
#define BENCH_TIME_ENABLE ///< Включить бенч времени
#define BENCH_TIME_MAX_CHANNELS 5 ///< Максимальное количество каналов измерения
#define BT_ADC 0
#define BT_PWM 1
#define BT_SYSTICK 2
#define BT_SLOWCALC 0
#define BT_ADC 1
#define BT_PWM 2
#define BT_SYSTICK 3
/** GEN_CONFIG
* @}
*/

View File

@ -51,8 +51,8 @@
#define NOM_U_DEVIATION_PLUS_PERCENT_DEFAULT 6
#define NOM_U_DEVIATION_MINUS_PERCENT_DEFAULT 10
#define NOM_F_HZ_DEFAULT 50
#define NOM_F_DEVIATION_PLUS_PERCENT_DEFAULT 5
#define NOM_F_DEVIATION_MINUS_PERCENT_DEFAULT 5
#define NOM_F_DEVIATION_PLUS_PERCENT_DEFAULT 10
#define NOM_F_DEVIATION_MINUS_PERCENT_DEFAULT 10
#define NOM_I_A_DEFAULT 5
/* Параметры ПУИ */
@ -66,8 +66,19 @@
#define PUI_Tdelay_SECONDS_DEFAULT 30
#define PUI_Interlace_EN_DEFAULT 5000
/* Дефолтное коливчество тиков для задержки выставления ошибки */
#define ERRORS_DELAY_TICKS_DEFAULT 10
/* Время задержки перед выставлением ошибки */
#define ERRORS_DELAY_MS_UAMP_ERR 1500 // todo
#define ERRORS_DELAY_MS_F_ERR 5000
#define ERRORS_DELAY_MS_DEFAULT 0.1f
/* Параметры регулятора угла */
#define ANGLE_MAX_PERCENT_DEFAULT 0.8
#define ANGLE_MIN_PERCENT_DEFAULT 0.1
#define ANGLE_PID_KP_COEF_DEFAULT 1.0
#define ANGLE_PID_KI_COEF_DEFAULT 0.1
#define ANGLE_PID_KD_COEF_DEFAULT 0
#define ANGLE_REF_ALPHA_COEF_DEFAULT 0.01
/* Параметри мониторинга сети */
#define PM_EXP_ALPHA_COEF_DEFAULT 0.01
@ -98,14 +109,9 @@
* @{
*/
//#if defined(STM32F417xx)
//#endif
/* Периоды вызова всякого */
#define PM_ADC_PERIOD_US 10 ///< Период опроса АЦП в мкс
#define PM_SLOW_PERIOD_CNT 50 ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US
#define PM_ADC_PERIOD_US 30 ///< Период опроса АЦП в мкс
#define PM_SLOW_PERIOD_CNT 25 ///< Период обновления медленных расчетов тиках @ref PM_ADC_PERIOD_US
#define PM_TEMP_SLOW_PERIOD_CNT 200 ///< Период обновления датчиков температуры в тиках @ref PM_SLOW_PERIOD_CNT
@ -115,6 +121,25 @@
#define PWM_TIM3_FREQ_MHZ 90 ///< Частота тиков таймера ШИМ (5-6 каналы)
#define ANGLE_TIM2_FREQ_MHZ 90 ///< Частота тиков таймера отсчета угла открытия тиристоров
// ===== ОТЛАДОЧНЫЕ ШТУКИ ДЛЯ 417 ======
#if defined(STM32F417xx)
#undef ADC_TIM8_FREQ_MZH
#undef PWM_TIM1_FREQ_MHZ
#undef PWM_TIM3_FREQ_MHZ
#undef ANGLE_TIM2_FREQ_MHZ
// У 417 меньше частота поэтому меняем прескалер
#define ADC_TIM8_FREQ_MZH 168 ///< Частота тиков таймера АЦП
#define PWM_TIM1_FREQ_MHZ 168 ///< Частота тиков таймера ШИМ (1-4 каналы)
#define PWM_TIM3_FREQ_MHZ 84 ///< Частота тиков таймера ШИМ (5-6 каналы)
#define ANGLE_TIM2_FREQ_MHZ 84 ///< Частота тиков таймера отсчета угла открытия тиристоров
#define HAL_PWREx_EnableOverDrive() HAL_ERROR
#endif
/** //UPP_COMPILED_PARAMS
* @}
*/

View File

@ -152,8 +152,16 @@ typedef struct {
#define PM_SLOW_PERIOD_US (PM_ADC_PERIOD_US*PM_SLOW_PERIOD_CNT)
#define ANGLE_PERIOD_MS(_freq_) (((float)1/(_freq_*2))*1000)
#define US_TO_SLOW_TICKS(_us_) ((_us_)/PM_SLOW_PERIOD_US)
#define MS_TO_SLOW_TICKS(_ms_) US_TO_SLOW_TICKS((_ms_)*1000)
#define PARAM_INTERNAL MB_INTERNAL.param
#define PARAM_PUI MB_DATA.HoldRegs.pui_params
#define ERR_PUI errors.pui.err
#define ERR_PRIVATE errors.prvt.f.err
#define ERR_PRIVATE_CNT errors.prvt.cnt
/**
* @brief Состояния полуволны

View File

@ -31,8 +31,11 @@ extern "C" {
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* Общее по УПП */
#include "upp_defs.h"
#include "upp_io.h"
#include "upp_errors.h"
/* Общие библиотеки */
#include "mylibs_include.h"
#include "modbus.h"
/* USER CODE END Includes */
@ -172,6 +175,7 @@ void Error_Handler(void);
/* USER CODE BEGIN Private defines */
extern TIM_HandleTypeDef ustim;
void SystemClock_Config_STM32F417(void);
/* USER CODE END Private defines */
#ifdef __cplusplus

View File

@ -100,8 +100,12 @@ HAL_StatusTypeDef ADC_Start(ADC_Periodic_t *adc, float PeriodUs)
if(PeriodUs == 0)
return HAL_ERROR;
// Остановить перед перенастройкой
HAL_TIM_Base_Stop(adc->htim);
// Запускаем таймер который будет запускать опрос АЦП с заданным периодом
__HAL_TIM_SET_AUTORELOAD(adc->htim, TIM_MicrosToTick(PeriodUs, ADC_TIM8_FREQ_MZH));
res = HAL_TIM_Base_Start(adc->htim);
if(res != HAL_OK)
{
@ -151,29 +155,27 @@ HAL_StatusTypeDef ADC_Handle(ADC_Periodic_t *adc)
uint16_t *raw = adc->RawData;
float *data = adc->Data;
// // Фильтрация от импульсных шумов для всех каналов
// for(int i = 0; i < ADC_NUMB_OF_CHANNELS; i++)
// {
// if(Filter_isEnable(&adc->filter[i]))
// {
// // заменяем данные на отфильтрованные данные
// data[i] = Filter_Process(&adc->filter[i], data[i]);
// }
// }
// Перерасчеты Напряжений/Токов в единицы измерения
for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++)
{
ADC_Coefs_t *coefs = &adc->Coefs[i];
data[i] = ((float)(raw[i])-coefs->lZero) * coefs->vMax / (coefs->lMax-coefs->lZero);
// ADC_UpdateStatistics(adc, i, ADC_LEVEL_AC);
}
// Фильтрация от шумов для всех каналов
for(int i = 0; i < ADC_NUMB_OF_CHANNELS; i++)
{
if(Filter_isEnable(&adc->filter[i]))
{
// заменяем данные на отфильтрованные данные
data[i] = Filter_Process(&adc->filter[i], data[i]);
}
}
// Преобразования температуры по таблице
for (int i = ADC_TEMP_CHANNELS_START; i < ADC_NUMB_OF_CHANNELS; i++)
{
data[i] = Filter_Process(&adc->temp_map[i-ADC_TEMP_CHANNELS_START], raw[i]);
// ADC_UpdateStatistics(adc, i, ADC_LEVEL_BASE);
}
if(Filter_isDataReady(&adc->filter[0]))

View File

@ -51,8 +51,8 @@
static const float adc_temp_vals[] = ADC_TEMPERATURES;
static const float adc_temp_quants[] = ADC_TEMPERATURES_QUANTS;
#define Filter_t FilterMedian_t
#define Filter_Init FilterMedian_Init
#define Filter_t FilterMedianInt_t
#define Filter_Init FilterMedianInt_Init
#define Filter_Initializator 5
/**

View File

@ -141,6 +141,9 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
float fmean = 0; // средняя частота по трем фазам
float iphase_mean = 0; // средний ток каждой фазы
float uphase_mean = 0; // среднее напряжение каждой фазы
float u_base = to_float(PARAM_INTERNAL.nominal.U, 10); // Дополнительно посчитаем значения в реалдьных Вольтах
float i_base = to_float(PARAM_INTERNAL.nominal.I, 10); // Дополнительно посчитаем значения в реалдьных Амперах
for(int i = 0; i < 3; i++)
{
/* Получение частоты фазы */
@ -154,6 +157,10 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
/* Средний ток фазы */
iphase_mean = fabsf(meas->slow.I[i]);
meas->final.I[i] = Filter_Process(&hpm->exp[EXP_IC+i], iphase_mean);
/* Реальные единицы измерения (Вольты/Амперы) */
meas->real.I[i] = meas->slow.I[i]*i_base;
meas->real.U[i] = meas->slow.U[i]*u_base;
}
/* Получение средней частоты по трем фазам */
@ -166,6 +173,7 @@ void PowerMonitor_SlowCalc(PowerMonitor_t *hpm)
meas->final.Uamp = Filter_Process(&hpm->exp[EXP_U], uamp);
meas->final.Iamp = Filter_Process(&hpm->exp[EXP_I], iamp);
}
/**
@ -182,28 +190,25 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
/* Считываем АЦП с пересчетами и медианой фильтрацией от выбросов */
ADC_Handle(&hpm->adc);
/* Заполняем величины Напряжений/Токов */
/* Заполняем Напряжения/Токи в о.е. */
float u_base = to_float(PARAM_INTERNAL.nominal.U, 10);
float i_base = to_float(PARAM_INTERNAL.nominal.I, 10);
PowerMonitor_Measured_t *meas = &hpm->measured;
meas->real.U[U_BA] = hpm->adc.Data[ADC_CHANNEL_UBA];
meas->real.U[U_AC] = hpm->adc.Data[ADC_CHANNEL_UAC];
meas->real.U[U_BC] = U_BC_calc(meas->real.U[U_BA], meas->real.U[U_AC]);
meas->fast.U[U_BA] = hpm->adc.Data[ADC_CHANNEL_UBA]/u_base;
meas->fast.U[U_AC] = hpm->adc.Data[ADC_CHANNEL_UAC]/u_base;
meas->fast.U[U_BC] = U_BC_calc(meas->fast.U[U_BA], meas->fast.U[U_AC]);
meas->real.I[I_C] = hpm->adc.Data[ADC_CHANNEL_IC];
meas->real.I[I_A] = hpm->adc.Data[ADC_CHANNEL_IA];
meas->real.I[I_B] = I_B_calc(meas->real.I[I_A], meas->real.I[I_C]);
meas->fast.I[I_C] = hpm->adc.Data[ADC_CHANNEL_IC]/i_base;
meas->fast.I[I_A] = hpm->adc.Data[ADC_CHANNEL_IA]/i_base;
meas->fast.I[I_B] = I_B_calc(meas->fast.I[I_A], meas->fast.I[I_C]);
/* Преобразуем в относительные единицы (о.е.) */
for(int i = 0; i < 3; i++)
{
meas->fast.U[i] = 10*meas->real.U[i]/PARAM_INTERNAL.nominal.U;
meas->fast.I[i] = 10*meas->real.I[i]/PARAM_INTERNAL.nominal.I;
}
/* Ищем переход через ноль */
ZC_ProcessAllChannels(&hpm->zc, meas->fast.U, usTick);
/* Вообще фильтры должны рабтоать синхронно, но на всякий синхронизация */
__SynchAvgFilters(hpm);
//__SynchAvgFilters(hpm);
/* Average для медленной фильтрации */
meas->slow.U[U_BA] = Filter_Process(&hpm->avg[ADC_CHANNEL_UBA], meas->fast.U[U_BA]);
@ -225,8 +230,8 @@ void PowerMonitor_FastCalc(PowerMonitor_t *hpm)
}
else // если уже запущена - ставим overrun slow calc
{
errors.prvt.f.err.slow_calc_overrun = 1;
errors.prvt.cnt.slow_calc_overrun++;
ERR_PRIVATE.overrun_slow_calc = 1;
ERR_PRIVATE_CNT.overrun_slow_calc++;
}
}
else

View File

@ -27,6 +27,7 @@
*/
typedef struct
{
unsigned inIsr:1; ///< Флаг что мы в прерывании
unsigned runSlow:1; ///< Запустить медленный алгоритм в while(1)
unsigned isU:1; ///< Есть ли напряжение

View File

@ -24,30 +24,30 @@ int Protect_Voltages(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect
/* Общее напряжение */
if(measure->final.Uamp > lUmax)
{
errors.prvt.f.err.uamp_max = 1;
ERR_PRIVATE.uamp_max = 1;
}
else if (measure->final.Uamp < lUmin)
{
errors.prvt.f.err.uamp_min = 1;
ERR_PRIVATE.uamp_min = 1;
}
else
{
errors.prvt.f.err.uamp_max = 0;
errors.prvt.f.err.uamp_min = 0;
ERR_PRIVATE.uamp_max = 0;
ERR_PRIVATE.uamp_min = 0;
}
/* Последовательность фаз */
int realPhaseSequence = 0;
if(realPhaseSequence != lPhaseSequence)
{
errors.prvt.f.err.interlance = 1;
ERR_PRIVATE.interlance = 1;
}
else
{
errors.prvt.f.err.interlance = 0;
ERR_PRIVATE.interlance = 0;
}
return (errors.prvt.f.err.uamp_min == 0);
return (ERR_PRIVATE.uamp_min == 0);
}
/**
@ -65,62 +65,62 @@ int Protect_Currents(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect
/* Общий ток */
if(measure->final.Iamp > lImax)
{
errors.prvt.f.err.iamp_max = 1;
ERR_PRIVATE.iamp_max = 1;
}
else if (measure->final.Iamp < lImin)
{
errors.prvt.f.err.iamp_min = 1;
ERR_PRIVATE.iamp_min = 1;
}
else
{
errors.prvt.f.err.iamp_max = 0;
errors.prvt.f.err.iamp_min = 0;
ERR_PRIVATE.iamp_max = 0;
ERR_PRIVATE.iamp_min = 0;
}
/* Ток по фазам */
if(measure->final.I[I_A] > lImax)
{
errors.prvt.f.err.ia_max = 1;
ERR_PRIVATE.ia_max = 1;
}
else if (measure->final.I[I_A] < lImin)
{
errors.prvt.f.err.ia_min = 1;
ERR_PRIVATE.ia_min = 1;
}
else
{
errors.prvt.f.err.ia_max = 0;
errors.prvt.f.err.ia_min = 0;
ERR_PRIVATE.ia_max = 0;
ERR_PRIVATE.ia_min = 0;
}
if(measure->final.I[I_B] > lImax)
{
errors.prvt.f.err.ib_max = 1;
ERR_PRIVATE.ib_max = 1;
}
else if (measure->final.I[I_B] < lImin)
{
errors.prvt.f.err.ib_min = 1;
ERR_PRIVATE.ib_min = 1;
}
else
{
errors.prvt.f.err.ib_max = 0;
errors.prvt.f.err.ib_min = 0;
ERR_PRIVATE.ib_max = 0;
ERR_PRIVATE.ib_min = 0;
}
if(measure->final.I[I_C] > lImax)
{
errors.prvt.f.err.ic_max = 1;
ERR_PRIVATE.ic_max = 1;
}
else if (measure->final.I[I_C] < lImin)
{
errors.prvt.f.err.ic_min = 1;
ERR_PRIVATE.ic_min = 1;
}
else
{
errors.prvt.f.err.ic_max = 0;
errors.prvt.f.err.ic_min = 0;
ERR_PRIVATE.ic_max = 0;
ERR_PRIVATE.ic_min = 0;
}
return (errors.prvt.f.err.iamp_min == 0);
return (ERR_PRIVATE.iamp_min == 0);
}
@ -134,8 +134,8 @@ void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, U
{
/* Переводим внутренние уставки в удобный вид */
float lFnom = to_float(PARAM_INTERNAL.nominal.F, 100);
float lFmin = lFnom - lFnom*to_float(PARAM_INTERNAL.nominal.F_deviation_minus, 100);
float lFmax = lFnom + lFnom*to_float(PARAM_INTERNAL.nominal.F_deviation_plus, 100);
float lFmin = lFnom - lFnom*to_float(PARAM_INTERNAL.nominal.F_deviation_minus, 10000);
float lFmax = lFnom + lFnom*to_float(PARAM_INTERNAL.nominal.F_deviation_plus, 10000);
float lTwarn = to_float(PARAM_INTERNAL.setpoints.TemperatureWarn, 100);
float lTerr = to_float(PARAM_INTERNAL.setpoints.TemperatureWarn, 100);
@ -144,44 +144,44 @@ void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, U
/*=============== ЗАЩИТЫ ПО ЧАСТОТЕ ==================*/
if(measure->final.F[U_AC] > lFmax)
{
errors.prvt.f.err.fac_max = 1;
ERR_PRIVATE.fac_max = 1;
}
else if (measure->final.F[U_AC] < lFmin)
{
errors.prvt.f.err.fac_min = 1;
ERR_PRIVATE.fac_min = 1;
}
else
{
errors.prvt.f.err.fac_max = 0;
errors.prvt.f.err.fac_min = 0;
ERR_PRIVATE.fac_max = 0;
ERR_PRIVATE.fac_min = 0;
}
if(measure->final.F[U_BA] > lFmax)
{
errors.prvt.f.err.fba_max = 1;
ERR_PRIVATE.fba_max = 1;
}
else if (measure->final.F[U_BA] < lFmin)
{
errors.prvt.f.err.fba_min = 1;
ERR_PRIVATE.fba_min = 1;
}
else
{
errors.prvt.f.err.fba_max = 0;
errors.prvt.f.err.fba_min = 0;
ERR_PRIVATE.fba_max = 0;
ERR_PRIVATE.fba_min = 0;
}
if(measure->final.F[U_BC] > lFmax)
{
errors.prvt.f.err.fbc_max = 1;
ERR_PRIVATE.fbc_max = 1;
}
else if (measure->final.F[U_BC] < lFmin)
{
errors.prvt.f.err.fbc_min = 1;
ERR_PRIVATE.fbc_min = 1;
}
else
{
errors.prvt.f.err.fbc_max = 0;
errors.prvt.f.err.fbc_min = 0;
ERR_PRIVATE.fbc_max = 0;
ERR_PRIVATE.fbc_min = 0;
}
@ -189,15 +189,15 @@ void Protect_Misc(PowerMonitor_Measured_t *measure, UPP_PUI_Params_t *protect, U
/*=============== ЗАЩИТЫ ПО ТЕМПЕРАТУРЕ ==================*/
if(measure->final.T[TEMP_1] > lTerr)
{
errors.prvt.f.err.temp_err = 1;
ERR_PRIVATE.temp_err = 1;
}
else if (measure->final.T[TEMP_1] > lTwarn)
{
errors.prvt.f.err.temp_warn = 1;
ERR_PRIVATE.temp_warn = 1;
}
else
{
errors.prvt.f.err.temp_err = 0;
errors.prvt.f.err.temp_warn = 0;
ERR_PRIVATE.temp_err = 0;
ERR_PRIVATE.temp_warn = 0;
}
}

View File

@ -0,0 +1,55 @@
/**
******************************************************************************
* @file DBG_stm32f417_support.c
* @brief Модуль для запуска кода на STM32F417
******************************************************************************
* @details
******************************************************************************/
#include "main.h"
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config_STM32F417(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Configure the main internal regulator output voltage
*/
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 168;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 4;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
{
Error_Handler();
}
}

View File

@ -53,7 +53,7 @@ void MX_ADC3_Init(void)
hadc3.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T8_TRGO;
hadc3.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc3.Init.NbrOfConversion = 6;
hadc3.Init.DMAContinuousRequests = DISABLE;
hadc3.Init.DMAContinuousRequests = ENABLE;
hadc3.Init.EOCSelection = ADC_EOC_SEQ_CONV;
if (HAL_ADC_Init(&hadc3) != HAL_OK)
{
@ -162,7 +162,7 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
hdma_adc3.Init.MemInc = DMA_MINC_ENABLE;
hdma_adc3.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_adc3.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_adc3.Init.Mode = DMA_NORMAL;
hdma_adc3.Init.Mode = DMA_CIRCULAR;
hdma_adc3.Init.Priority = DMA_PRIORITY_LOW;
hdma_adc3.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_adc3) != HAL_OK)

View File

@ -72,7 +72,14 @@ int main(void)
{
/* USER CODE BEGIN 1 */
__HAL_FREEZE_IWDG_DBGMCU();
__HAL_FREEZE_TIM1_DBGMCU();
__HAL_FREEZE_TIM2_DBGMCU();
__HAL_FREEZE_TIM3_DBGMCU();
__HAL_FREEZE_TIM5_DBGMCU();
__HAL_FREEZE_TIM8_DBGMCU();
__HAL_FREEZE_TIM11_DBGMCU();
__HAL_FREEZE_TIM12_DBGMCU();
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
@ -83,13 +90,16 @@ int main(void)
/* USER CODE BEGIN Init */
#ifndef MATLAB
#if defined(STM32F427xx)
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
#elif defined(STM32F417xx)
SystemClock_Config_STM32F417();
#endif
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
@ -109,6 +119,12 @@ int main(void)
MX_TIM5_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
#if defined(STM32F417xx)
// У 417 меньше частота поэтому меняем прескалер
__HAL_TIM_SET_PRESCALER(&ustim, 84-1);
// И т.к. нет епромки выставляем дефолтные
UPP_SetDefault(1, 1);
#endif
#else //MATLAB
#endif //MATLAB
UPP_Init();

View File

@ -244,7 +244,6 @@ void TIM8_TRG_COM_TIM14_IRQHandler(void)
HAL_TIM_IRQHandler(&htim14);
/* USER CODE BEGIN TIM8_TRG_COM_TIM14_IRQn 1 */
#endif
UPP_Tick();
/* USER CODE END TIM8_TRG_COM_TIM14_IRQn 1 */
}

View File

@ -25,7 +25,8 @@ HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle)
float kp = to_float(PARAM_INTERNAL.angle.PID_Kp, 10000);
float ki = to_float(PARAM_INTERNAL.angle.PID_Ki, 10000);
float kd = to_float(PARAM_INTERNAL.angle.PID_Kd, 10000);
Angle_PID_Init(hangle, kp, ki, kd);
float ref_alpha = to_float(PARAM_INTERNAL.angle.PID_ExpAlpha, 65535);
Angle_PID_Init(hangle, kp, ki, kd, ref_alpha);
// Инициализация каналов
HAL_TIM_OC_Start_IT(hangle->htim, ANGLE_CHANNEL_1);
@ -53,15 +54,21 @@ HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle)
* @param hangle Указатель на таймер
* @param kp, ki kd Коэффициенты регулятора
*/
void Angle_PID_Init(Angle_Handle_t *hangle, float kp, float ki, float kd)
void Angle_PID_Init(Angle_Handle_t *hangle, float kp, float ki, float kd, float alpha)
{
if(assert_upp(hangle))
return;
// Сам ПИД регулятор
hangle->pid.Kp = kp;
hangle->pid.Ki = ki;
hangle->pid.Kd = kd;
arm_pid_init_f32(&hangle->pid, 1);
// Сглаживающий фильтр для задания ПИД регулятора
FilterExp_Init(&hangle->refFilter, alpha);
Filter_Start(&hangle->refFilter);
Filter_Process(&hangle->refFilter, 0);
}
/**
@ -75,8 +82,10 @@ void Angle_PID(Angle_Handle_t *hangle, float setpoint, float measurement)
if(assert_upp(hangle))
return;
hangle->Iref = Filter_Process(&hangle->refFilter, setpoint);
/* Ошибка регулирования = уставка - измеренное */
float err = setpoint - measurement;
float err = hangle->Iref - measurement;
/* ПИД регулирование */
float open_control = arm_pid_f32(&hangle->pid, err); // 0 - открыть максимально поздно, 1 - открыть макситмально рано

View File

@ -26,10 +26,11 @@ typedef struct
TIM_HandleTypeDef *htim; ///< Указатель на таймер для расчета угла
Angle_Config_t Config; ///< Конфигурации алгоритма расчета угла открытия тиристоров
//float alpha_degree; ///< текущий угол открытия в градусах [0..180]
float alpha; ///< текущий угол открытия в процентах от периода [0..1]
float Iref; ///< текущее задание тока в о.е. [0..1]
float alpha; ///< текущий угол открытия в о.е. [0..1] (% от периода)
arm_pid_instance_f32 pid; ///< ПИД регулятор для управления углом
arm_pid_instance_f32 pid; ///< ПИД регулятор для управления углом
FilterExp_t refFilter; ///< Фильтр для плавного нарастания регулирования
struct {
unsigned Initialized : 1; ///< Структура инициализирована
@ -42,7 +43,7 @@ typedef struct
/* Инициализация Таймера для рассчета угла открытия. */
HAL_StatusTypeDef Angle_Init(Angle_Handle_t *hangle);
/* Инициализация ПИД регулятора. */
void Angle_PID_Init(Angle_Handle_t *hangle, float kp, float ki, float kd);
void Angle_PID_Init(Angle_Handle_t *hangle, float kp, float ki, float kd, float alpha);
// ====== УПРАВЛЕНИЕ ==========
/* Управление углом через ПИД регулятор */

View File

@ -4,6 +4,12 @@
* @brief Формирование ошибок в ПУИ
******************************************************************************
* @details
Общая логика:
В программе выставляются всякие внутренние флаги ошибок: ERR_PRIVATE
В этом модуле смотрятся какие флаги выставились и переносят эти флаги
в структуру ошибок ПУИ ERR_PUI.
Также реализована защита от дребезга и в целом задержка на выставление ошибок.
******************************************************************************/
#include "upp_main.h" // УПП
#include "upp_errors.h" // всё остальное по работе с УПП
@ -21,6 +27,7 @@ void UPP_Errors_Other(void);
void UPP_Errors_Handle(void)
{
/*====== Программные ошибки ======*/
UPP_Errors_Program();
/*====== Ошибки питания плат ======*/
@ -62,50 +69,50 @@ void UPP_Errors_Ranges(void)
static int TMaxCnt = 0;
/* Напряжения */
errors.pui.err.OverVoltage = setError(errors.prvt.f.err.uamp_max,
errors.pui.err.OverVoltage,
&UMaxCnt,
ticksTiMax);
errors.pui.err.UnderVoltage = setError(errors.prvt.f.err.uamp_min,
errors.pui.err.UnderVoltage,
&UMinCnt,
ticksTiMax);
ERR_PUI.OverVoltage = setError(ERR_PRIVATE.uamp_max,
ERR_PUI.OverVoltage,
&UMaxCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_UAMP_ERR));
ERR_PUI.UnderVoltage = setError(ERR_PRIVATE.uamp_min,
ERR_PUI.UnderVoltage,
&UMinCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_UAMP_ERR));
/* Токи */
int i_max = ( errors.prvt.f.err.iamp_max ||
errors.prvt.f.err.ia_max ||
errors.prvt.f.err.ib_max ||
errors.prvt.f.err.ic_max);
errors.pui.err.OverCurrent = setError(i_max,
errors.pui.err.OverCurrent,
&IMaxCnt,
ticksTiMax);
int i_max = ( ERR_PRIVATE.iamp_max ||
ERR_PRIVATE.ia_max ||
ERR_PRIVATE.ib_max ||
ERR_PRIVATE.ic_max);
ERR_PUI.OverCurrent = setError(i_max,
ERR_PUI.OverCurrent,
&IMaxCnt,
ticksTiMax);
/* Частота */
int f_max = ( errors.prvt.f.err.fac_max ||
errors.prvt.f.err.fba_max ||
errors.prvt.f.err.fbc_max);
int f_min = ( errors.prvt.f.err.fac_max ||
errors.prvt.f.err.fba_max ||
errors.prvt.f.err.fbc_max);
errors.pui.err.OverFrequency = setError(f_max,
errors.pui.err.OverFrequency,
&FMaxCnt,
ERRORS_DELAY_TICKS_DEFAULT);
int f_max = ( ERR_PRIVATE.fac_max ||
ERR_PRIVATE.fba_max ||
ERR_PRIVATE.fbc_max);
int f_min = ( ERR_PRIVATE.fac_min ||
ERR_PRIVATE.fba_min ||
ERR_PRIVATE.fbc_min);
ERR_PUI.OverFrequency = setError(f_max,
ERR_PUI.OverFrequency,
&FMaxCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_F_ERR));
errors.pui.err.UnderFrequency = setError( f_min,
errors.pui.err.UnderFrequency,
&FMinCnt,
ERRORS_DELAY_TICKS_DEFAULT);
ERR_PUI.UnderFrequency = setError( f_min,
ERR_PUI.UnderFrequency,
&FMinCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_F_ERR));
/* Температуры */
errors.pui.err.OverTemperature = setError(errors.prvt.f.err.temp_err,
errors.pui.err.OverTemperature,
&TMaxCnt,
ERRORS_DELAY_TICKS_DEFAULT);
ERR_PUI.OverTemperature = setError(ERR_PRIVATE.temp_err,
ERR_PUI.OverTemperature,
&TMaxCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
}
void UPP_Errors_LossPhase(void)
@ -116,39 +123,39 @@ void UPP_Errors_LossPhase(void)
static int LossPhaseBCnt = 0;
static int LossPhaseCCnt = 0;
int loss_phases_all = ( errors.prvt.f.err.ia_min &&
errors.prvt.f.err.ib_min &&
errors.prvt.f.err.ic_min );
int loss_phases_all = ( ERR_PRIVATE.ia_min &&
ERR_PRIVATE.ib_min &&
ERR_PRIVATE.ic_min );
errors.pui.err.LossPhaseAll = setError( loss_phases_all,
errors.pui.err.LossPhaseAll,
&LossPhaseAllCnt,
ERRORS_DELAY_TICKS_DEFAULT);
ERR_PUI.LossPhaseAll = setError( loss_phases_all,
ERR_PUI.LossPhaseAll,
&LossPhaseAllCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
/* Если хотя бы одна фаза есть проверяем фазы отдельно */
if(!errors.pui.err.LossPhaseAll)
if(!ERR_PUI.LossPhaseAll)
{
errors.pui.err.LossPhaseA = setError( errors.prvt.f.err.ia_min,
errors.pui.err.LossPhaseA,
&LossPhaseACnt,
ERRORS_DELAY_TICKS_DEFAULT);
ERR_PUI.LossPhaseA = setError( ERR_PRIVATE.ia_min,
ERR_PUI.LossPhaseA,
&LossPhaseACnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
errors.pui.err.LossPhaseB = setError( errors.prvt.f.err.ib_min,
errors.pui.err.LossPhaseB,
&LossPhaseBCnt,
ERRORS_DELAY_TICKS_DEFAULT);
ERR_PUI.LossPhaseB = setError( ERR_PRIVATE.ib_min,
ERR_PUI.LossPhaseB,
&LossPhaseBCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
errors.pui.err.LossPhaseC = setError( errors.prvt.f.err.ic_min,
errors.pui.err.LossPhaseC,
&LossPhaseCCnt,
ERRORS_DELAY_TICKS_DEFAULT);
ERR_PUI.LossPhaseC = setError( ERR_PRIVATE.ic_min,
ERR_PUI.LossPhaseC,
&LossPhaseCCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
}
/* Если всех фаз нет, то отдельные не смотрим */
else
{
errors.pui.err.LossPhaseA = 0;
errors.pui.err.LossPhaseB = 0;
errors.pui.err.LossPhaseC = 0;
ERR_PUI.LossPhaseA = 0;
ERR_PUI.LossPhaseB = 0;
ERR_PUI.LossPhaseC = 0;
}
}
@ -156,15 +163,15 @@ void UPP_Errors_Other(void)
{
static int InterlaceCnt = 0;
if(errors.prvt.f.err.longstart)
errors.pui.err.LongStart = 1;
if(ERR_PRIVATE.longstart)
ERR_PUI.LongStart = 1;
else
errors.pui.err.LongStart = 0;
ERR_PUI.LongStart = 0;
errors.pui.err.Interlace = setError(errors.prvt.f.err.interlance,
errors.pui.err.Interlace,
&InterlaceCnt,
ERRORS_DELAY_TICKS_DEFAULT);
ERR_PUI.Interlace = setError(ERR_PRIVATE.interlance,
ERR_PUI.Interlace,
&InterlaceCnt,
MS_TO_SLOW_TICKS(ERRORS_DELAY_MS_DEFAULT));
//Interlance
}

View File

@ -138,7 +138,8 @@ typedef struct
unsigned longstart:1;
unsigned interlance:3;
unsigned slow_calc_overrun:1;
unsigned overrun_slow_calc:1;
unsigned overrun_fast_calc:1;
}err;
}f;
@ -147,7 +148,8 @@ typedef struct
uint16_t adc_reinit_err;
uint16_t zc_reinit_err;
uint16_t pwm_reinit_err;
uint16_t slow_calc_overrun;
uint16_t overrun_slow_calc;
uint16_t overrun_fast_calc;
}cnt;
}prvt; ///< Приватные ошибки, не идущие напрямую в ПУИ

View File

@ -7,62 +7,131 @@
******************************************************************************/
#include "upp_io.h"
#include "main.h"
UPP_LEDs_t UPP_LEDS;
UPP_DiscreteInputs_t UPP_DIN;
UPP_DiscreteOutputs_t UPP_DO;
static void UPP_CEN_Write(int state);
static void UPP_RDO1_Write(int state);
static void UPP_RDO2_Write(int state);
static void UPP_RDO3_Write(int state);
static void UPP_RDO4_Write(int state);
static void UPP_DO1_Write(int state);
static void UPP_DO2_Write(int state);
static void UPP_DO3_Write(int state);
static void UPP_DO4_Write(int state);
static void UPP_DO5_Write(int state);
void UPP_CEN_Write(int state)
/**
* @brief Инициализация дискретных входов/выходов УПП
*/
void UPP_IO_Init(void)
{
HAL_GPIO_WritePin(CEN_GPIO_Port, CEN_Pin, state);
/* Дискретне выходы */
UPP_DO.CEN = &UPP_CEN_Write;
UPP_DO.Ready = &UPP_RDO3_Write;
UPP_DO.Work = &UPP_RDO2_Write;
UPP_DO.Error = &UPP_RDO1_Write;
UPP_DO.RDO4 = &UPP_RDO4_Write;
UPP_DO.DO1 = &UPP_DO1_Write;
UPP_DO.DO2 = &UPP_DO2_Write;
UPP_DO.DO3 = &UPP_DO3_Write;
UPP_DO.DO4 = &UPP_DO4_Write;
UPP_DO.DO5 = &UPP_DO5_Write;
/* Дискретные входы */
GPIO_Switch_Init(&UPP_DIN.Pusk, DIN1_GPIO_Port, DIN1_Pin, 0);
GPIO_Switch_Init(&UPP_DIN.MestDist, DIN2_GPIO_Port, DIN2_Pin, 0);
GPIO_Switch_Init(&UPP_DIN.DIN3, DIN3_GPIO_Port, DIN3_Pin, 0);
GPIO_Switch_Init(&UPP_DIN.err_24Vdio, ERR_24VDIO_GPIO_Port, ERR_24VDIO_Pin, 1);
GPIO_Switch_Init(&UPP_DIN.err_24V, ERR_24V_GPIO_Port, ERR_24V_Pin, 1);
GPIO_Switch_Init(&UPP_DIN.err_5Vsi, ERR_5VSI_GPIO_Port, ERR_5VSI_Pin, 0);
/* Дискретные входы платы УМ */
GPIO_Switch_Init(&UPP_DIN.err_5Vd, UM_ERR_5VD_GPIO_Port, UM_ERR_5VD_Pin, 0);
GPIO_Switch_Init(&UPP_DIN.err_Va, UM_ERR_VA_GPIO_Port, UM_ERR_VA_Pin, 1);
/* Светодиоды платы УМ */
GPIO_LED_Init(&UPP_LEDS.green1, UM_LED_GREEN1_GPIO_Port, UM_LED_GREEN1_Pin, 0);
GPIO_LED_Init(&UPP_LEDS.green2, UM_LED_GREEN2_GPIO_Port, UM_LED_GREEN2_Pin, 0);
GPIO_LED_Init(&UPP_LEDS.red, UM_LED_RED_GPIO_Port, UM_LED_RED_Pin, 0);
/* Очищаем выходы */
UPP_DO.CEN(DISABLE);
UPP_DO.Error(DISABLE);
UPP_DO.Work(DISABLE);
UPP_DO.Ready(DISABLE);
UPP_DO.RDO4(DISABLE);
UPP_DO.DO1(DISABLE);
UPP_DO.DO2(DISABLE);
UPP_DO.DO3(DISABLE);
UPP_DO.DO4(DISABLE);
UPP_DO.DO5(DISABLE);
GPIO_LED_Off(&UPP_LEDS.green1);
GPIO_LED_Off(&UPP_LEDS.green2);
GPIO_LED_Off(&UPP_LEDS.red);
}
void UPP_RDO1_Write(int state)
/**
* @brief Выставить направление UART1 (STM USART2)
*/
void UPP_UART1_SetDirection(int state)
{
HAL_GPIO_WritePin(SCIDE1_GPIO_Port, SCIDE1_Pin, state);
}
/**
* @brief Выставить направление UART2 (STM USART5)
*/
void UPP_UART2_SetDirection(int state)
{
HAL_GPIO_WritePin(SCIDE2_GPIO_Port, SCIDE2_Pin, state);
}
static void UPP_CEN_Write(int state)
{
HAL_GPIO_WritePin(CEN_GPIO_Port, CEN_Pin, !state);
}
static void UPP_RDO1_Write(int state)
{
HAL_GPIO_WritePin(RDO1_GPIO_Port, RDO1_Pin, state);
}
void UPP_RDO2_Write(int state)
static void UPP_RDO2_Write(int state)
{
HAL_GPIO_WritePin(RDO2_GPIO_Port, RDO2_Pin, state);
}
void UPP_RDO3_Write(int state)
static void UPP_RDO3_Write(int state)
{
HAL_GPIO_WritePin(RDO3_GPIO_Port, RDO3_Pin, state);
}
void UPP_RDO4_Write(int state)
static void UPP_RDO4_Write(int state)
{
HAL_GPIO_WritePin(RDO4_GPIO_Port, RDO4_Pin, state);
}
void UPP_DO1_Write(int state)
static void UPP_DO1_Write(int state)
{
HAL_GPIO_WritePin(DO1_GPIO_Port, DO1_Pin, state);
}
void UPP_DO2_Write(int state)
static void UPP_DO2_Write(int state)
{
HAL_GPIO_WritePin(DO2_GPIO_Port, DO2_Pin, state);
}
void UPP_DO3_Write(int state)
static void UPP_DO3_Write(int state)
{
HAL_GPIO_WritePin(DO3_GPIO_Port, DO3_Pin, state);
}
void UPP_DO4_Write(int state)
static void UPP_DO4_Write(int state)
{
HAL_GPIO_WritePin(DO4_GPIO_Port, DO4_Pin, state);
}
void UPP_DO5_Write(int state)
static void UPP_DO5_Write(int state)
{
HAL_GPIO_WritePin(DO5_GPIO_Port, DO5_Pin, state);
}
void UPP_Connect_Discrete(void)
{
UPP_DO.CEN = &UPP_CEN_Write;
UPP_DO.RDO_Error = &UPP_RDO1_Write;
UPP_DO.RDO_Work = &UPP_RDO2_Write;
UPP_DO.RDO_Ready = &UPP_RDO3_Write;
UPP_DO.RDO4_Reserved = &UPP_RDO4_Write;
UPP_DO.DO1_Reserved = &UPP_DO1_Write;
UPP_DO.DO2_Reserved = &UPP_DO2_Write;
UPP_DO.DO3_Reserved = &UPP_DO3_Write;
UPP_DO.DO4_Reserved = &UPP_DO4_Write;
UPP_DO.DO5_Reserved = &UPP_DO5_Write;
}

View File

@ -6,10 +6,12 @@
* @details
******************************************************************************/
#ifndef _UPP_ERRORS_H
#define _UPP_ERRORS_H
#ifndef _UPP_IO_H
#define _UPP_IO_H
#include "mylibs_include.h"
typedef struct
{
/* Отладочные светодиоды */
@ -21,13 +23,15 @@ extern UPP_LEDs_t UPP_LEDS;
typedef struct
{
GPIO_SwitchTypeDef in1;
GPIO_SwitchTypeDef in2;
GPIO_SwitchTypeDef in3;
GPIO_SwitchTypeDef Pusk; ///< Команда «ПУСК»
GPIO_SwitchTypeDef MestDist; ///< Мест/дист управление
GPIO_SwitchTypeDef DIN3; ///< Резерв
GPIO_SwitchTypeDef err_24V;
GPIO_SwitchTypeDef err_5Vd;
GPIO_SwitchTypeDef err_5Vsi;
GPIO_SwitchTypeDef err_24Vdio;///< Сигнал ошибки источника питания цифровых входов/выходов
GPIO_SwitchTypeDef err_24V; ///< Сигнал ошибки основного источника питания 24В
GPIO_SwitchTypeDef err_5Vsi; ///< Сигнал ошибки источника питания цифровых интерфейсов
GPIO_SwitchTypeDef err_5Vd; ///< Вход сигнала неисправности цифрового источника питания 5В(+5Vd) микроконтроллера и микросхем ввода-вывода (5 В).
GPIO_SwitchTypeDef err_Va; ///< Вход обобщенного сигнала неисправности аналоговых источников питания +3,3В(+3Va), 5В(+5Vа), +15В(+15Va).
}UPP_DiscreteInputs_t;
extern UPP_DiscreteInputs_t UPP_DIN;
@ -35,17 +39,25 @@ typedef struct
{
void (*CEN)(int state);
void (*RDO_Error)(int state);
void (*RDO_Work)(int state);
void (*RDO_Ready)(int state);
void (*RDO4_Reserved)(int state);
void (*Error)(int state);
void (*Work)(int state);
void (*Ready)(int state);
void (*RDO4)(int state);
void (*DO1_Reserved)(int state);
void (*DO2_Reserved)(int state);
void (*DO3_Reserved)(int state);
void (*DO4_Reserved)(int state);
void (*DO5_Reserved)(int state);
void (*DO1)(int state);
void (*DO2)(int state);
void (*DO3)(int state);
void (*DO4)(int state);
void (*DO5)(int state);
}UPP_DiscreteOutputs_t;
extern UPP_DiscreteOutputs_t UPP_DO;
#endif //_UPP_ERRORS_H
/* Инициализация дискретных входов/выходов УПП */
void UPP_IO_Init(void);
/* Выставить направление UART1 (STM USART2) */
void UPP_UART1_SetDirection(int state);
/* Выставить направление UART2 (STM USART5) */
void UPP_UART2_SetDirection(int state);
#endif //_UPP_IO_H

View File

@ -7,6 +7,7 @@
******************************************************************************/
#include "upp_main.h" // всё остальное по работе с УПП
#include "tim.h"
#include "iwdg.h"
UPP_t upp;
float iref_dbg = 0;
@ -18,6 +19,9 @@ float iref_dbg = 0;
*/
int UPP_Init(void)
{
/* Очищаем входы */
UPP_IO_Init();
BenchTime_Init();
// Подключение указателей
upp.errors = &errors;
@ -25,10 +29,22 @@ int UPP_Init(void)
upp.PUI.values = &MB_DATA.InRegs.pui;
upp.call = &MB_INTERNAL.FuncCalls;
HAL_TIM_Base_Start(&ustim);
PowerMonitor_Init(&upp.pm);
PWM_Init(&upp.hpwm);
Angle_Init(&upp.hangle);
if(HAL_TIM_Base_Start(&ustim) != HAL_OK)
{
return 1;
}
if(PowerMonitor_Init(&upp.pm) != HAL_OK)
{
return 1;
}
if(PWM_Init(&upp.hpwm) != HAL_OK)
{
return 1;
}
if(Angle_Init(&upp.hangle) != HAL_OK)
{
return 1;
}
upp.workmode = WM_Ready;
return 0;
@ -41,8 +57,14 @@ int UPP_Init(void)
int UPP_PreWhile(void)
{
UPP_Params_InternalControl();
Angle_SetRange(&upp.hangle, 0.0, 0.8);
PowerMonitor_Start(&upp.pm);
if(Angle_SetRange(&upp.hangle, 0.0, 0.8) != HAL_OK)
return 1;
if(PowerMonitor_Start(&upp.pm) != HAL_OK)
return 1;
return 0;
}
@ -52,8 +74,14 @@ int UPP_PreWhile(void)
*/
int UPP_While(void)
{
int retval = 0;
HAL_IWDG_Refresh(&hiwdg);
if(upp.pm.f.runSlow)
{
BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY);
UPP_DO.CEN(ENABLE);
// если ошибка вызываем СТОП
if(errors.pui.all)
{
@ -84,7 +112,14 @@ int UPP_While(void)
// Автомат состояний УПП
switch(upp.workmode)
{
/* Состояние готовности */
case WM_Ready:
PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ
// Индикация
UPP_DO.Ready(ENABLE);
UPP_DO.Work(DISABLE);
UPP_DO.Error(DISABLE);
// если пришла команда на запуск
if (upp.call->go)
{
@ -94,7 +129,12 @@ int UPP_While(void)
}
break;
/* Состояние В работе */
case WM_Running:
// Индикация
UPP_DO.Ready(DISABLE);
UPP_DO.Work(ENABLE);
UPP_DO.Error(DISABLE);
// если пришла команда на остановку
if (!upp.call->go)
upp.workmode = WM_Ready;
@ -105,32 +145,43 @@ int UPP_While(void)
// если слишком долгий запуск
if((local_time() - upp.StartTick) > (upp.PUI.params->Tdelay*1000))
{
errors.pui.err.LongStart = 1;
ERR_PRIVATE.longstart = 1;
}
break;
// /* Состояние Работа завершена */
// case WM_Done:
// // Индикация
// UPP_DO.Ready(DISABLE);
// UPP_DO.Work(DISABLE);
// UPP_DO.Error(DISABLE);
// PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ
// break;
/* Состояние Ошибки */
case WM_Error:
default:
PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ
// Индикация
UPP_DO.Ready(ENABLE);
UPP_DO.Work(DISABLE);
UPP_DO.Error(ENABLE);
// Находимся до тех пор пока ошибки не будет устранена
if(errors.common == Err_None)
upp.workmode = WM_Ready;
PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ
break;
case WM_Done:
PWM_Stop(&upp.hpwm, 0, 1); // Останавливаем ВЕСЬ ШИМ
break;
default:
retval = 1;
break;
}
upp.pm.f.runSlow = 0;
upp.Timings.slow_calc_us = BenchTime_End(BT_SLOWCALC, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ;
}//if(upp.pm.f.runSlow)
else
{
}
return 0;
return retval;
}
@ -153,9 +204,18 @@ void UPP_Tick(void)
void UPP_ADC_Handle(void)
{
BenchTime_Start(BT_ADC, angletim.Instance->CNT, HAL_MAX_DELAY);
if(upp.pm.f.inIsr)
{
ERR_PRIVATE.overrun_fast_calc = 1;
ERR_PRIVATE_CNT.overrun_fast_calc++;
return;
}
upp.pm.f.inIsr = 1;
PowerMonitor_FastCalc(&upp.pm);
PowerMonitor_Protect(&upp.pm, upp.workmode == WM_Running);
for(int phase = 0; phase < 3; phase++)
{
// Если произошел Zero Cross
@ -175,13 +235,14 @@ void UPP_ADC_Handle(void)
// Проверяем на ошибки
upp.Timings.isr_adc = BenchTime_End(BT_ADC, angletim.Instance->CNT);
upp.Timings.isr_adc_us = BenchTime_End(BT_ADC, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ;
upp.pm.f.inIsr = 0;
}
void UPP_PWM_Handle(void)
{
BenchTime_Start(BT_PWM, angletim.Instance->CNT, HAL_MAX_DELAY);
PWM_Handle(&upp.hpwm);
upp.Timings.isr_pwm = BenchTime_End(BT_PWM, angletim.Instance->CNT);
upp.Timings.isr_pwm_us = BenchTime_End(BT_PWM, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ;
}
void UPP_Angle_Handle(void)
@ -212,8 +273,13 @@ void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef* htim)
{
if (htim == upp.hangle.htim)
{
BenchTime_Start(BT_SYSTICK, angletim.Instance->CNT, HAL_MAX_DELAY);
UPP_Angle_Handle();
upp.Timings.isr_systick = BenchTime_End(BT_SYSTICK, angletim.Instance->CNT);
}
}
void HAL_IncTick(void)
{
BenchTime_Start(BT_SYSTICK, angletim.Instance->CNT, HAL_MAX_DELAY);
uwTick += uwTickFreq;
UPP_Tick();
upp.Timings.isr_systick_us = BenchTime_End(BT_SYSTICK, angletim.Instance->CNT)/ANGLE_TIM2_FREQ_MHZ;
}

View File

@ -39,9 +39,10 @@ typedef struct
struct
{
uint32_t isr_adc;
uint32_t isr_pwm;
uint32_t isr_systick;
uint32_t slow_calc_us;
uint32_t isr_adc_us;
uint32_t isr_pwm_us;
uint32_t isr_systick_us;
}Timings;
}UPP_t;
extern UPP_t upp;

View File

@ -35,6 +35,7 @@ void UPP_Params_InternalControl(void)
float angle_pid_kp = upp.hangle.pid.Kp;
float angle_pid_ki = upp.hangle.pid.Ki;
float angle_pid_kd = upp.hangle.pid.Kd;
float angle_ref_alpha = upp.hangle.refFilter.alpha;
// временная переменная для параметров каналов АЦП
float adc_channel_max[ADC_NUMB_OF_REGULAR_CHANNELS] = {0};
uint16_t adc_channel_zero[ADC_NUMB_OF_REGULAR_CHANNELS] = {0};
@ -71,6 +72,10 @@ void UPP_Params_InternalControl(void)
{
alpha_update = 1;
}
if(__CheckSimpleParamF(&angle_ref_alpha, PARAM_INTERNAL.angle.PID_ExpAlpha, 65535))
{
alpha_update = 1;
}
@ -130,7 +135,7 @@ void UPP_Params_InternalControl(void)
if(alpha_update)
{
Angle_SetRange(&upp.hangle, angle_min, angle_max);
Angle_PID_Init(&upp.hangle, angle_pid_kp, angle_pid_ki, angle_pid_kd);
Angle_PID_Init(&upp.hangle, angle_pid_kp, angle_pid_ki, angle_pid_kd, angle_ref_alpha);
}
// Обновление АЦП конфигов
for(int i = 0; i < ADC_NUMB_OF_REGULAR_CHANNELS; i++)
@ -140,7 +145,7 @@ void UPP_Params_InternalControl(void)
if(ADC_ConfigChannel(&upp.pm.adc, i, adc_channel_zero[i], adc_channel_max[i], 4095) == HAL_OK)
adc_channel_update[i] = 0;
else
errors.prvt.cnt.adc_reinit_err++;
ERR_PRIVATE_CNT.adc_reinit_err++;
}
}
// Обновление Zero-Cross конфигов
@ -149,7 +154,7 @@ void UPP_Params_InternalControl(void)
if(ZC_Init(&upp.pm.zc, upp.pm.zc.Config.NumChannels, zc_hysteresis, zc_debounce) == HAL_OK)
zc_update = 0;
else
errors.prvt.cnt.zc_reinit_err++;
ERR_PRIVATE_CNT.zc_reinit_err++;
}
// Обновление ШИМ конфигов
if(pwm_update)
@ -160,7 +165,7 @@ void UPP_Params_InternalControl(void)
__AngleSetLimit();
}
else
errors.prvt.cnt.pwm_reinit_err++;
ERR_PRIVATE_CNT.pwm_reinit_err++;
}
if ((upp.hangle.Config.PeriodLimit == 0) || (upp.hangle.Config.PeriodLimit >= 0.999))
{
@ -221,6 +226,14 @@ void UPP_SetDefault(int pui_default, int internal_default)
PARAM_INTERNAL.zc.Hysteresis = ZERO_CROSS_HYSTERESIS_PERCENT_DEFAULT*100;
PARAM_INTERNAL.zc.DebouneCouner = ZERO_CROSS_DEBOUNCE_CNT_DEFAULT;
PARAM_INTERNAL.angle.PID_Kp = ANGLE_PID_KP_COEF_DEFAULT*10000;
PARAM_INTERNAL.angle.PID_Ki = ANGLE_PID_KI_COEF_DEFAULT*10000;
PARAM_INTERNAL.angle.PID_Kd = ANGLE_PID_KD_COEF_DEFAULT*10000;
PARAM_INTERNAL.angle.PID_ExpAlpha = ANGLE_REF_ALPHA_COEF_DEFAULT*65535;
PARAM_INTERNAL.angle.Angle_Max = ANGLE_MAX_PERCENT_DEFAULT*65535;
PARAM_INTERNAL.angle.Angle_Min = ANGLE_MIN_PERCENT_DEFAULT*65535;
//__AngleSetLimit();
}
}

View File

@ -82,9 +82,10 @@ typedef struct
{
uint16_t Angle_Max; ///< Максимальный угол открытия тиристора [0..1 x 65535]
uint16_t Angle_Min; ///< Минимальный угол открытия тиристора [0..1 x 65535]
uint16_t PID_Kp; ///< Пропорциональный коэфициент ПИ регулятора угла [x 1000]
uint16_t PID_Ki; ///< Интегральный коэфициент ПИ регулятора угла [x 1000]
uint16_t PID_Kd; ///< Интегральный коэфициент ПИ регулятора угла [x 1000]
uint16_t PID_Kp; ///< Пропорциональный коэфициент ПИ регулятора угла [x 10000]
uint16_t PID_Ki; ///< Интегральный коэфициент ПИ регулятора угла [x 10000]
uint16_t PID_Kd; ///< Интегральный коэфициент ПИ регулятора угла [x 10000]
uint16_t PID_ExpAlpha; ///< Коэффициент сглаживающего фильтра задания регулятора [0..1 x 65535]
}angle;

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<component_viewer schemaVersion="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="Component_Viewer.xsd">
<component name="EventRecorderStub" version="1.0.0"/> <!--name and version of the component-->
<events>
</events>
</component_viewer>

View File

@ -0,0 +1,24 @@
/*
* Auto generated Run-Time-Environment Configuration File
* *** Do not modify ! ***
*
* Project: 'UPP'
* Target: 'Debug_F417'
*/
#ifndef RTE_COMPONENTS_H
#define RTE_COMPONENTS_H
/*
* Define the Device Header File:
*/
#define CMSIS_device_header "stm32f4xx.h"
/* Keil.ARM Compiler::Compiler:I/O:STDOUT:ITM:1.2.0 */
#define RTE_Compiler_IO_STDOUT /* Compiler I/O: STDOUT */
#define RTE_Compiler_IO_STDOUT_ITM /* Compiler I/O: STDOUT ITM */
#endif /* RTE_COMPONENTS_H */

View File

@ -75,7 +75,7 @@
<OPTFL>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<IsCurrentTarget>1</IsCurrentTarget>
<IsCurrentTarget>0</IsCurrentTarget>
</OPTFL>
<CpuCode>18</CpuCode>
<DebugOpt>
@ -198,6 +198,272 @@
</TargetOption>
</Target>
<Target>
<TargetName>Debug_F417</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<TargetOption>
<CLKADS>12000000</CLKADS>
<OPTTT>
<gFlags>1</gFlags>
<BeepAtEnd>1</BeepAtEnd>
<RunSim>0</RunSim>
<RunTarget>1</RunTarget>
<RunAbUc>0</RunAbUc>
</OPTTT>
<OPTHX>
<HexSelection>1</HexSelection>
<FlashByte>65535</FlashByte>
<HexRangeLowAddress>0</HexRangeLowAddress>
<HexRangeHighAddress>0</HexRangeHighAddress>
<HexOffset>0</HexOffset>
</OPTHX>
<OPTLEX>
<PageWidth>79</PageWidth>
<PageLength>66</PageLength>
<TabStop>8</TabStop>
<ListingPath></ListingPath>
</OPTLEX>
<ListingPage>
<CreateCListing>1</CreateCListing>
<CreateAListing>1</CreateAListing>
<CreateLListing>1</CreateLListing>
<CreateIListing>0</CreateIListing>
<AsmCond>1</AsmCond>
<AsmSymb>1</AsmSymb>
<AsmXref>0</AsmXref>
<CCond>1</CCond>
<CCode>0</CCode>
<CListInc>0</CListInc>
<CSymb>0</CSymb>
<LinkerCodeListing>0</LinkerCodeListing>
</ListingPage>
<OPTXL>
<LMap>1</LMap>
<LComments>1</LComments>
<LGenerateSymbols>1</LGenerateSymbols>
<LLibSym>1</LLibSym>
<LLines>1</LLines>
<LLocSym>1</LLocSym>
<LPubSym>1</LPubSym>
<LXref>0</LXref>
<LExpSel>0</LExpSel>
</OPTXL>
<OPTFL>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<IsCurrentTarget>1</IsCurrentTarget>
</OPTFL>
<CpuCode>18</CpuCode>
<DebugOpt>
<uSim>0</uSim>
<uTrg>1</uTrg>
<sLdApp>1</sLdApp>
<sGomain>1</sGomain>
<sRbreak>1</sRbreak>
<sRwatch>1</sRwatch>
<sRmem>1</sRmem>
<sRfunc>1</sRfunc>
<sRbox>1</sRbox>
<tLdApp>1</tLdApp>
<tGomain>1</tGomain>
<tRbreak>1</tRbreak>
<tRwatch>1</tRwatch>
<tRmem>1</tRmem>
<tRfunc>1</tRfunc>
<tRbox>1</tRbox>
<tRtrace>1</tRtrace>
<sRSysVw>1</sRSysVw>
<tRSysVw>1</tRSysVw>
<sRunDeb>0</sRunDeb>
<sLrtime>0</sLrtime>
<bEvRecOn>1</bEvRecOn>
<bSchkAxf>0</bSchkAxf>
<bTchkAxf>0</bTchkAxf>
<nTsel>6</nTsel>
<sDll></sDll>
<sDllPa></sDllPa>
<sDlgDll></sDlgDll>
<sDlgPa></sDlgPa>
<sIfile></sIfile>
<tDll></tDll>
<tDllPa></tDllPa>
<tDlgDll></tDlgDll>
<tDlgPa></tDlgPa>
<tIfile></tIfile>
<pMon>STLink\ST-LINKIII-KEIL_SWO.dll</pMon>
</DebugOpt>
<TargetDriverDllRegistry>
<SetRegEntry>
<Number>0</Number>
<Key>ARMRTXEVENTFLAGS</Key>
<Name>-L70 -Z18 -C0 -M0 -T1</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>DLGTARM</Key>
<Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=620,209,878,797,0)(1012=-1,-1,-1,-1,0)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>ARMDBGFLAGS</Key>
<Name></Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>DLGUARM</Key>
<Name>(105=-1,-1,-1,-1,0)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>UL2CM3</Key>
<Name>UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32F417ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>ST-LINKIII-KEIL_SWO</Key>
<Name>-U005600373433510237363934 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131123 -TC168000000 -TT10000000 -TP21 -TDS800D -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F417ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2</Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint>
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>136</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134258308</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>1</BreakIfRCount>
<Filename>../Core/Src/stm32f4xx_it.c</Filename>
<ExecCommand></ExecCommand>
<Expression>\\Debug_F417\../Core/Src/stm32f4xx_it.c\136</Expression>
</Bp>
</Breakpoint>
<WatchWindow1>
<Ww>
<count>0</count>
<WinNumber>1</WinNumber>
<ItemText>upp,0x0A</ItemText>
</Ww>
<Ww>
<count>1</count>
<WinNumber>1</WinNumber>
<ItemText>uwTick,0x0A</ItemText>
</Ww>
<Ww>
<count>2</count>
<WinNumber>1</WinNumber>
<ItemText>errors.prvt.f.err,0x0A</ItemText>
</Ww>
<Ww>
<count>3</count>
<WinNumber>1</WinNumber>
<ItemText>errors.prvt.cnt,0x0A</ItemText>
</Ww>
<Ww>
<count>4</count>
<WinNumber>1</WinNumber>
<ItemText>hbt,0x0A</ItemText>
</Ww>
</WatchWindow1>
<WatchWindow2>
<Ww>
<count>0</count>
<WinNumber>2</WinNumber>
<ItemText>MB_INTERNAL,0x0A</ItemText>
</Ww>
<Ww>
<count>1</count>
<WinNumber>2</WinNumber>
<ItemText>MB_DATA</ItemText>
</Ww>
<Ww>
<count>2</count>
<WinNumber>2</WinNumber>
<ItemText>errors.prvt.f.err,0x0A</ItemText>
</Ww>
<Ww>
<count>3</count>
<WinNumber>2</WinNumber>
<ItemText>errors.prvt.cnt</ItemText>
</Ww>
<Ww>
<count>4</count>
<WinNumber>2</WinNumber>
<ItemText>errors.pui,0x0A</ItemText>
</Ww>
<Ww>
<count>5</count>
<WinNumber>2</WinNumber>
<ItemText>errors.common</ItemText>
</Ww>
</WatchWindow2>
<Tracepoint>
<THDelay>0</THDelay>
</Tracepoint>
<DebugFlag>
<trace>0</trace>
<periodic>1</periodic>
<aLwin>1</aLwin>
<aCover>0</aCover>
<aSer1>0</aSer1>
<aSer2>0</aSer2>
<aPa>0</aPa>
<viewmode>1</viewmode>
<vrSel>0</vrSel>
<aSym>0</aSym>
<aTbox>0</aTbox>
<AscS1>0</AscS1>
<AscS2>0</AscS2>
<AscS3>0</AscS3>
<aSer3>0</aSer3>
<eProf>0</eProf>
<aLa>0</aLa>
<aPa1>0</aPa1>
<AscS4>0</AscS4>
<aSer4>0</aSer4>
<StkLoc>1</StkLoc>
<TrcWin>0</TrcWin>
<newCpu>0</newCpu>
<uProt>0</uProt>
</DebugFlag>
<LintExecutable></LintExecutable>
<LintConfigFile></LintConfigFile>
<bLintAuto>0</bLintAuto>
<bAutoGenD>0</bAutoGenD>
<LntExFlags>0</LntExFlags>
<pMisraName></pMisraName>
<pszMrule></pszMrule>
<pSingCmds></pSingCmds>
<pMultCmds></pMultCmds>
<pMisraNamep></pMisraNamep>
<pszMrulep></pszMrulep>
<pSingCmdsp></pSingCmdsp>
<pMultCmdsp></pMultCmdsp>
<SystemViewers>
<Entry>
<Name>System Viewer\DMA2</Name>
<WinId>35905</WinId>
</Entry>
<Entry>
<Name>System Viewer\TIM8</Name>
<WinId>35904</WinId>
</Entry>
</SystemViewers>
<DebugDescription>
<Enable>1</Enable>
<EnableFlashSeq>0</EnableFlashSeq>
<EnableLog>0</EnableLog>
<Protocol>2</Protocol>
<DbgClock>10000000</DbgClock>
</DebugDescription>
</TargetOption>
</Target>
<Group>
<GroupName>Configs</GroupName>
<tvExp>1</tvExp>
@ -643,6 +909,18 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Core\Src\DBG_stm32f417_support.c</PathWithFileName>
<FilenameWithoutPath>DBG_stm32f417_support.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>../Core/Src/main.c</PathWithFileName>
<FilenameWithoutPath>main.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
@ -650,7 +928,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>36</FileNumber>
<FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -662,7 +940,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>37</FileNumber>
<FileNumber>38</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -674,7 +952,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>38</FileNumber>
<FileNumber>39</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -686,7 +964,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>39</FileNumber>
<FileNumber>40</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -698,7 +976,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>40</FileNumber>
<FileNumber>41</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -710,7 +988,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>41</FileNumber>
<FileNumber>42</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -722,7 +1000,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>42</FileNumber>
<FileNumber>43</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -734,7 +1012,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>43</FileNumber>
<FileNumber>44</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -746,7 +1024,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>44</FileNumber>
<FileNumber>45</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -758,7 +1036,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>45</FileNumber>
<FileNumber>46</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -770,7 +1048,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>46</FileNumber>
<FileNumber>47</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -782,7 +1060,7 @@
</File>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>47</FileNumber>
<FileNumber>48</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -802,7 +1080,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>48</FileNumber>
<FileNumber>49</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -814,7 +1092,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>49</FileNumber>
<FileNumber>50</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -826,7 +1104,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>50</FileNumber>
<FileNumber>51</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -838,7 +1116,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>51</FileNumber>
<FileNumber>52</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -850,7 +1128,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>52</FileNumber>
<FileNumber>53</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -862,7 +1140,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>53</FileNumber>
<FileNumber>54</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -874,7 +1152,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>54</FileNumber>
<FileNumber>55</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -886,7 +1164,7 @@
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>55</FileNumber>
<FileNumber>56</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -906,7 +1184,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>56</FileNumber>
<FileNumber>57</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -918,7 +1196,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>57</FileNumber>
<FileNumber>58</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -930,7 +1208,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>58</FileNumber>
<FileNumber>59</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -942,7 +1220,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>59</FileNumber>
<FileNumber>60</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -954,7 +1232,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>60</FileNumber>
<FileNumber>61</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -966,7 +1244,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>61</FileNumber>
<FileNumber>62</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -978,7 +1256,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>62</FileNumber>
<FileNumber>63</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -990,7 +1268,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>63</FileNumber>
<FileNumber>64</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1002,7 +1280,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>64</FileNumber>
<FileNumber>65</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1014,7 +1292,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>65</FileNumber>
<FileNumber>66</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1026,7 +1304,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>66</FileNumber>
<FileNumber>67</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1038,7 +1316,7 @@
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>67</FileNumber>
<FileNumber>68</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1058,7 +1336,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>68</FileNumber>
<FileNumber>69</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1070,7 +1348,7 @@
</File>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>69</FileNumber>
<FileNumber>70</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1090,7 +1368,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>70</FileNumber>
<FileNumber>71</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1102,7 +1380,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>71</FileNumber>
<FileNumber>72</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1114,7 +1392,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>72</FileNumber>
<FileNumber>73</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1126,7 +1404,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>73</FileNumber>
<FileNumber>74</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1138,7 +1416,7 @@
</File>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>74</FileNumber>
<FileNumber>75</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1158,7 +1436,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>75</FileNumber>
<FileNumber>76</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1170,7 +1448,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>76</FileNumber>
<FileNumber>77</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1182,7 +1460,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>77</FileNumber>
<FileNumber>78</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1194,7 +1472,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>78</FileNumber>
<FileNumber>79</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1206,7 +1484,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>79</FileNumber>
<FileNumber>80</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1218,7 +1496,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>80</FileNumber>
<FileNumber>81</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1230,7 +1508,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>81</FileNumber>
<FileNumber>82</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1242,7 +1520,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>82</FileNumber>
<FileNumber>83</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1254,7 +1532,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>83</FileNumber>
<FileNumber>84</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1266,7 +1544,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>84</FileNumber>
<FileNumber>85</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1278,7 +1556,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>85</FileNumber>
<FileNumber>86</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1290,7 +1568,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>86</FileNumber>
<FileNumber>87</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1302,7 +1580,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>87</FileNumber>
<FileNumber>88</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1314,7 +1592,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>88</FileNumber>
<FileNumber>89</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1326,7 +1604,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>89</FileNumber>
<FileNumber>90</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1338,7 +1616,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>90</FileNumber>
<FileNumber>91</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1350,7 +1628,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>91</FileNumber>
<FileNumber>92</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1362,7 +1640,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>92</FileNumber>
<FileNumber>93</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1374,7 +1652,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>93</FileNumber>
<FileNumber>94</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1386,7 +1664,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>94</FileNumber>
<FileNumber>95</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1398,7 +1676,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>95</FileNumber>
<FileNumber>96</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1410,7 +1688,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>96</FileNumber>
<FileNumber>97</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1422,7 +1700,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>97</FileNumber>
<FileNumber>98</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1434,7 +1712,7 @@
</File>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>98</FileNumber>
<FileNumber>99</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1454,7 +1732,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>99</FileNumber>
<FileNumber>100</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -1468,18 +1746,30 @@
<Group>
<GroupName>Application/MDK-ARM</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>100</FileNumber>
<FileNumber>101</FileNumber>
<FileType>2</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>startup_stm32f427xx.s</PathWithFileName>
<PathWithFileName>.\startup_stm32f417xx.s</PathWithFileName>
<FilenameWithoutPath>startup_stm32f417xx.s</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>102</FileNumber>
<FileType>2</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\startup_stm32f427xx.s</PathWithFileName>
<FilenameWithoutPath>startup_stm32f427xx.s</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,424 @@
;*******************************************************************************
;* File Name : startup_stm32f417xx.s
;* Author : MCD Application Team
;* Description : STM32F417xx devices vector table for MDK-ARM toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the CortexM4 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;*******************************************************************************
;* @attention
;*
;* Copyright (c) 2017 STMicroelectronics.
;* All rights reserved.
;*
;* This software is licensed under terms that can be found in the LICENSE file
;* in the root directory of this software component.
;* If no LICENSE file comes with this software, it is provided AS-IS.
;*
;*******************************************************************************
;* <<< Use Configuration Wizard in Context Menu >>>
;
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window WatchDog
DCD PVD_IRQHandler ; PVD through EXTI Line detection
DCD TAMP_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line
DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line
DCD FLASH_IRQHandler ; FLASH
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line0
DCD EXTI1_IRQHandler ; EXTI Line1
DCD EXTI2_IRQHandler ; EXTI Line2
DCD EXTI3_IRQHandler ; EXTI Line3
DCD EXTI4_IRQHandler ; EXTI Line4
DCD DMA1_Stream0_IRQHandler ; DMA1 Stream 0
DCD DMA1_Stream1_IRQHandler ; DMA1 Stream 1
DCD DMA1_Stream2_IRQHandler ; DMA1 Stream 2
DCD DMA1_Stream3_IRQHandler ; DMA1 Stream 3
DCD DMA1_Stream4_IRQHandler ; DMA1 Stream 4
DCD DMA1_Stream5_IRQHandler ; DMA1 Stream 5
DCD DMA1_Stream6_IRQHandler ; DMA1 Stream 6
DCD ADC_IRQHandler ; ADC1, ADC2 and ADC3s
DCD CAN1_TX_IRQHandler ; CAN1 TX
DCD CAN1_RX0_IRQHandler ; CAN1 RX0
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
DCD EXTI9_5_IRQHandler ; External Line[9:5]s
DCD TIM1_BRK_TIM9_IRQHandler ; TIM1 Break and TIM9
DCD TIM1_UP_TIM10_IRQHandler ; TIM1 Update and TIM10
DCD TIM1_TRG_COM_TIM11_IRQHandler ; TIM1 Trigger and Commutation and TIM11
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; External Line[15:10]s
DCD RTC_Alarm_IRQHandler ; RTC Alarm (A and B) through EXTI Line
DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI line
DCD TIM8_BRK_TIM12_IRQHandler ; TIM8 Break and TIM12
DCD TIM8_UP_TIM13_IRQHandler ; TIM8 Update and TIM13
DCD TIM8_TRG_COM_TIM14_IRQHandler ; TIM8 Trigger and Commutation and TIM14
DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare
DCD DMA1_Stream7_IRQHandler ; DMA1 Stream7
DCD FMC_IRQHandler ; FMC
DCD SDIO_IRQHandler ; SDIO
DCD TIM5_IRQHandler ; TIM5
DCD SPI3_IRQHandler ; SPI3
DCD UART4_IRQHandler ; UART4
DCD UART5_IRQHandler ; UART5
DCD TIM6_DAC_IRQHandler ; TIM6 and DAC1&2 underrun errors
DCD TIM7_IRQHandler ; TIM7
DCD DMA2_Stream0_IRQHandler ; DMA2 Stream 0
DCD DMA2_Stream1_IRQHandler ; DMA2 Stream 1
DCD DMA2_Stream2_IRQHandler ; DMA2 Stream 2
DCD DMA2_Stream3_IRQHandler ; DMA2 Stream 3
DCD DMA2_Stream4_IRQHandler ; DMA2 Stream 4
DCD ETH_IRQHandler ; Ethernet
DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line
DCD CAN2_TX_IRQHandler ; CAN2 TX
DCD CAN2_RX0_IRQHandler ; CAN2 RX0
DCD CAN2_RX1_IRQHandler ; CAN2 RX1
DCD CAN2_SCE_IRQHandler ; CAN2 SCE
DCD OTG_FS_IRQHandler ; USB OTG FS
DCD DMA2_Stream5_IRQHandler ; DMA2 Stream 5
DCD DMA2_Stream6_IRQHandler ; DMA2 Stream 6
DCD DMA2_Stream7_IRQHandler ; DMA2 Stream 7
DCD USART6_IRQHandler ; USART6
DCD I2C3_EV_IRQHandler ; I2C3 event
DCD I2C3_ER_IRQHandler ; I2C3 error
DCD OTG_HS_EP1_OUT_IRQHandler ; USB OTG HS End Point 1 Out
DCD OTG_HS_EP1_IN_IRQHandler ; USB OTG HS End Point 1 In
DCD OTG_HS_WKUP_IRQHandler ; USB OTG HS Wakeup through EXTI
DCD OTG_HS_IRQHandler ; USB OTG HS
DCD DCMI_IRQHandler ; DCMI
DCD CRYP_IRQHandler ; CRYPTO
DCD HASH_RNG_IRQHandler ; Hash and Rng
DCD FPU_IRQHandler ; FPU
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler\
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler\
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT TAMP_STAMP_IRQHandler [WEAK]
EXPORT RTC_WKUP_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
EXPORT DMA1_Stream0_IRQHandler [WEAK]
EXPORT DMA1_Stream1_IRQHandler [WEAK]
EXPORT DMA1_Stream2_IRQHandler [WEAK]
EXPORT DMA1_Stream3_IRQHandler [WEAK]
EXPORT DMA1_Stream4_IRQHandler [WEAK]
EXPORT DMA1_Stream5_IRQHandler [WEAK]
EXPORT DMA1_Stream6_IRQHandler [WEAK]
EXPORT ADC_IRQHandler [WEAK]
EXPORT CAN1_TX_IRQHandler [WEAK]
EXPORT CAN1_RX0_IRQHandler [WEAK]
EXPORT CAN1_RX1_IRQHandler [WEAK]
EXPORT CAN1_SCE_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_TIM9_IRQHandler [WEAK]
EXPORT TIM1_UP_TIM10_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_TIM11_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT TIM4_IRQHandler [WEAK]
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT I2C2_EV_IRQHandler [WEAK]
EXPORT I2C2_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT USART3_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
EXPORT RTC_Alarm_IRQHandler [WEAK]
EXPORT OTG_FS_WKUP_IRQHandler [WEAK]
EXPORT TIM8_BRK_TIM12_IRQHandler [WEAK]
EXPORT TIM8_UP_TIM13_IRQHandler [WEAK]
EXPORT TIM8_TRG_COM_TIM14_IRQHandler [WEAK]
EXPORT TIM8_CC_IRQHandler [WEAK]
EXPORT DMA1_Stream7_IRQHandler [WEAK]
EXPORT FMC_IRQHandler [WEAK]
EXPORT SDIO_IRQHandler [WEAK]
EXPORT TIM5_IRQHandler [WEAK]
EXPORT SPI3_IRQHandler [WEAK]
EXPORT UART4_IRQHandler [WEAK]
EXPORT UART5_IRQHandler [WEAK]
EXPORT TIM6_DAC_IRQHandler [WEAK]
EXPORT TIM7_IRQHandler [WEAK]
EXPORT DMA2_Stream0_IRQHandler [WEAK]
EXPORT DMA2_Stream1_IRQHandler [WEAK]
EXPORT DMA2_Stream2_IRQHandler [WEAK]
EXPORT DMA2_Stream3_IRQHandler [WEAK]
EXPORT DMA2_Stream4_IRQHandler [WEAK]
EXPORT ETH_IRQHandler [WEAK]
EXPORT ETH_WKUP_IRQHandler [WEAK]
EXPORT CAN2_TX_IRQHandler [WEAK]
EXPORT CAN2_RX0_IRQHandler [WEAK]
EXPORT CAN2_RX1_IRQHandler [WEAK]
EXPORT CAN2_SCE_IRQHandler [WEAK]
EXPORT OTG_FS_IRQHandler [WEAK]
EXPORT DMA2_Stream5_IRQHandler [WEAK]
EXPORT DMA2_Stream6_IRQHandler [WEAK]
EXPORT DMA2_Stream7_IRQHandler [WEAK]
EXPORT USART6_IRQHandler [WEAK]
EXPORT I2C3_EV_IRQHandler [WEAK]
EXPORT I2C3_ER_IRQHandler [WEAK]
EXPORT OTG_HS_EP1_OUT_IRQHandler [WEAK]
EXPORT OTG_HS_EP1_IN_IRQHandler [WEAK]
EXPORT OTG_HS_WKUP_IRQHandler [WEAK]
EXPORT OTG_HS_IRQHandler [WEAK]
EXPORT DCMI_IRQHandler [WEAK]
EXPORT CRYP_IRQHandler [WEAK]
EXPORT HASH_RNG_IRQHandler [WEAK]
EXPORT FPU_IRQHandler [WEAK]
WWDG_IRQHandler
PVD_IRQHandler
TAMP_STAMP_IRQHandler
RTC_WKUP_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Stream0_IRQHandler
DMA1_Stream1_IRQHandler
DMA1_Stream2_IRQHandler
DMA1_Stream3_IRQHandler
DMA1_Stream4_IRQHandler
DMA1_Stream5_IRQHandler
DMA1_Stream6_IRQHandler
ADC_IRQHandler
CAN1_TX_IRQHandler
CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_TIM9_IRQHandler
TIM1_UP_TIM10_IRQHandler
TIM1_TRG_COM_TIM11_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTC_Alarm_IRQHandler
OTG_FS_WKUP_IRQHandler
TIM8_BRK_TIM12_IRQHandler
TIM8_UP_TIM13_IRQHandler
TIM8_TRG_COM_TIM14_IRQHandler
TIM8_CC_IRQHandler
DMA1_Stream7_IRQHandler
FMC_IRQHandler
SDIO_IRQHandler
TIM5_IRQHandler
SPI3_IRQHandler
UART4_IRQHandler
UART5_IRQHandler
TIM6_DAC_IRQHandler
TIM7_IRQHandler
DMA2_Stream0_IRQHandler
DMA2_Stream1_IRQHandler
DMA2_Stream2_IRQHandler
DMA2_Stream3_IRQHandler
DMA2_Stream4_IRQHandler
ETH_IRQHandler
ETH_WKUP_IRQHandler
CAN2_TX_IRQHandler
CAN2_RX0_IRQHandler
CAN2_RX1_IRQHandler
CAN2_SCE_IRQHandler
OTG_FS_IRQHandler
DMA2_Stream5_IRQHandler
DMA2_Stream6_IRQHandler
DMA2_Stream7_IRQHandler
USART6_IRQHandler
I2C3_EV_IRQHandler
I2C3_ER_IRQHandler
OTG_HS_EP1_OUT_IRQHandler
OTG_HS_EP1_IN_IRQHandler
OTG_HS_WKUP_IRQHandler
OTG_HS_IRQHandler
DCMI_IRQHandler
CRYP_IRQHandler
HASH_RNG_IRQHandler
FPU_IRQHandler
B .
ENDP
ALIGN
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END

View File

@ -5,9 +5,10 @@ ADC3.Channel-17\#ChannelRegularConversion=ADC_CHANNEL_6
ADC3.Channel-18\#ChannelRegularConversion=ADC_CHANNEL_7
ADC3.Channel-19\#ChannelRegularConversion=ADC_CHANNEL_8
ADC3.Channel-20\#ChannelRegularConversion=ADC_CHANNEL_10
ADC3.DMAContinuousRequests=ENABLE
ADC3.EOCSelection=ADC_EOC_SEQ_CONV
ADC3.ExternalTrigConv=ADC_EXTERNALTRIGCONV_T8_TRGO
ADC3.IPParameters=Rank-15\#ChannelRegularConversion,Channel-15\#ChannelRegularConversion,SamplingTime-15\#ChannelRegularConversion,NbrOfConversionFlag,NbrOfConversion,ScanConvMode,Rank-16\#ChannelRegularConversion,Channel-16\#ChannelRegularConversion,SamplingTime-16\#ChannelRegularConversion,Rank-17\#ChannelRegularConversion,Channel-17\#ChannelRegularConversion,SamplingTime-17\#ChannelRegularConversion,Rank-18\#ChannelRegularConversion,Channel-18\#ChannelRegularConversion,SamplingTime-18\#ChannelRegularConversion,Rank-19\#ChannelRegularConversion,Channel-19\#ChannelRegularConversion,SamplingTime-19\#ChannelRegularConversion,Rank-20\#ChannelRegularConversion,Channel-20\#ChannelRegularConversion,SamplingTime-20\#ChannelRegularConversion,ExternalTrigConv,EOCSelection
ADC3.IPParameters=Rank-15\#ChannelRegularConversion,Channel-15\#ChannelRegularConversion,SamplingTime-15\#ChannelRegularConversion,NbrOfConversionFlag,NbrOfConversion,ScanConvMode,Rank-16\#ChannelRegularConversion,Channel-16\#ChannelRegularConversion,SamplingTime-16\#ChannelRegularConversion,Rank-17\#ChannelRegularConversion,Channel-17\#ChannelRegularConversion,SamplingTime-17\#ChannelRegularConversion,Rank-18\#ChannelRegularConversion,Channel-18\#ChannelRegularConversion,SamplingTime-18\#ChannelRegularConversion,Rank-19\#ChannelRegularConversion,Channel-19\#ChannelRegularConversion,SamplingTime-19\#ChannelRegularConversion,Rank-20\#ChannelRegularConversion,Channel-20\#ChannelRegularConversion,SamplingTime-20\#ChannelRegularConversion,ExternalTrigConv,EOCSelection,DMAContinuousRequests
ADC3.NbrOfConversion=6
ADC3.NbrOfConversionFlag=1
ADC3.Rank-15\#ChannelRegularConversion=1
@ -38,7 +39,7 @@ Dma.ADC3.0.FIFOMode=DMA_FIFOMODE_DISABLE
Dma.ADC3.0.Instance=DMA2_Stream0
Dma.ADC3.0.MemDataAlignment=DMA_MDATAALIGN_HALFWORD
Dma.ADC3.0.MemInc=DMA_MINC_ENABLE
Dma.ADC3.0.Mode=DMA_NORMAL
Dma.ADC3.0.Mode=DMA_CIRCULAR
Dma.ADC3.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
Dma.ADC3.0.PeriphInc=DMA_PINC_DISABLE
Dma.ADC3.0.Priority=DMA_PRIORITY_LOW