Добавлена загрузка ячеек ЭМС при запуске и работе.
This commit is contained in:
@@ -81,6 +81,12 @@ void Error_Handler(void);
|
||||
#define ISA_BASE_RD 0x60000000U
|
||||
#define ISA_BASE_WR 0x60400000U
|
||||
#define FLASH_BASE_WR 0x08060000U
|
||||
#define FLASH_BASE_EMS_G 0U
|
||||
#define FLASH_BASE_KEMS_B 0U
|
||||
#define FLASH_BASE_EMS_B0 1200U
|
||||
#define FLASH_BASE_EMS_B1 2400U
|
||||
|
||||
#define WORDS_TO_KEMS 60U
|
||||
/* USER CODE END Private defines */
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -80,7 +80,13 @@ enum
|
||||
|
||||
ERR_UNKNOW_COMMAND = 255
|
||||
};
|
||||
enum
|
||||
{
|
||||
PRIBOR_TYPE_PRD = 0,
|
||||
PRIBOR_TYPE_UF,
|
||||
PRIBOR_TYPE_DEFAULT,
|
||||
|
||||
};
|
||||
#endif /* INC_PRIBORS_H_ */
|
||||
|
||||
|
||||
|
||||
@@ -49,14 +49,23 @@ TIM_HandleTypeDef htim3;
|
||||
SRAM_HandleTypeDef hsram1;
|
||||
|
||||
/* USER CODE BEGIN PV */
|
||||
// Счётчики которые висят на таймере
|
||||
uint32_t br_counter = 0;
|
||||
uint32_t rx_counter = 0;
|
||||
uint32_t pribor;
|
||||
ip_addr_t rx_addr;
|
||||
uint32_t flash_counter = 0;
|
||||
uint32_t pribor; // Прибор в котором стоит ячейка
|
||||
uint32_t pribor_type; // Тип прибора в котором стоит ячейка
|
||||
ip_addr_t rx_addr; // Адрес с которого принят пакет.
|
||||
// Флаги загрузки ячеек ЭМС/КЭМС
|
||||
_Bool flag_load_ems_g = 0;
|
||||
_Bool flag_load_ems_b0 = 0;
|
||||
_Bool flag_load_ems_b1 = 0;
|
||||
_Bool flag_load_kems_b = 0;
|
||||
// Структуры принятого и отправленного сообщения
|
||||
struct rcv_msg rx_msg;
|
||||
struct tsm_msg tx_msg;
|
||||
|
||||
_Bool need_send_private = 0;
|
||||
_Bool need_send_private = 0; // Флаг, что нужно отправить персональный ответ.
|
||||
/* USER CODE END PV */
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
@@ -73,6 +82,7 @@ void udp_echo_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p,
|
||||
void rcv_command(void);
|
||||
uint16_t create_header(void);
|
||||
void set_pbuf_params(struct pbuf *p, u16_t length);
|
||||
_Bool load_flash_to_ems(uint32_t base_addr, uint16_t base_port);
|
||||
/* USER CODE END PFP */
|
||||
|
||||
/* Private user code ---------------------------------------------------------*/
|
||||
@@ -140,7 +150,7 @@ int main(void)
|
||||
err_t errok = udp_sendto(pcb, p, &rx_addr, rx_msg.port);
|
||||
br_counter = 0;
|
||||
}
|
||||
if (br_counter > 99)
|
||||
if (br_counter > 99) // Широковещательный всётчик для отправки пакетов 100мс.
|
||||
{
|
||||
create_header();
|
||||
set_pbuf_params(p, create_header() + tx_msg.cmd_len);
|
||||
@@ -149,15 +159,36 @@ int main(void)
|
||||
}
|
||||
|
||||
|
||||
if (rx_msg.con_timeout > 1999)
|
||||
if (rx_msg.con_timeout > 1999) // Таймаут соединения 2с
|
||||
{
|
||||
rx_msg.clnt_con = 0;
|
||||
}
|
||||
|
||||
if (rx_counter > 30)
|
||||
if (rx_counter > 30) // Мигание светодиода на 30мс при приёме команды
|
||||
{
|
||||
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET);
|
||||
}
|
||||
|
||||
if (flash_counter > 100) // Таймер проверки загрежен ли флеш
|
||||
{
|
||||
flash_counter = 0;
|
||||
switch(pribor_type)
|
||||
{
|
||||
case PRIBOR_TYPE_PRD:
|
||||
{
|
||||
if (flag_load_ems_g == 0) flag_load_ems_g = load_flash_to_ems(FLASH_BASE_WR, BASE_ADDR_EMS_G);
|
||||
break;
|
||||
}
|
||||
case PRIBOR_TYPE_UF:
|
||||
{
|
||||
if (flag_load_ems_b0 == 0) flag_load_ems_b0 = load_flash_to_ems(FLASH_BASE_WR, BASE_ADDR_KEMS_B);
|
||||
if (flag_load_ems_b1 == 0) flag_load_ems_b1 = load_flash_to_ems(FLASH_BASE_WR + FLASH_BASE_EMS_B0, BASE_ADDR_EMS_B0);
|
||||
if (flag_load_kems_b == 0) flag_load_kems_b = load_flash_to_ems(FLASH_BASE_WR + FLASH_BASE_EMS_B1, BASE_ADDR_EMS_B1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
/* USER CODE END WHILE */
|
||||
}
|
||||
@@ -711,6 +742,31 @@ void write_isa(uint16_t addr, uint16_t data)
|
||||
*(uint16_t*)(ISA_BASE_WR + (addr << 1)) = data;
|
||||
}
|
||||
|
||||
_Bool load_flash_to_ems(uint32_t base_addr, uint16_t base_port)
|
||||
{
|
||||
_Bool load_ok = 0;
|
||||
uint16_t ports_data, i;
|
||||
uint32_t flash_data;
|
||||
write_isa( base_port + 0x2, 200);
|
||||
ports_data = read_isa(base_port + 0x2);
|
||||
if (ports_data != 200) return load_ok;
|
||||
for (i = 0; i<=WORDS_TO_KEMS; i++)
|
||||
{
|
||||
Flash_Read_Data(base_addr + i * 10, (uint32_t *)&flash_data, 1);
|
||||
write_isa(base_port + 0x2, flash_data);
|
||||
Flash_Read_Data(base_addr + i * 10 + 2, (uint32_t *)&flash_data, 1);
|
||||
write_isa(base_port + 0x4, flash_data);
|
||||
Flash_Read_Data(base_addr + i * 10 + 4, (uint32_t *)&flash_data, 1);
|
||||
write_isa(base_port + 0x6, flash_data);
|
||||
Flash_Read_Data(base_addr + i * 10 + 6, (uint32_t *)&flash_data, 1);
|
||||
write_isa(base_port + 0x8, flash_data);
|
||||
Flash_Read_Data(base_addr + i * 10 + 8, (uint32_t *)&flash_data, 1);
|
||||
write_isa(base_port + 0xa, flash_data);
|
||||
}
|
||||
load_ok = 1;
|
||||
return load_ok;
|
||||
|
||||
}
|
||||
|
||||
/* USER CODE END 4 */
|
||||
|
||||
|
||||
@@ -7,10 +7,11 @@
|
||||
#include "pribors.h"
|
||||
#include "lwip/ip_addr.h"
|
||||
|
||||
_Bool flag_load_ems_g = 0;
|
||||
_Bool flag_load_ems_b0 = 0;
|
||||
_Bool flag_load_ems_b1 = 0;
|
||||
_Bool flag_load_kems_b = 0;
|
||||
extern _Bool flag_load_ems_g;
|
||||
extern _Bool flag_load_ems_b0;
|
||||
extern _Bool flag_load_ems_b1;
|
||||
extern _Bool flag_load_kems_b;
|
||||
extern uint32_t pribor_type; // Тип прибора, где стоит ячейка, нужен для выбора загрузки flash
|
||||
uint32_t get_ip(void)
|
||||
{
|
||||
uint32_t pribor = (((GPIOC->IDR) >> 6) & 0x7) | (((GPIOC->IDR) >> 9) & 0x18);
|
||||
@@ -80,6 +81,7 @@ uint16_t set_status(unsigned char *buf, uint32_t pribor)
|
||||
buf[8] = 1;
|
||||
buf[9] = 2;
|
||||
status_len = 4;
|
||||
pribor_type = PRIBOR_TYPE_DEFAULT;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,6 +120,9 @@ uint16_t set_status_prd(unsigned char *buf)
|
||||
ports_data = read_isa( BASE_ADDR_UG + 0xE );
|
||||
buf[33] = ports_data & 0xFF;
|
||||
buf[34] = ports_data >> 8;
|
||||
|
||||
pribor_type = PRIBOR_TYPE_PRD;
|
||||
|
||||
return 29;
|
||||
}
|
||||
|
||||
@@ -163,6 +168,9 @@ uint16_t set_status_uf(unsigned char *buf)
|
||||
buf[9+(i-1)*2 + 44] = ports_data & 0xFF;
|
||||
buf[10+(i-1)*2 + 44] = ports_data >> 8;
|
||||
}
|
||||
|
||||
pribor_type = PRIBOR_TYPE_UF;
|
||||
|
||||
return 69;
|
||||
}
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
/* USER CODE BEGIN PV */
|
||||
extern uint32_t br_counter;
|
||||
extern uint32_t rx_counter;
|
||||
extern uint32_t flash_counter;
|
||||
/* USER CODE END PV */
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
@@ -213,6 +214,7 @@ void TIM3_IRQHandler(void)
|
||||
br_counter++;
|
||||
rx_msg.con_timeout++;
|
||||
rx_counter++;
|
||||
flash_counter++;
|
||||
|
||||
/* USER CODE END TIM3_IRQn 1 */
|
||||
}
|
||||
|
||||
77161
Debug/yau-07b.list
77161
Debug/yau-07b.list
File diff suppressed because it is too large
Load Diff
35040
Release/yau-07b.list
35040
Release/yau-07b.list
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user