servo/controller/fw/embed/include/flash.h

88 lines
2.4 KiB
C
Raw Normal View History

2025-04-16 22:51:39 +03:00
#ifndef FLASH_H_
#define FLASH_H_
#include "stm32f446xx.h"
#include <stdio.h>
#include <stdlib.h>
/* for addr in FLASH */
2025-05-15 17:38:59 +03:00
/* no padding for this struct, beacuse storing 8 bytes*/
2025-04-16 22:51:39 +03:00
typedef struct{
uint8_t data_id; // data_id = id register of can
uint8_t data_type;
2025-04-16 22:51:39 +03:00
uint16_t crc;
2025-05-15 17:38:59 +03:00
uint32_t value;
2025-04-16 22:51:39 +03:00
// uint32_t write_ptr_now;
}FLASH_RECORD;
enum {
addr_id = 0,
pid_p = 1,
2025-04-17 16:49:39 +03:00
pid_i,
2025-05-15 17:38:59 +03:00
pid_d,
2025-05-23 09:10:51 +03:00
firmw,
2025-05-15 17:38:59 +03:00
foc_id,
angl,
2025-06-06 18:37:48 +03:00
vel,
torq
2025-04-16 22:51:39 +03:00
};
/* for saved in FLASH float data*/
union{
uint32_t i;
float f;
}conv_float_to_int;
2025-04-16 22:51:39 +03:00
#define FLASH_RECORD_SIZE sizeof(FLASH_RECORD) //size flash struct
2025-05-23 09:10:51 +03:00
#define PARAM_COUNT 5 // count data in flash
#define FIRMWARE_FLAG (uint32_t)0xDEADBEEF
2025-04-16 22:51:39 +03:00
// Flash sectors for STM32F407
#define SECTOR_2 0x08008000 // 16KB
#define SECTOR_3 0x0800C000 // 16KB
#define SECTOR_4 0x08010000 // 64KB
#define SECTOR_5 0x08020000 // 128KB
#define SECTOR_6 0x08040000 // 128KB
#define SECTOR_6_END (SECTOR_6 + 128 * 1024) // sector 6 end
#define SECTOR_7 0x08060000 // 128KB
#define FLAG_BOOT (0x08040000 + 4)
// Flash keys for unlocking flash memory
#define BYTE32 0
#define BYTE8 1
2025-04-18 12:50:07 +03:00
#define UPDATE_FLAG 0xDEADBEEF // Unique 32bit value
2025-04-16 22:51:39 +03:00
//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))
2025-05-15 17:38:59 +03:00
static uint32_t write_ptr = SECTOR_6;
2025-04-16 22:51:39 +03:00
//for bootloader
typedef void(*pFunction)(void);
2025-05-16 21:06:31 +03:00
2025-04-16 22:51:39 +03:00
// 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);
bool validaate_crc(FLASH_RECORD* crc);
2025-05-15 17:38:59 +03:00
void write_param(uint8_t param_id,uint32_t val);
2025-04-16 22:51:39 +03:00
#endif /* FLASH_H_ */