Чет работает
This commit is contained in:
195
AllLibs/PeriphGeneral/Src/__general_flash.c
Normal file
195
AllLibs/PeriphGeneral/Src/__general_flash.c
Normal file
@@ -0,0 +1,195 @@
|
||||
#include "__general_flash.h"
|
||||
|
||||
#if 0
|
||||
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;
|
||||
|
||||
|
||||
/* Записать в память данные, произвольного размера */
|
||||
HAL_StatusTypeDef FLASH_Write_Data(uint32_t* Address, uint8_t* Data, int Data_size)
|
||||
{
|
||||
HAL_StatusTypeDef res_hal;
|
||||
|
||||
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);
|
||||
|
||||
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_Enable_DualBankMode(void)
|
||||
{
|
||||
HAL_StatusTypeDef res_hal;
|
||||
FLASH_AdvOBProgramInitTypeDef OB_DualBank;
|
||||
|
||||
|
||||
res_hal = HAL_FLASH_Unlock();
|
||||
if (res_hal != HAL_OK)
|
||||
return res_hal;
|
||||
|
||||
res_hal = HAL_FLASH_OB_Unlock();
|
||||
if (res_hal != HAL_OK)
|
||||
return res_hal;
|
||||
|
||||
|
||||
FLASH->OPTCR |= FLASH_OPTCR_DB1M;
|
||||
|
||||
res_hal = HAL_FLASH_OB_Launch();
|
||||
if (res_hal != HAL_OK)
|
||||
return res_hal;
|
||||
|
||||
res_hal = HAL_FLASH_OB_Lock();
|
||||
if (res_hal != HAL_OK)
|
||||
return res_hal;
|
||||
|
||||
res_hal = HAL_FLASH_Lock();
|
||||
if (res_hal != HAL_OK)
|
||||
return res_hal;
|
||||
|
||||
|
||||
return res_hal;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Убрать защиту */
|
||||
HAL_StatusTypeDef FLASH_WriteProtection(uint32_t BankN, uint32_t WriteProtection)
|
||||
{
|
||||
HAL_StatusTypeDef res_hal;
|
||||
FLASH_OBProgramInitTypeDef OBInit;
|
||||
|
||||
// Очистка всех возможных ошибок
|
||||
FLASH->SR |= FLASH_FLAG_WRPERR // Write Protection Error
|
||||
| FLASH_FLAG_PGSERR // Programming Sequence Error
|
||||
| FLASH_FLAG_PGAERR // Programming Alignment Error
|
||||
| FLASH_FLAG_OPERR; // Operation Error
|
||||
|
||||
res_hal = HAL_FLASH_Unlock();
|
||||
if (res_hal != HAL_OK)
|
||||
return res_hal;
|
||||
|
||||
res_hal = HAL_FLASH_OB_Unlock(); // Разблокировка Option Bytes
|
||||
if (res_hal != HAL_OK)
|
||||
return res_hal;
|
||||
|
||||
// Считываем текущую конфигурацию Option Bytes
|
||||
HAL_FLASHEx_OBGetConfig(&OBInit);
|
||||
|
||||
// Отключаем защиту на всех секторах второго банка
|
||||
OBInit.OptionType = OPTIONBYTE_WRP;
|
||||
OBInit.WRPState = WriteProtection; // Снять защиту
|
||||
OBInit.WRPSector = OB_WRP_SECTOR_12; // Снять защиту
|
||||
OBInit.Banks = BankN; // Указываем второй банк
|
||||
res_hal = HAL_FLASHEx_OBProgram(&OBInit);
|
||||
if (res_hal != HAL_OK)
|
||||
return res_hal;
|
||||
|
||||
// Записываем изменения и перезагружаем чип
|
||||
res_hal = HAL_FLASH_OB_Launch();
|
||||
if (res_hal != HAL_OK)
|
||||
return res_hal;
|
||||
|
||||
// Считываем текущую конфигурацию Option Bytes
|
||||
HAL_FLASHEx_OBGetConfig(&OBInit);
|
||||
|
||||
// Блокировка Option Bytes
|
||||
res_hal = HAL_FLASH_OB_Lock();
|
||||
if (res_hal != HAL_OK)
|
||||
return res_hal;
|
||||
|
||||
res_hal = HAL_FLASH_Lock();
|
||||
if (res_hal != HAL_OK)
|
||||
return res_hal;
|
||||
|
||||
return res_hal;
|
||||
}
|
||||
//-----------------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)
|
||||
{
|
||||
HAL_StatusTypeDef res_hal;
|
||||
|
||||
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)
|
||||
{
|
||||
HAL_StatusTypeDef res_hal;
|
||||
|
||||
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)
|
||||
{
|
||||
HAL_StatusTypeDef res_hal;
|
||||
|
||||
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;
|
||||
}
|
||||
//----------------------------------------------------------
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user