NIIETCM4 PD  v0.10.5
Драйвер периферии для микроконтроллеров на базе ядра ARM Cortex-M4
 Указатель Структуры данных Файлы Функции Переменные Перечисления Элементы перечислений Группы Страницы
niietcm4_userflash.c
См. документацию.
1 
30 /* Includes ------------------------------------------------------------------*/
31 #include "niietcm4_userflash.h"
32 
56 #define LEVELS_NUMBER 5
57 
62 #define IS_VALID_FREQ(SYS_FREQ) ((SYS_FREQ) <= 100000000)
63 
78 void USERFLASH_Init(uint32_t SysClkFreq)
79 {
80  assert_param(IS_VALID_FREQ(SysClkFreq));
81 
82  /*
83  * The cycle checks the levels. With the level up Tacc increases.
84  */
85  uint32_t Tacc = 1;
86 
87  /*
88  * Таблица 7.3 – Значения параметра Tacc в зависимости от частоты.
89  */
90  const uint32_t Levels[LEVELS_NUMBER] = {15000000, 30000000, 48000000, 60000000, 80000000};
91 
92  for (uint32_t Index = 0; Index < LEVELS_NUMBER; Index++)
93  {
94  if (Levels[Index] < SysClkFreq)
95  {
96  Tacc++;
97  }
98  else
99  {
100  break;
101  }
102  }
103 
104  NT_USERFLASH->T_ACC = Tacc;
105  NT_USERFLASH->T_PROG = (uint32_t)(SysClkFreq * 0.00003F);
106  NT_USERFLASH->T_ERASE = (uint32_t)(SysClkFreq * 0.03F);
107  NT_USERFLASH->T_ME = (uint32_t)(SysClkFreq * 0.03F);
108 }
109 
117 {
119 
120  Status = USERFLASH_Status_None;
121 
122  NT_USERFLASH->FCIC = USERFLASH_FCIC_CLR_OPCMLT_Msk | USERFLASH_FCIC_CLR_OPERROR_Msk;
123  NT_USERFLASH->FMC = USERFLASH_MAGIC_KEY | USERFLASH_FMC_FULL_ERASE_Msk;
124 
125  while (Status == USERFLASH_Status_None)
126  {
127  Status = (USERFLASH_Status_TypeDef)(NT_USERFLASH->FCIS & (USERFLASH_FCIS_OP_CMLT_Msk | USERFLASH_FCIS_OP_ERROR_Msk));
128  }
129 
130  return Status;
131 }
132 
139 uint32_t USERFLASH_Read(uint32_t Address)
140 {
141  uint32_t timeout = USERFLASH_OPERATION_TIMEOUT;
143 
144  NT_USERFLASH->FCIC = USERFLASH_FCIC_CLR_OPCMLT_Msk | USERFLASH_FCIC_CLR_OPERROR_Msk;
145  NT_USERFLASH->FMA = Address;
146  NT_USERFLASH->FMC = USERFLASH_MAGIC_KEY | USERFLASH_FMC_READ_Msk;
147 
148  while (Status == USERFLASH_Status_None)
149  {
150  Status = (USERFLASH_Status_TypeDef)(NT_USERFLASH->FCIS & (USERFLASH_FCIS_OP_CMLT_Msk | USERFLASH_FCIS_OP_ERROR_Msk));
151 
152  if (!timeout--)
153  {
154  break;
155  }
156  }
157 
158  return NT_USERFLASH->FMD;
159 }
160 
170 USERFLASH_Status_TypeDef USERFLASH_Write(uint32_t Address, uint32_t Data)
171 {
173 
174  Status = USERFLASH_Status_None;
175 
176  NT_USERFLASH->FCIC = USERFLASH_FCIC_CLR_OPCMLT_Msk | USERFLASH_FCIC_CLR_OPERROR_Msk;
177  NT_USERFLASH->FMA = Address;
178  NT_USERFLASH->FMD = Data;
179  NT_USERFLASH->FMC = USERFLASH_MAGIC_KEY | USERFLASH_FMC_WRITE_Msk;
180 
181  while (Status == USERFLASH_Status_None)
182  {
183  Status = (USERFLASH_Status_TypeDef)(NT_USERFLASH->FCIS & (USERFLASH_FCIS_OP_CMLT_Msk | USERFLASH_FCIS_OP_ERROR_Msk));
184  }
185 
186  return Status;
187 }
188 
197 {
198  assert_param(IS_USERFLASH_PAGE_NUM(PageNum));
199 
201 
202  Status = USERFLASH_Status_None;
203 
204  NT_USERFLASH->FCIC = USERFLASH_FCIC_CLR_OPCMLT_Msk | USERFLASH_FCIC_CLR_OPERROR_Msk;
205  NT_USERFLASH->FMA = PageNum * USERFLASH_PAGE_SIZE_BYTES;
206  NT_USERFLASH->FMC = USERFLASH_MAGIC_KEY | USERFLASH_FMC_PAGE_ERASE_Msk;
207 
208  while (Status == USERFLASH_Status_None)
209  {
210  Status = (USERFLASH_Status_TypeDef)(NT_USERFLASH->FCIS & (USERFLASH_FCIS_OP_CMLT_Msk | USERFLASH_FCIS_OP_ERROR_Msk));
211  }
212 
213  return Status;
214 }
215 
222 uint32_t USERFLASH_Info_Read(uint32_t Address)
223 {
224  uint32_t timeout = USERFLASH_OPERATION_TIMEOUT;
226 
227  NT_USERFLASH->FCIC = USERFLASH_FCIC_CLR_OPCMLT_Msk | USERFLASH_FCIC_CLR_OPERROR_Msk;
228  NT_USERFLASH->FMA = Address;
229  NT_USERFLASH->FMC = USERFLASH_MAGIC_KEY | USERFLASH_FMC_READ_IFB_Msk;
230 
231  while (Status == USERFLASH_Status_None)
232  {
233  Status = (USERFLASH_Status_TypeDef)(NT_USERFLASH->FCIS & (USERFLASH_FCIS_OP_CMLT_Msk | USERFLASH_FCIS_OP_ERROR_Msk));
234 
235  if (!timeout--)
236  {
237  break;
238  }
239  }
240 
241  return NT_USERFLASH->FMD;
242 }
243 
253 USERFLASH_Status_TypeDef USERFLASH_Info_Write(uint32_t Address, uint32_t Data)
254 {
256 
257  Status = USERFLASH_Status_None;
258 
259  NT_USERFLASH->FCIC = USERFLASH_FCIC_CLR_OPCMLT_Msk | USERFLASH_FCIC_CLR_OPERROR_Msk;
260  NT_USERFLASH->FMA = Address;
261  NT_USERFLASH->FMD = Data;
262  NT_USERFLASH->FMC = USERFLASH_MAGIC_KEY | USERFLASH_FMC_WRITE_IFB_Msk;
263 
264  while (Status == USERFLASH_Status_None)
265  {
266  Status = (USERFLASH_Status_TypeDef)(NT_USERFLASH->FCIS & (USERFLASH_FCIS_OP_CMLT_Msk | USERFLASH_FCIS_OP_ERROR_Msk));
267  }
268 
269  return Status;
270 }
271 
280 {
281  assert_param(IS_USERFLASH_INFO_PAGE_NUM(PageNum));
282 
284 
285  Status = USERFLASH_Status_None;
286 
287  NT_USERFLASH->FCIC = USERFLASH_FCIC_CLR_OPCMLT_Msk | USERFLASH_FCIC_CLR_OPERROR_Msk;
288  NT_USERFLASH->FMA = PageNum * USERFLASH_PAGE_SIZE_BYTES;
289  NT_USERFLASH->FMC = USERFLASH_MAGIC_KEY | USERFLASH_FMC_PAGEERASE_IFB_Msk;
290 
291  while (Status == USERFLASH_Status_None)
292  {
293  Status = (USERFLASH_Status_TypeDef)(NT_USERFLASH->FCIS & (USERFLASH_FCIS_OP_CMLT_Msk | USERFLASH_FCIS_OP_ERROR_Msk));
294  }
295 
296  return Status;
297 }
298 
307 {
308  assert_param(IS_FUNCTIONAL_STATE(State));
309 
310  NT_USERFLASH->FCIM_bit.MASK_OPCMLT = (uint32_t)State;
311 }
312 
329 /******************* (C) COPYRIGHT 2015 NIIET *****END OF FILE****/
#define LEVELS_NUMBER
Количество уровней системной частоты (Таблица 7.3).
USERFLASH_Status_TypeDef USERFLASH_Write(uint32_t Address, uint32_t Data)
Запись байта в основную область пользовательской флеш по указанному адресу.
uint32_t USERFLASH_Read(uint32_t Address)
Чтение байта из основной области пользовательской флеш.
#define IS_USERFLASH_INFO_PAGE_NUM(PAGE_NUM)
Макрос проверки номера страницы информационной области пользовательской флеш на попадание в допустимы...
void USERFLASH_ITCmd(FunctionalState State)
Включение прерывания по завершению чтении/записи/стирания.
Файл содержит все прототипы функций для пользовательской флеш.
#define USERFLASH_OPERATION_TIMEOUT
Время ожидания выполнения операции с флеш.
USERFLASH_Status_TypeDef USERFLASH_Info_Write(uint32_t Address, uint32_t Data)
Запись байта в информационную область пользовательской флеш по указанному адресу. ...
void USERFLASH_Init(uint32_t SysClkFreq)
Инициализирует тайминги доступа для контроллера пользовательской флеш.
USERFLASH_Status_TypeDef USERFLASH_Info_PageErase(uint32_t PageNum)
Стирание указнной страницы информационной области пользовательской флеш.
USERFLASH_Status_TypeDef
Статус работы контроллера пользовательской флеш-памяти.
uint32_t USERFLASH_Info_Read(uint32_t Address)
Чтение байта из информационной области пользовательской флеш.
FunctionalState
Описывает логическое состояние периферии. Используется для операций включения/выключения периферийных...
Definition: niietcm4.h:169
#define IS_FUNCTIONAL_STATE(STATE)
Макрос проверки аргументов типа FunctionalState.
Definition: niietcm4.h:179
#define IS_VALID_FREQ(SYS_FREQ)
Макрос проверки допустимости значения системной частоты.
#define USERFLASH_PAGE_SIZE_BYTES
#define IS_USERFLASH_PAGE_NUM(PAGE_NUM)
Макрос проверки номера страницы основной области пользовательской флеш на попадание в допустимый диап...
USERFLASH_Status_TypeDef USERFLASH_PageErase(uint32_t PageNum)
Стирание указнной страницы основной области пользовательской флеш.
USERFLASH_Status_TypeDef USERFLASH_FullErase(void)
Полная очистка основной области пользовательской флеш.
#define USERFLASH_MAGIC_KEY
Ключ для проведения операций с контроллером пользовательской флеш.