- максимально убрана зависимость от HAL - можно использовать и без него, чисто на cmsis - документирован uart - документирован spi - добавлены примеры использования в general_periph - всякие фиксы документации
193 lines
4.8 KiB
C
193 lines
4.8 KiB
C
#include "__general_flash.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;
|
|
|
|
|
|
/* Записать в память данные, произвольного размера */
|
|
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;
|
|
}
|
|
//----------------------------------------------------------
|
|
|