Добавлена загрузка ячеек ЭМС при запуске и работе.

This commit is contained in:
MaD_CaT
2024-09-23 16:07:01 +03:00
parent 69f4ff7991
commit 342db1aecd
7 changed files with 57001 additions and 55298 deletions

View File

@@ -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

View File

@@ -80,7 +80,13 @@ enum
ERR_UNKNOW_COMMAND = 255
};
enum
{
PRIBOR_TYPE_PRD = 0,
PRIBOR_TYPE_UF,
PRIBOR_TYPE_DEFAULT,
};
#endif /* INC_PRIBORS_H_ */

View File

@@ -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 */

View File

@@ -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;
}

View File

@@ -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 */
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff