моделирование чет непонятное
This commit is contained in:
@@ -1247,7 +1247,7 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to
|
|||||||
* @arg TIM_IT_BREAK: Break interrupt
|
* @arg TIM_IT_BREAK: Break interrupt
|
||||||
* @retval None
|
* @retval None
|
||||||
*/
|
*/
|
||||||
#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__))
|
#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR &= ~(__INTERRUPT__))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Indicates whether or not the TIM Counter is used as downcounter.
|
* @brief Indicates whether or not the TIM Counter is used as downcounter.
|
||||||
|
|||||||
@@ -1254,7 +1254,7 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to
|
|||||||
* @arg TIM_IT_BREAK: Break interrupt
|
* @arg TIM_IT_BREAK: Break interrupt
|
||||||
* @retval None
|
* @retval None
|
||||||
*/
|
*/
|
||||||
#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__))
|
#define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR &= ~(__INTERRUPT__))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Indicates whether or not the TIM Counter is used as downcounter.
|
* @brief Indicates whether or not the TIM Counter is used as downcounter.
|
||||||
|
|||||||
@@ -13,10 +13,14 @@ void TIM_Call_IRQHandller(TIM_TypeDef* TIMx);
|
|||||||
/* Базовая функция для симуляции таймера: она вызывается каждый шаг симуляции */
|
/* Базовая функция для симуляции таймера: она вызывается каждый шаг симуляции */
|
||||||
void TIM_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
|
void TIM_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
|
||||||
{
|
{
|
||||||
|
if (!(TIMx->CR1 & TIM_CR1_CEN)) // таймер не включен - возврат
|
||||||
|
{
|
||||||
|
TIMS->RepititiveCnt = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Overflow_Check(TIMx, TIMS);
|
Overflow_Check(TIMx, TIMS);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Выбор режима работы таймера
|
// Выбор режима работы таймера
|
||||||
switch (TIMx->SMCR & TIM_SMCR_SMS) // TIMER MODE
|
switch (TIMx->SMCR & TIM_SMCR_SMS) // TIMER MODE
|
||||||
{
|
{
|
||||||
@@ -50,9 +54,9 @@ void TIM_Simulation(TIM_TypeDef *TIMx, struct TIM_Sim *TIMS)
|
|||||||
/* Счет таймера за один такт */
|
/* Счет таймера за один такт */
|
||||||
void TIMx_Count(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
|
void TIMx_Count(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
|
||||||
{
|
{
|
||||||
if ((TIMx->CR1 & TIM_CR1_DIR) && TIMx->CR1) // up COUNTER and COUNTER ENABLE
|
if ((TIMx->CR1 & TIM_CR1_DIR)) // up COUNTER ENABLE
|
||||||
TIMS->tx_cnt -= TIMS->tx_step / (TIMx->PSC + 1);
|
TIMS->tx_cnt -= TIMS->tx_step / (TIMx->PSC + 1);
|
||||||
else if (((TIMx->CR1 & TIM_CR1_DIR) == 0) && TIMx->CR1) // down COUNTER and COUNTER ENABLE
|
else if (((TIMx->CR1 & TIM_CR1_DIR) == 0)) // down COUNTER ENABLE
|
||||||
TIMS->tx_cnt += TIMS->tx_step / (TIMx->PSC + 1);
|
TIMS->tx_cnt += TIMS->tx_step / (TIMx->PSC + 1);
|
||||||
TIMx->CNT = (uint32_t)TIMS->tx_cnt;
|
TIMx->CNT = (uint32_t)TIMS->tx_cnt;
|
||||||
}
|
}
|
||||||
@@ -66,20 +70,40 @@ void Overflow_Check(TIM_TypeDef* TIMx, struct TIM_Sim* TIMS)
|
|||||||
if ((TIMx->CR1 & TIM_CR1_ARPE) == 0) TIMS->RELOAD = TIMx->ARR; // PRELOAD disable - update ARR every itteration
|
if ((TIMx->CR1 & TIM_CR1_ARPE) == 0) TIMS->RELOAD = TIMx->ARR; // PRELOAD disable - update ARR every itteration
|
||||||
if (TIMS->tx_cnt > TIMS->RELOAD || TIMS->tx_cnt < 0) // OVERFLOW
|
if (TIMS->tx_cnt > TIMS->RELOAD || TIMS->tx_cnt < 0) // OVERFLOW
|
||||||
{
|
{
|
||||||
|
TIMS->RELOAD = TIMx->ARR; // RELOAD ARR
|
||||||
|
|
||||||
|
if (TIMS->tx_cnt > TIMx->ARR) // reset COUNTER
|
||||||
|
TIMS->tx_cnt -= TIMS->RELOAD + 1;
|
||||||
|
else if (TIMS->tx_cnt < 0)
|
||||||
|
TIMS->tx_cnt += TIMS->RELOAD + 1;
|
||||||
|
|
||||||
|
if (TIMS->tx_step > TIMS->RELOAD)
|
||||||
|
TIMS->tx_cnt = 0;
|
||||||
|
|
||||||
|
if (!(TIMx->CR1 & TIM_CR1_OPM)) // if no one pulse
|
||||||
|
{
|
||||||
TIMS->Updated = 1;
|
TIMS->Updated = 1;
|
||||||
TIMS->RELOAD = TIMx->ARR; // RELOAD ARR
|
|
||||||
|
|
||||||
if (TIMS->tx_cnt > TIMx->ARR) // reset COUNTER
|
|
||||||
TIMS->tx_cnt -= TIMS->RELOAD+1;
|
|
||||||
else if (TIMS->tx_cnt < 0)
|
|
||||||
TIMS->tx_cnt += TIMS->RELOAD+1;
|
|
||||||
|
|
||||||
if(TIMS->tx_step > TIMS->RELOAD)
|
|
||||||
TIMS->tx_cnt = 0;
|
|
||||||
|
|
||||||
if (TIMx->DIER & TIM_DIER_UIE) {
|
if (TIMx->DIER & TIM_DIER_UIE) {
|
||||||
TIMx->SR |= TIM_SR_UIF;
|
TIMx->SR |= TIM_SR_UIF;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else // if one pulse mode enabled
|
||||||
|
{
|
||||||
|
if (TIMS->RepititiveCnt >= TIMx->RCR)
|
||||||
|
{
|
||||||
|
TIMS->RepititiveCnt = 0;
|
||||||
|
TIMS->Updated = 1;
|
||||||
|
TIMx->CR1 &= ~TIM_CR1_CEN;
|
||||||
|
if (TIMx->DIER & TIM_DIER_UIE) {
|
||||||
|
TIMx->SR |= TIM_SR_UIF;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TIMS->RepititiveCnt++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ struct TIM_Sim
|
|||||||
double tx_cnt; // счетчик таймера
|
double tx_cnt; // счетчик таймера
|
||||||
double tx_step; // шаг счета за один шаг симуляции
|
double tx_step; // шаг счета за один шаг симуляции
|
||||||
long long RELOAD; // буфер, если PRELOAD = 1
|
long long RELOAD; // буфер, если PRELOAD = 1
|
||||||
|
long long RepititiveCnt; // буфер, если PRELOAD = 1
|
||||||
struct Channels_Sim Channels; // структура для симуляции каналов
|
struct Channels_Sim Channels; // структура для симуляции каналов
|
||||||
};
|
};
|
||||||
/////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
|||||||
@@ -217,10 +217,10 @@ void Init_TIM_SIM(void)
|
|||||||
tim8s.Channels.OC1_PIN_SHIFT = 0;
|
tim8s.Channels.OC1_PIN_SHIFT = 0;
|
||||||
tim8s.Channels.OC2_GPIOx = GPIOA;
|
tim8s.Channels.OC2_GPIOx = GPIOA;
|
||||||
tim8s.Channels.OC2_PIN_SHIFT = 0;
|
tim8s.Channels.OC2_PIN_SHIFT = 0;
|
||||||
tim8s.Channels.OC3_GPIOx = GPIOA;
|
tim8s.Channels.OC3_GPIOx = GPIOC;
|
||||||
tim8s.Channels.OC3_PIN_SHIFT = 0;
|
tim8s.Channels.OC3_PIN_SHIFT = 8;
|
||||||
tim8s.Channels.OC4_GPIOx = GPIOA;
|
tim8s.Channels.OC4_GPIOx = GPIOC;
|
||||||
tim8s.Channels.OC4_PIN_SHIFT = 0;
|
tim8s.Channels.OC4_PIN_SHIFT = 9;
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_TIM9
|
#ifdef USE_TIM9
|
||||||
memset(&tim9s, 0, sizeof(tim9s));
|
memset(&tim9s, 0, sizeof(tim9s));
|
||||||
|
|||||||
@@ -18,14 +18,15 @@ void app_init(void) {
|
|||||||
// если не используется отдельный поток для main().
|
// если не используется отдельный поток для main().
|
||||||
HAL_Init();
|
HAL_Init();
|
||||||
MX_DMA_Init();
|
MX_DMA_Init();
|
||||||
|
MX_IWDG_Init();
|
||||||
MX_TIM1_Init();
|
MX_TIM1_Init();
|
||||||
MX_TIM2_Init();
|
MX_TIM2_Init();
|
||||||
MX_TIM3_Init();
|
MX_TIM3_Init();
|
||||||
MX_TIM8_Init();
|
MX_TIM8_Init();
|
||||||
MX_TIM5_Init();
|
MX_TIM5_Init();
|
||||||
MX_ADC3_Init();
|
MX_ADC3_Init();
|
||||||
UPP_SetDefault(1, 1);
|
UPP_Params_SetDefault(1, 1);
|
||||||
UPP_Init();
|
UPP_App_Init();
|
||||||
UPP_PreWhile();
|
UPP_PreWhile();
|
||||||
UPP_DO.CEN(DISABLE);
|
UPP_DO.CEN(DISABLE);
|
||||||
|
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ void Write_AngleControl(real_T* Buffer, int ind_port)
|
|||||||
int nn = 0;
|
int nn = 0;
|
||||||
|
|
||||||
WriteOutputArray(upp.hangle.Iref, ind_port, nn++);
|
WriteOutputArray(upp.hangle.Iref, ind_port, nn++);
|
||||||
WriteOutputArray(upp.pm.measured.final.Iamp, ind_port, nn++);
|
WriteOutputArray(upp.hangle.Imeas, ind_port, nn++);
|
||||||
WriteOutputArray(upp.hangle.alpha, ind_port, nn++);
|
WriteOutputArray(upp.hangle.alpha, ind_port, nn++);
|
||||||
|
|
||||||
|
|
||||||
@@ -125,8 +125,8 @@ void app_readInputs(const real_T* Buffer) {
|
|||||||
MB_INTERNAL.param.angle.PID_Kd = ReadInputArray(1, 6) * 10000;
|
MB_INTERNAL.param.angle.PID_Kd = ReadInputArray(1, 6) * 10000;
|
||||||
MB_INTERNAL.param.angle.PID_ExpAlpha = ReadInputArray(1, 7) * 65535;
|
MB_INTERNAL.param.angle.PID_ExpAlpha = ReadInputArray(1, 7) * 65535;
|
||||||
|
|
||||||
MB_INTERNAL.param.nominal.U = ReadInputArray(1, 8) * 10000;
|
MB_INTERNAL.param.nominal.U = ReadInputArray(1, 8) * 10;
|
||||||
MB_INTERNAL.param.nominal.I = ReadInputArray(1, 9) * 65535;
|
MB_INTERNAL.param.nominal.I = ReadInputArray(1, 9) * 10;
|
||||||
// USER APP INPUT END
|
// USER APP INPUT END
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,13 @@
|
|||||||
void app_step(void)
|
void app_step(void)
|
||||||
{
|
{
|
||||||
// USER APP STEP START
|
// USER APP STEP START
|
||||||
|
static int first_step = 0;
|
||||||
|
if(first_step == 0)
|
||||||
|
{
|
||||||
|
first_step = 1;
|
||||||
|
UPP_DO.CEN(ENABLE);
|
||||||
|
}
|
||||||
|
|
||||||
UPP_While();
|
UPP_While();
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ clear all
|
|||||||
|
|
||||||
Ts = 5e-6;
|
Ts = 5e-6;
|
||||||
Vnom = 400;
|
Vnom = 400;
|
||||||
|
Inom = 30;
|
||||||
Fnom = 50;
|
Fnom = 50;
|
||||||
|
|
||||||
Temperature1 = 2.22; % 20 градусов
|
Temperature1 = 2.22; % 20 градусов
|
||||||
|
|||||||
Binary file not shown.
BIN
MATLAB/upp_r2023.slx.original
Normal file
BIN
MATLAB/upp_r2023.slx.original
Normal file
Binary file not shown.
@@ -30,7 +30,7 @@
|
|||||||
#define TEMP_1 0
|
#define TEMP_1 0
|
||||||
#define TEMP_2 1
|
#define TEMP_2 1
|
||||||
|
|
||||||
#define UPP_SIMULATE_I ///< Симулировт токи а не брать с АЦП
|
//#define UPP_SIMULATE_I ///< Симулировт токи (Iref/2) а не брать с АЦП
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @addtogroup UPP_PARAMS_DEFAULT Default params for external flash
|
* @addtogroup UPP_PARAMS_DEFAULT Default params for external flash
|
||||||
@@ -144,6 +144,16 @@
|
|||||||
#define ANGLE_TIM2_FREQ_MHZ 84 ///< Частота тиков таймера отсчета угла открытия тиристоров
|
#define ANGLE_TIM2_FREQ_MHZ 84 ///< Частота тиков таймера отсчета угла открытия тиристоров
|
||||||
|
|
||||||
#define HAL_PWREx_EnableOverDrive() HAL_ERROR
|
#define HAL_PWREx_EnableOverDrive() HAL_ERROR
|
||||||
|
#endif
|
||||||
|
// ===== ОТЛАДОЧНЫЕ ШТУКИ ДЛЯ MATLAB ======
|
||||||
|
|
||||||
|
#if defined(MATLAB)
|
||||||
|
#undef UPP_INIT_BEFORE_READY_MS
|
||||||
|
|
||||||
|
|
||||||
|
#define UPP_INIT_BEFORE_READY_MS 100 ///< Сколько сканировать сеть, перед выставлением состояния готовности
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
/** //UPP_COMPILED_PARAMS
|
/** //UPP_COMPILED_PARAMS
|
||||||
* @}
|
* @}
|
||||||
|
|||||||
@@ -81,9 +81,9 @@ void Angle_PID(Angle_Handle_t *hangle, float setpoint, float measurement)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
hangle->Iref = Filter_Process(&hangle->refFilter, setpoint);
|
hangle->Iref = Filter_Process(&hangle->refFilter, setpoint);
|
||||||
|
hangle->Imeas = measurement;
|
||||||
/* Ошибка регулирования = уставка - измеренное */
|
/* Ошибка регулирования = уставка - измеренное */
|
||||||
float err = hangle->Iref - measurement;
|
float err = hangle->Iref - hangle->Imeas;
|
||||||
|
|
||||||
/* ПИД регулирование */
|
/* ПИД регулирование */
|
||||||
float open_control = arm_pid_f32(&hangle->pid, err); // 0 - открыть максимально поздно, 1 - открыть макситмально рано
|
float open_control = arm_pid_f32(&hangle->pid, err); // 0 - открыть максимально поздно, 1 - открыть макситмально рано
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ typedef struct
|
|||||||
Angle_Config_t Config; ///< Конфигурации алгоритма расчета угла открытия тиристоров
|
Angle_Config_t Config; ///< Конфигурации алгоритма расчета угла открытия тиристоров
|
||||||
|
|
||||||
float Iref; ///< текущее задание тока в о.е. [0..1]
|
float Iref; ///< текущее задание тока в о.е. [0..1]
|
||||||
|
float Imeas; ///< измеренное значение тока в о.е. [0..1]
|
||||||
float alpha; ///< текущий угол открытия в о.е. [0..1] (% от периода)
|
float alpha; ///< текущий угол открытия в о.е. [0..1] (% от периода)
|
||||||
|
|
||||||
arm_pid_instance_f32 pid; ///< ПИД регулятор для управления углом
|
arm_pid_instance_f32 pid; ///< ПИД регулятор для управления углом
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ int UPP_App_Init(void)
|
|||||||
upp.PUI.values = &MB_DATA.InRegs.pui;
|
upp.PUI.values = &MB_DATA.InRegs.pui;
|
||||||
upp.call = &MB_INTERNAL.FuncCalls;
|
upp.call = &MB_INTERNAL.FuncCalls;
|
||||||
|
|
||||||
|
UPP_DO.CEN(ENABLE);
|
||||||
|
|
||||||
if(HAL_TIM_Base_Start(&ustim) != HAL_OK)
|
if(HAL_TIM_Base_Start(&ustim) != HAL_OK)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
@@ -46,6 +48,7 @@ int UPP_App_Init(void)
|
|||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,7 +85,6 @@ int UPP_While(void)
|
|||||||
HAL_IWDG_Refresh(&hiwdg);
|
HAL_IWDG_Refresh(&hiwdg);
|
||||||
BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY);
|
BenchTime_Start(BT_SLOWCALC, angletim.Instance->CNT, HAL_MAX_DELAY);
|
||||||
|
|
||||||
UPP_DO.CEN(ENABLE);
|
|
||||||
// если ошибка вызываем СТОП
|
// если ошибка вызываем СТОП
|
||||||
if(errors.pui.all)
|
if(errors.pui.all)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ void UPP_Params_ControlInternal(void)
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Контроль внутренних параметров УПП.
|
* @brief Контроль параметров УПП на корректные значения.
|
||||||
* @return HAL Status.
|
* @return HAL Status.
|
||||||
*/
|
*/
|
||||||
void UPP_Params_Saturate(void)
|
void UPP_Params_Saturate(void)
|
||||||
|
|||||||
@@ -358,6 +358,22 @@
|
|||||||
<ExecCommand></ExecCommand>
|
<ExecCommand></ExecCommand>
|
||||||
<Expression></Expression>
|
<Expression></Expression>
|
||||||
</Bp>
|
</Bp>
|
||||||
|
<Bp>
|
||||||
|
<Number>2</Number>
|
||||||
|
<Type>0</Type>
|
||||||
|
<LineNumber>136</LineNumber>
|
||||||
|
<EnabledFlag>1</EnabledFlag>
|
||||||
|
<Address>0</Address>
|
||||||
|
<ByteObject>0</ByteObject>
|
||||||
|
<HtxType>0</HtxType>
|
||||||
|
<ManyObjects>0</ManyObjects>
|
||||||
|
<SizeOfObject>0</SizeOfObject>
|
||||||
|
<BreakByAccess>0</BreakByAccess>
|
||||||
|
<BreakIfRCount>0</BreakIfRCount>
|
||||||
|
<Filename>../Core/Src/stm32f4xx_it.c</Filename>
|
||||||
|
<ExecCommand></ExecCommand>
|
||||||
|
<Expression></Expression>
|
||||||
|
</Bp>
|
||||||
</Breakpoint>
|
</Breakpoint>
|
||||||
<WatchWindow1>
|
<WatchWindow1>
|
||||||
<Ww>
|
<Ww>
|
||||||
@@ -1193,7 +1209,7 @@
|
|||||||
|
|
||||||
<Group>
|
<Group>
|
||||||
<GroupName>MyLibs</GroupName>
|
<GroupName>MyLibs</GroupName>
|
||||||
<tvExp>1</tvExp>
|
<tvExp>0</tvExp>
|
||||||
<tvExpOptDlg>0</tvExpOptDlg>
|
<tvExpOptDlg>0</tvExpOptDlg>
|
||||||
<cbSel>0</cbSel>
|
<cbSel>0</cbSel>
|
||||||
<RteFlg>0</RteFlg>
|
<RteFlg>0</RteFlg>
|
||||||
|
|||||||
@@ -17,8 +17,8 @@
|
|||||||
<TargetCommonOption>
|
<TargetCommonOption>
|
||||||
<Device>STM32F427ZGTx</Device>
|
<Device>STM32F427ZGTx</Device>
|
||||||
<Vendor>STMicroelectronics</Vendor>
|
<Vendor>STMicroelectronics</Vendor>
|
||||||
<PackID>Keil.STM32F4xx_DFP.2.17.1</PackID>
|
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID>
|
||||||
<PackURL>https://www.keil.com/pack/</PackURL>
|
<PackURL>http://www.keil.com/pack/</PackURL>
|
||||||
<Cpu>IRAM(0x20000000-0x2002FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4") TZ</Cpu>
|
<Cpu>IRAM(0x20000000-0x2002FFFF) IRAM2(0x10000000-0x1000FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(25000000) FPU2 CPUTYPE("Cortex-M4") TZ</Cpu>
|
||||||
<FlashUtilSpec></FlashUtilSpec>
|
<FlashUtilSpec></FlashUtilSpec>
|
||||||
<StartupFile></StartupFile>
|
<StartupFile></StartupFile>
|
||||||
@@ -1004,8 +1004,8 @@
|
|||||||
<TargetCommonOption>
|
<TargetCommonOption>
|
||||||
<Device>STM32F417ZGTx</Device>
|
<Device>STM32F417ZGTx</Device>
|
||||||
<Vendor>STMicroelectronics</Vendor>
|
<Vendor>STMicroelectronics</Vendor>
|
||||||
<PackID>Keil.STM32F4xx_DFP.2.17.1</PackID>
|
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID>
|
||||||
<PackURL>https://www.keil.com/pack/</PackURL>
|
<PackURL>http://www.keil.com/pack/</PackURL>
|
||||||
<Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
|
<Cpu>IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00010000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
|
||||||
<FlashUtilSpec></FlashUtilSpec>
|
<FlashUtilSpec></FlashUtilSpec>
|
||||||
<StartupFile></StartupFile>
|
<StartupFile></StartupFile>
|
||||||
|
|||||||
Reference in New Issue
Block a user