Files
STM32_MemorySPI/GENERAL/flash_general.c
alexey 7dfb95b9f1 init commit
SPI FLASH only, I2C eeprom later
2024-08-12 17:09:48 +03:00

191 lines
4.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "flash_general.h"
FLASH_EraseInitTypeDef EraseInitStruct;
extern HAL_StatusTypeDef res_hal;
unsigned CRC_Update;
//uint32_t PAGE_OFFSET = ((uint32_t)((4-1) * 0x0400));
uint32_t PAGE_NUMB = 127;
//----------------------------------------------------------
/*-----------------BOOTLOADER FUNCTIONS-------------------*/
/* Записать в память данные, произвольного размера */
HAL_StatusTypeDef FLASH_Write_Data(uint32_t* Address, uint8_t* Data, int Data_size)
{
int data_cnt = 0;
uint32_t adr;а
uint32_t word_data;
res_hal = HAL_FLASH_Unlock();
if (res_hal != HAL_OK) return res_hal;
for (adr = *Address; adr < *Address + Data_size; adr = adr + 4)
{
word_data = (
Data[data_cnt] |
Data[data_cnt + 1] << 8 |
Data[data_cnt + 2] << 16 |
Data[data_cnt + 3] << 24);
if (adr == (0x40+USART2_IRQn*4)+MAIN_APP_START_ADDRESS)
{
// check if uart handler is correct
if (word_data == FLASH_Read_Word(MAIN_APP_START_ADDRESS+4) + 0x1A) // if there is no specific address for uart handler
{
word_data = FLASH_Read_Word(UART_HANDLER_ADD); // write address of bootloader uart handler
CRC_Update = 1;
}
}
res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, adr, word_data);
if (res_hal != HAL_OK) return res_hal;
data_cnt += 4;
}
*Address += Data_size;
res_hal = HAL_FLASH_Lock();
return res_hal;
}
/* Очистить приложение */
HAL_StatusTypeDef FLASH_Erase_App(void) //
{
uint32_t PageError = 0x00;
res_hal = HAL_FLASH_Unlock();
if (res_hal != HAL_OK)
{
__ASM("");
return res_hal;
}
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;// erase pages
EraseInitStruct.Banks = FLASH_BANK_1;
EraseInitStruct.Sector = KEY_FLASH_SECTOR_X+1; //first sector for erase
EraseInitStruct.NbSectors = 8;// num of sector that need to be erased
res_hal = HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
if (res_hal != HAL_OK)
{
__ASM("");
return res_hal;
}
res_hal = HAL_FLASH_Lock();
return res_hal;
}
/* Записать ключ в память */
void SetKey(void)
{
HAL_FLASH_Unlock();
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, BOOTLOADER_KEY_SECTOR_ADR, BL_KEY_APP_WRITTEN);
HAL_FLASH_Lock();
}
/* Считать ключ из памяти */
uint32_t ReadKey(void)
{
return (*(__IO uint32_t*)BOOTLOADER_KEY_SECTOR_ADR);
}
/* Очистить настройки бутлоадера для запуска приложения (CRC) */
void ResetAppSettings(void)
{
HAL_FLASH_Unlock();
uint32_t PageError = 0x00;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;// erase pages
EraseInitStruct.Banks = APP_SET_FLASH_BANK_X;
EraseInitStruct.Sector = APP_SET_FLASH_SECTOR_X; //address
EraseInitStruct.NbSectors = 1;// num of erased pages
HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
HAL_FLASH_Lock();
}
/* Очистить сектор с ключом (ключ, количество перезагрузок из-за WDGT) */
void ResetKeySector(void)
{
HAL_FLASH_Unlock();
uint32_t PageError = 0x00;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;// erase pages
EraseInitStruct.Banks = KEY_FLASH_BANK_X;
EraseInitStruct.Sector = KEY_FLASH_SECTOR_X; //address
EraseInitStruct.NbSectors = 1;// num of erased pages
HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
HAL_FLASH_Lock();
}
/*-----------------BOOTLOADER FUNCTIONS-------------------*/
//----------------------------------------------------------
//-----------------ELEMENTARY FUNCTIONS---------------------
/* functions for reading bytes/halswords/words */
uint8_t FLASH_Read_Byte(uint32_t add)
{
return (*(__IO uint8_t*)(add));
}
uint16_t FLASH_Read_HalfWord(uint32_t add)
{
return (*(__IO uint16_t*)(add));
}
uint32_t FLASH_Read_Word(uint32_t add)
{
return (*(__IO uint32_t*)(add));
}
/* functions for writing bytes/halswords/words */
HAL_StatusTypeDef FLASH_Write_Byte(uint32_t Address, uint8_t Data)
{
res_hal = HAL_FLASH_Unlock();
if (res_hal != HAL_OK) return res_hal;
res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, Address, (uint8_t)(Data));
if (res_hal != HAL_OK) return res_hal;
res_hal = HAL_FLASH_Lock();
return res_hal;
}
HAL_StatusTypeDef FLASH_Write_HalfWord(uint32_t Address, uint16_t Data)
{
res_hal = HAL_FLASH_Unlock();
if (res_hal != HAL_OK) return res_hal;
res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Address, (uint16_t)(Data));
if (res_hal != HAL_OK) return res_hal;
res_hal = HAL_FLASH_Lock();
return res_hal;
}
HAL_StatusTypeDef FLASH_Write_Word(uint32_t Address, uint32_t Data)
{
res_hal = HAL_FLASH_Unlock();
if (res_hal != HAL_OK) return res_hal;
res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, (uint32_t)(Data));
if (res_hal != HAL_OK) return res_hal;
res_hal = HAL_FLASH_Lock();
return res_hal;
}
//----------------------------------------------------------