Algoritm for save flash(while non-work)

This commit is contained in:
lulko 2025-03-12 22:24:39 +03:00
parent 5dbd56f200
commit b5ff05bed6
4 changed files with 52 additions and 30 deletions

View file

@ -7,14 +7,20 @@
/* for addr in FLASH */ /* for addr in FLASH */
typedef struct{ typedef struct{
uint8_t data_id; uint8_t data_id; // data_id = id register of can
uint8_t value; uint8_t value;
uint16_t crc; uint16_t crc;
}FLASH_RECORD; }FLASH_RECORD;
enum {
addr_id = 0,
foc_id = 1,
kp_id = 2,
ki_id = 3,
kd_id = 4
};
static uint32_t write_ptr;
#define FLASH_RECORD_SIZE sizeof(FLASH_RECORD) //size flash struct #define FLASH_RECORD_SIZE sizeof(FLASH_RECORD) //size flash struct
#define PARAM_COUNT 4 // count data in flash #define PARAM_COUNT 3 // count data in flash
// Flash sectors for STM32F407 // Flash sectors for STM32F407
@ -32,7 +38,8 @@ static uint32_t write_ptr;
//FLASH SET ONE PROGRAMM WORD //FLASH SET ONE PROGRAMM WORD
#define FLASH_8BYTE FLASH->CR &= ~FLASH_CR_PSIZE & ~FLASH_CR_PSIZE_1 #define FLASH_8BYTE FLASH->CR &= ~FLASH_CR_PSIZE & ~FLASH_CR_PSIZE_1
#define FLASH_32BYTE FLASH->CR |= FLASH_CR_PSIZE | FLASH_CR_PSIZE_0 #define FLASH_32BYTE \
FLASH->CR = (FLASH->CR & ~FLASH_CR_PSIZE) | (0x2 << FLASH_CR_PSIZE_Pos)
// Flash command bits // Flash command bits
#define FLASH_LOCK FLASH->CR |= FLASH_CR_LOCK #define FLASH_LOCK FLASH->CR |= FLASH_CR_LOCK
@ -52,7 +59,11 @@ void flash_lock(void);
void erase_sector(uint8_t sector); void erase_sector(uint8_t sector);
void program_word(uint32_t address, uint32_t data,uint32_t byte_len); void program_word(uint32_t address, uint32_t data,uint32_t byte_len);
uint8_t flash_read_word(uint32_t address); uint8_t flash_read_word(uint32_t address);
void write_param(uint8_t param_id, uint8_t val);
FLASH_RECORD* load_params();
void compact_page();
void flash_read(uint32_t addr,FLASH_RECORD* ptr);
bool validate_crc(FLASH_RECORD* crc);
void flash_write(uint32_t addr, FLASH_RECORD* record);
#endif /* FLASH_H_ */ #endif /* FLASH_H_ */

View file

@ -2,7 +2,7 @@
#define REG_CAH_H_ #define REG_CAH_H_
#define APP_ADDR 0x0800400 // 16KB - Application #define APP_ADDR 0x0800400 // 16KB - Application
#define ADDR_VAR 0x8050000 #define ADDR_VAR 0x8040000
#define ADDR_VAR_ID ADDR_VAR #define ADDR_VAR_ID ADDR_VAR
#define ADDR_VAR_P (ADDR_VAR + 1) #define ADDR_VAR_P (ADDR_VAR + 1)
#define ADDR_VAR_I (ADDR_VAR + 2) #define ADDR_VAR_I (ADDR_VAR + 2)

View file

@ -1,7 +1,8 @@
#include "flash.h" #include "flash.h"
#include <stdbool.h> #include <stdbool.h>
#include "hal_conf_extra.h"
static uint32_t write_ptr = SECTOR_6;
void flash_unlock(){ void flash_unlock(){
@ -93,7 +94,7 @@ void flash_write(uint32_t addr, FLASH_RECORD* record){
FLASH->CR |= FLASH_CR_PG; FLASH->CR |= FLASH_CR_PG;
for(int i = 0;i < size;i++){ for(int i = 0;i < size;i++){
*(volatile uint32_t*)(addr + i * 4) = data[i]; *(volatile uint32_t*)addr = data[i];
} }
// Clear program bit // Clear program bit
@ -130,7 +131,7 @@ void flash_read(uint32_t addr,FLASH_RECORD* ptr){
void compact_page(){ void compact_page(){
FLASH_RECORD latest[PARAM_COUNT] = {0}; FLASH_RECORD latest[PARAM_COUNT] = {0};
for(int i = (uint32_t)SECTOR_6;i < (uint32_t)SECTOR_7,i += FLASH_RECORD_SIZE;) { for(int i = (uint32_t)SECTOR_6;i < (uint32_t)SECTOR_7;i += FLASH_RECORD_SIZE) {
FLASH_RECORD rec; FLASH_RECORD rec;
flash_read(i,&rec); flash_read(i,&rec);
@ -152,15 +153,31 @@ void compact_page(){
void write_param(uint8_t param_id, uint8_t val){ void write_param(uint8_t param_id, uint8_t val){
FLASH_RECORD param_flash = { FLASH_RECORD param_flash = {param_id,val,6933};
.data_id = param_id,
.value = val,
.crc = 6933
};
/* Exit data from FLASH */ /* Exit data from FLASH */
if (write_ptr + FLASH_RECORD_SIZE >= SECTOR_7) if (write_ptr + FLASH_RECORD_SIZE >= SECTOR_7)
compact_page(); compact_page();
flash_write((uint32_t)write_ptr,&param_flash); // Проверка выравнивания адреса
if (write_ptr % 4 != 0)
write_ptr += (4 - (write_ptr % 4)); // Выравнивание до 4 байт
__disable_irq();
flash_write(write_ptr,&param_flash);
write_ptr += FLASH_RECORD_SIZE; write_ptr += FLASH_RECORD_SIZE;
flash_program_word(SECTOR_7 - sizeof(uint32_t),write_ptr,0);
}
FLASH_RECORD* load_params(){
__disable_irq();
static FLASH_RECORD latest[PARAM_COUNT] = {0};
FLASH_RECORD res;
for(uint32_t addr = SECTOR_6;addr < SECTOR_7;addr +=FLASH_RECORD_SIZE) {
flash_read(addr,&res);
if (validate_crc(&res))
latest[res.data_id] = res;
}
__enable_irq();
return latest;
} }

View file

@ -29,7 +29,8 @@ uint32_t SectorError;
static FLASH_RECORD flash_rec; static FLASH_RECORD* flash_rec;
static FLASH_RECORD flash_buf[PARAM_COUNT];
static CAN_message_t CAN_TX_msg; static CAN_message_t CAN_TX_msg;
static CAN_message_t CAN_inMsg; static CAN_message_t CAN_inMsg;
@ -149,18 +150,8 @@ void send_id() {
} }
void setup_id(uint8_t my_id) { void setup_id(uint8_t my_id) {
/* Чтобы разблокировать флэш память для записи*/ write_param(addr_id,my_id);
flash_unlock(); send_id();
while (FLASH_BUSY) { }
erase_sector(6); //очистка 6 сектора
while ((FLASH->SR & FLASH_SR_BSY) != 0)
__NOP();
FLASH->SR |= (FLASH_SR_EOP | FLASH_SR_WRPERR | FLASH_SR_PGAERR);
FLASH->CR |= FLASH_CR_PG;
*(volatile uint8_t*)ADDR_VAR_ID = my_id;
FLASH->CR |= FLASH_CR_LOCK;
} }
@ -204,8 +195,11 @@ void send_data() {
void listen_can() { void listen_can() {
flash_rec = load_params();
for(int i = 0;i < PARAM_COUNT;i++)
flash_buf[i] = flash_rec[i];
uint8_t reg_id = CAN_inMsg.buf[0]; //reg id uint8_t reg_id = CAN_inMsg.buf[0]; //reg id
if (CAN_inMsg.id == *(volatile uint8_t*)ADDR_VAR_ID) { if (CAN_inMsg.id == flash_buf[addr_id].value) {
if (CAN_inMsg.buf[1] == REG_WRITE) { if (CAN_inMsg.buf[1] == REG_WRITE) {
switch (reg_id) { switch (reg_id) {
case REG_ID: case REG_ID: