#ifndef FLASH_H_ #define FLASH_H_ #include "stm32f446xx.h" #include #include /* 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, firmw, foc_id, angl, vel }; /* 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 #define UPDATE_FLAG 0xDEADBEEF // flag forz update firmware #define BOOT_CAN_ID 0x01 // CAN ID bootloader #define BOOT_CAN_END 0x02 // CAN ID end of transfer #define DATA_CAN_ID 0x03 // CAN ID packet data #define ACK_CAN_ID 0x05 // CAN ID acknowledge #define MAX_FW_SIZE 0x3FFF // Max size firmware = 256 kB #define PARAM_COUNT 5 // count data in flash #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_ */