init commit

SPI FLASH only, I2C eeprom later
This commit is contained in:
alexey
2024-08-12 17:09:48 +03:00
parent dbf70c6ab0
commit 7dfb95b9f1
1118 changed files with 909906 additions and 0 deletions

190
GENERAL/flash_general.c Normal file
View File

@@ -0,0 +1,190 @@
#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;
}
//----------------------------------------------------------