MyLibs 1.0
Расширенные библиотеки для STM32
Loading...
Searching...
No Matches
__general_flash.c
1#include "__general_flash.h"
2FLASH_EraseInitTypeDef EraseInitStruct;
3extern HAL_StatusTypeDef res_hal;
4unsigned CRC_Update;
5//uint32_t PAGE_OFFSET = ((uint32_t)((4-1) * 0x0400));
6uint32_t PAGE_NUMB = 127;
7
8
9/* Записать в память данные, произвольного размера */
10HAL_StatusTypeDef FLASH_Write_Data(uint32_t* Address, uint8_t* Data, int Data_size)
11{
12 HAL_StatusTypeDef res_hal;
13
14 int data_cnt = 0;
15 uint32_t adr;
16 uint32_t word_data;
17
18
19 res_hal = HAL_FLASH_Unlock();
20 if (res_hal != HAL_OK) return res_hal;
21
22 for (adr = *Address; adr < *Address + Data_size; adr = adr + 4)
23 {
24
25
26 word_data = (
27 Data[data_cnt] |
28 Data[data_cnt + 1] << 8 |
29 Data[data_cnt + 2] << 16 |
30 Data[data_cnt + 3] << 24);
31
32 res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, adr, word_data);
33
34 if (res_hal != HAL_OK) return res_hal;
35
36 data_cnt += 4;
37 }
38
39 *Address += Data_size;
40 res_hal = HAL_FLASH_Lock();
41
42 return res_hal;
43}
44
45
46
47HAL_StatusTypeDef FLASH_Enable_DualBankMode(void)
48{
49 HAL_StatusTypeDef res_hal;
50 FLASH_AdvOBProgramInitTypeDef OB_DualBank;
51
52
53 res_hal = HAL_FLASH_Unlock();
54 if (res_hal != HAL_OK)
55 return res_hal;
56
57 res_hal = HAL_FLASH_OB_Unlock();
58 if (res_hal != HAL_OK)
59 return res_hal;
60
61
62 FLASH->OPTCR |= FLASH_OPTCR_DB1M;
63
64 res_hal = HAL_FLASH_OB_Launch();
65 if (res_hal != HAL_OK)
66 return res_hal;
67
68 res_hal = HAL_FLASH_OB_Lock();
69 if (res_hal != HAL_OK)
70 return res_hal;
71
72 res_hal = HAL_FLASH_Lock();
73 if (res_hal != HAL_OK)
74 return res_hal;
75
76
77 return res_hal;
78}
79
80
81
82/* Убрать защиту */
83HAL_StatusTypeDef FLASH_WriteProtection(uint32_t BankN, uint32_t WriteProtection)
84{
85 HAL_StatusTypeDef res_hal;
86 FLASH_OBProgramInitTypeDef OBInit;
87
88 // Очистка всех возможных ошибок
89 FLASH->SR |= FLASH_FLAG_WRPERR // Write Protection Error
90 | FLASH_FLAG_PGSERR // Programming Sequence Error
91 | FLASH_FLAG_PGAERR // Programming Alignment Error
92 | FLASH_FLAG_OPERR; // Operation Error
93
94 res_hal = HAL_FLASH_Unlock();
95 if (res_hal != HAL_OK)
96 return res_hal;
97
98 res_hal = HAL_FLASH_OB_Unlock(); // Разблокировка Option Bytes
99 if (res_hal != HAL_OK)
100 return res_hal;
101
102 // Считываем текущую конфигурацию Option Bytes
103 HAL_FLASHEx_OBGetConfig(&OBInit);
104
105 // Отключаем защиту на всех секторах второго банка
106 OBInit.OptionType = OPTIONBYTE_WRP;
107 OBInit.WRPState = WriteProtection; // Снять защиту
108 OBInit.WRPSector = OB_WRP_SECTOR_12; // Снять защиту
109 OBInit.Banks = BankN; // Указываем второй банк
110 res_hal = HAL_FLASHEx_OBProgram(&OBInit);
111 if (res_hal != HAL_OK)
112 return res_hal;
113
114 // Записываем изменения и перезагружаем чип
115 res_hal = HAL_FLASH_OB_Launch();
116 if (res_hal != HAL_OK)
117 return res_hal;
118
119 // Считываем текущую конфигурацию Option Bytes
120 HAL_FLASHEx_OBGetConfig(&OBInit);
121
122// Блокировка Option Bytes
123 res_hal = HAL_FLASH_OB_Lock();
124 if (res_hal != HAL_OK)
125 return res_hal;
126
127 res_hal = HAL_FLASH_Lock();
128 if (res_hal != HAL_OK)
129 return res_hal;
130
131 return res_hal;
132}
133//-----------------ELEMENTARY FUNCTIONS---------------------
134/* functions for reading bytes/halswords/words */
135uint8_t FLASH_Read_Byte(uint32_t add)
136{
137 return (*(__IO uint8_t*)(add));
138}
139uint16_t FLASH_Read_HalfWord(uint32_t add)
140{
141 return (*(__IO uint16_t*)(add));
142}
143uint32_t FLASH_Read_Word(uint32_t add)
144{
145 return (*(__IO uint32_t*)(add));
146}
147/* functions for writing bytes/halswords/words */
148HAL_StatusTypeDef FLASH_Write_Byte(uint32_t Address, uint8_t Data)
149{
150 HAL_StatusTypeDef res_hal;
151
152 res_hal = HAL_FLASH_Unlock();
153
154 if (res_hal != HAL_OK) return res_hal;
155
156 res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, Address, (uint8_t)(Data));
157
158 if (res_hal != HAL_OK) return res_hal;
159
160 res_hal = HAL_FLASH_Lock();
161 return res_hal;
162}
163HAL_StatusTypeDef FLASH_Write_HalfWord(uint32_t Address, uint16_t Data)
164{
165 HAL_StatusTypeDef res_hal;
166
167 res_hal = HAL_FLASH_Unlock();
168
169 if (res_hal != HAL_OK) return res_hal;
170
171 res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Address, (uint16_t)(Data));
172
173 if (res_hal != HAL_OK) return res_hal;
174
175 res_hal = HAL_FLASH_Lock();
176 return res_hal;
177}
178HAL_StatusTypeDef FLASH_Write_Word(uint32_t Address, uint32_t Data)
179{
180 HAL_StatusTypeDef res_hal;
181
182 res_hal = HAL_FLASH_Unlock();
183 if (res_hal != HAL_OK) return res_hal;
184
185 res_hal = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, (uint32_t)(Data));
186 if (res_hal != HAL_OK) return res_hal;
187
188 res_hal = HAL_FLASH_Lock();
189 return res_hal;
190}
191//----------------------------------------------------------
192