2025-05-22 18:12:54 +03:00
|
|
|
#ifndef FLASH_H_
|
|
|
|
#define FLASH_H_
|
|
|
|
#include "stm32f446xx.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
|
|
|
|
/* no padding for this struct, beacuse storing 8 bytes*/
|
|
|
|
typedef struct{
|
|
|
|
uint8_t data_id; // data_id = id register of can
|
|
|
|
uint8_t data_type;
|
|
|
|
uint16_t crc;
|
|
|
|
uint32_t value;
|
|
|
|
// uint32_t write_ptr_now;
|
|
|
|
}FLASH_RECORD;
|
|
|
|
enum {
|
|
|
|
addr_id = 0,
|
|
|
|
pid_p = 1,
|
|
|
|
pid_i,
|
|
|
|
pid_d,
|
2025-05-23 09:12:06 +03:00
|
|
|
firmw,
|
2025-05-22 18:12:54 +03:00
|
|
|
foc_id,
|
|
|
|
angl,
|
|
|
|
vel
|
|
|
|
};
|
|
|
|
|
2025-05-23 09:12:06 +03:00
|
|
|
|
2025-05-22 18:12:54 +03:00
|
|
|
/* for saved in FLASH float data*/
|
|
|
|
union{
|
|
|
|
uint32_t i;
|
|
|
|
float f;
|
|
|
|
}conv_float_to_int;
|
|
|
|
|
|
|
|
#define FLASH_RECORD_SIZE sizeof(FLASH_RECORD) //size flash struct
|
|
|
|
|
|
|
|
// Flash sectors for STM32F407
|
|
|
|
#define APP_ADDRESS 0x08008000 // Адрес основной прошивки
|
2025-05-23 09:12:06 +03:00
|
|
|
// #define FLAG_BOOT 0x08060000 // Адрес хранения флага для обновления прошивки
|
2025-05-22 18:12:54 +03:00
|
|
|
#define UPDATE_FLAG 0xDEADBEEF // Уникальное 32-битное значение
|
|
|
|
#define BOOT_CAN_ID 0x01 // CAN ID бутлоадера
|
|
|
|
#define BOOT_CAN_END 0x02 // CAN ID завершения передачи
|
|
|
|
#define DATA_CAN_ID 0x03 // CAN ID данных
|
|
|
|
#define ACK_CAN_ID 0x05 // CAN ID подтверждения
|
|
|
|
#define MAX_FW_SIZE 0x3FFF // Макс. размер прошивки (256KB)
|
2025-05-23 09:12:06 +03:00
|
|
|
#define PARAM_COUNT 5 // count data in flash
|
2025-05-22 18:12:54 +03:00
|
|
|
#define SECTOR_6 0x08040000 // 128KB
|
|
|
|
#define SECTOR_6_END (SECTOR_6 + 128 * 1024) // sector 6 end
|
|
|
|
// Flash keys for unlocking flash memory
|
|
|
|
#define BYTE32 0
|
|
|
|
#define BYTE8 1
|
|
|
|
//FLASH SET ONE PROGRAMM WORD
|
|
|
|
#define FLASH_8BYTE FLASH->CR &= ~FLASH_CR_PSIZE & ~FLASH_CR_PSIZE_1
|
|
|
|
#define FLASH_32BYTE \
|
|
|
|
FLASH->CR = (FLASH->CR & ~FLASH_CR_PSIZE) | (0x2 << FLASH_CR_PSIZE_Pos)
|
|
|
|
|
|
|
|
// Flash command bits
|
|
|
|
#define FLASH_LOCK FLASH->CR |= FLASH_CR_LOCK
|
|
|
|
#define FLASH_UNLOCK FLASH->KEYR = FLASH_KEY1; FLASH->KEYR = FLASH_KEY2
|
|
|
|
|
|
|
|
|
|
|
|
// Flash status flags
|
|
|
|
#define FLASH_BUSY (FLASH->SR & FLASH_SR_BSY)
|
|
|
|
#define FLASH_ERROR (FLASH->SR & (FLASH_SR_WRPERR | FLASH_SR_PGAERR | FLASH_SR_PGPERR | FLASH_SR_PGSERR))
|
|
|
|
|
|
|
|
//for bootloader
|
|
|
|
typedef void(*pFunction)(void);
|
|
|
|
|
|
|
|
|
|
|
|
/* for start addr in FLASH */
|
|
|
|
static uint32_t write_ptr = SECTOR_6;
|
|
|
|
static uint32_t ptr_fl = APP_ADDRESS;
|
|
|
|
// Function prototypes
|
|
|
|
void flash_unlock(void);
|
|
|
|
void flash_lock(void);
|
|
|
|
void erase_sector(uint8_t sector);
|
|
|
|
void flash_program_word(uint32_t address, uint32_t data,uint32_t byte_len);
|
|
|
|
uint8_t flash_read_word(uint32_t address);
|
|
|
|
FLASH_RECORD* load_params();
|
|
|
|
void compact_page();
|
|
|
|
void flash_read(uint32_t addr,FLASH_RECORD* ptr);
|
|
|
|
uint16_t validate_crc16(uint8_t *data,uint32_t length);
|
|
|
|
void flash_write(uint32_t addr, FLASH_RECORD* record);
|
|
|
|
void write_flash_page(const uint8_t* data, uint16_t len);
|
|
|
|
void erase_flash_pages();
|
|
|
|
void write_param(uint8_t param_id,uint32_t val);
|
|
|
|
uint16_t calc_crc_struct(FLASH_RECORD* res);
|
|
|
|
#endif /* FLASH_H_ */
|