1 /**
2 ******************************************************************************
3 * @file stm32l5xx_hal_icache.c
4 * @author MCD Application Team
5 * @brief ICACHE HAL module driver.
6 * This file provides firmware functions to manage the following
7 * functionalities of the Instruction Cache (ICACHE).
8 * + Initialization and Configuration
9 * + Invalidate functions
10 * + Monitoring management
11 * + Memory address remap management
12 ******************************************************************************
13 * @attention
14 *
15 * Copyright (c) 2019 STMicroelectronics.
16 * All rights reserved.
17 *
18 * This software is licensed under terms that can be found in the LICENSE file
19 * in the root directory of this software component.
20 * If no LICENSE file comes with this software, it is provided AS-IS.
21 *
22 ******************************************************************************
23 @verbatim
24 ==============================================================================
25 ##### ICACHE main features #####
26 ==============================================================================
27 [..]
28 The Instruction Cache (ICACHE) is introduced on C-AHB code bus of
29 Cortex-M33 processor to improve performance when fetching instruction
30 and data from both internal and external memories. It allows close to
31 zero wait states performance.
32
33 (+) The ICACHE provides two performance counters (Hit and Miss),
34 cache invalidate maintenance operation, error management and TrustZone
35 security support.
36
37 (+) The ICACHE provides additionally the possibility to remap input address
38 falling into up to four memory regions (used to remap aliased code in
39 external memories to the internal Code region, for execution)
40
41 ===============================================================================
42 ##### How to use this driver #####
43 ===============================================================================
44 [..]
45 The ICACHE HAL driver can be used as follows:
46
47 (#) Optionally configure the Instruction Cache mode with
48 @ref HAL_ICACHE_ConfigAssociativityMode() if the default configuration
49 does not suit the application requirements.
50
51 (#) Enable and disable the Instruction Cache with respectively
52 @ref HAL_ICACHE_Enable() and @ref HAL_ICACHE_Disable().
53 Use @ref HAL_ICACHE_IsEnabled() to get the Instruction Cache status.
54
55 (#) Initiate the cache maintenance invalidation procedure with either
56 @ref HAL_ICACHE_Invalidate() (blocking mode) or @ref HAL_ICACHE_Invalidate_IT()
57 (interrupt mode). When interrupt mode is used, the callback function
58 @ref HAL_ICACHE_InvalidateCompleteCallback() is called when the invalidate
59 procedure is complete. The function @ref HAL_ICACHE_WaitForInvalidateComplete()
60 may be called to wait for the end of the invalidate procedure automatically
61 initiated when disabling the Instruction Cache with @ref HAL_ICACHE_Disable().
62 The cache operation is bypassed during the invalidation procedure.
63
64 (#) Use the performance monitoring counters for Hit and Miss with the following
65 functions: @ref HAL_ICACHE_Monitor_Start(), @ref HAL_ICACHE_Monitor_Stop(),
66 @ref HAL_ICACHE_Monitor_Reset(), @ref HAL_ICACHE_Monitor_GetHitValue() and
67 @ref HAL_ICACHE_Monitor_GetMissValue()
68
69 (#) Enable and disable up to four regions to remap input address from external
70 memories to the internal Code region for execution with
71 @ref HAL_ICACHE_EnableRemapRegion() and @ref HAL_ICACHE_DisableRemapRegion()
72
73 @endverbatim
74 */
75
76 /* Includes ------------------------------------------------------------------*/
77 #include "stm32l5xx_hal.h"
78
79 /** @addtogroup STM32L5xx_HAL_Driver
80 * @{
81 */
82
83 /** @defgroup ICACHE ICACHE
84 * @brief HAL ICACHE module driver
85 * @{
86 */
87 #ifdef HAL_ICACHE_MODULE_ENABLED
88
89 /* Private typedef -----------------------------------------------------------*/
90 /* Private constants ---------------------------------------------------------*/
91 /** @addtogroup ICACHE_Private_Constants ICACHE Private Constants
92 * @{
93 */
94 #define ICACHE_INVALIDATE_TIMEOUT_VALUE 1U /* 1ms */
95 #define ICACHE_DISABLE_TIMEOUT_VALUE 1U /* 1ms */
96
97 /**
98 * @}
99 */
100
101 /* Private macros ------------------------------------------------------------*/
102 /** @defgroup ICACHE_Private_Macros ICACHE Private Macros
103 * @{
104 */
105
106 #define IS_ICACHE_ASSOCIATIVITY_MODE(__MODE__) (((__MODE__) == ICACHE_1WAY) || \
107 ((__MODE__) == ICACHE_2WAYS))
108
109 #define IS_ICACHE_MONITOR_TYPE(__TYPE__) (((__TYPE__) == ICACHE_MONITOR_HIT_MISS) || \
110 ((__TYPE__) == ICACHE_MONITOR_HIT) || \
111 ((__TYPE__) == ICACHE_MONITOR_MISS))
112
113 #define IS_ICACHE_REGION_NUMBER(__NUMBER__) ((__NUMBER__) < 4U)
114
115 #define IS_ICACHE_REGION_SIZE(__SIZE__) (((__SIZE__) == ICACHE_REGIONSIZE_2MB) || \
116 ((__SIZE__) == ICACHE_REGIONSIZE_4MB) || \
117 ((__SIZE__) == ICACHE_REGIONSIZE_8MB) || \
118 ((__SIZE__) == ICACHE_REGIONSIZE_16MB) || \
119 ((__SIZE__) == ICACHE_REGIONSIZE_32MB) || \
120 ((__SIZE__) == ICACHE_REGIONSIZE_64MB) || \
121 ((__SIZE__) == ICACHE_REGIONSIZE_128MB))
122
123 #define IS_ICACHE_REGION_TRAFFIC_ROUTE(__TRAFFICROUTE__) (((__TRAFFICROUTE__) == ICACHE_MASTER1_PORT) || \
124 ((__TRAFFICROUTE__) == ICACHE_MASTER2_PORT))
125
126 #define IS_ICACHE_REGION_OUTPUT_BURST_TYPE(__OUTPUTBURSTTYPE_) (((__OUTPUTBURSTTYPE_) == ICACHE_OUTPUT_BURST_WRAP) || \
127 ((__OUTPUTBURSTTYPE_) == ICACHE_OUTPUT_BURST_INCR))
128
129 /**
130 * @}
131 */
132
133 /* Private variables ---------------------------------------------------------*/
134 /* Private function prototypes -----------------------------------------------*/
135
136 /* Exported functions --------------------------------------------------------*/
137
138 /** @defgroup ICACHE_Exported_Functions ICACHE Exported Functions
139 * @{
140 */
141
142 /** @defgroup ICACHE_Exported_Functions_Group1 Initialization and control functions
143 * @brief Initialization and control functions
144 *
145 @verbatim
146 ==============================================================================
147 ##### Initialization and control functions #####
148 ==============================================================================
149 [..]
150 This section provides functions allowing to initialize and control the
151 Instruction Cache (mode, invalidate procedure, performance counters).
152 @endverbatim
153 * @{
154 */
155
156 /**
157 * @brief Configure the Instruction Cache cache associativity mode selection.
158 * @param AssociativityMode Associativity mode selection
159 * This parameter can be one of the following values:
160 * @arg ICACHE_1WAY 1-way cache (direct mapped cache)
161 * @arg ICACHE_2WAYS 2-ways set associative cache (default)
162 * @retval HAL status (HAL_OK/HAL_ERROR)
163 */
HAL_ICACHE_ConfigAssociativityMode(uint32_t AssociativityMode)164 HAL_StatusTypeDef HAL_ICACHE_ConfigAssociativityMode(uint32_t AssociativityMode)
165 {
166 HAL_StatusTypeDef status = HAL_OK;
167
168 /* Check the parameters */
169 assert_param(IS_ICACHE_ASSOCIATIVITY_MODE(AssociativityMode));
170
171 /* Check cache is not enabled */
172 if (READ_BIT(ICACHE->CR, ICACHE_CR_EN) != 0U)
173 {
174 status = HAL_ERROR;
175 }
176 else
177 {
178 MODIFY_REG(ICACHE->CR, ICACHE_CR_WAYSEL, AssociativityMode);
179 }
180
181 return status;
182 }
183
184 /**
185 * @brief DeInitialize the Instruction Cache.
186 * @retval HAL status (HAL_OK/HAL_TIMEOUT)
187 */
HAL_ICACHE_DeInit(void)188 HAL_StatusTypeDef HAL_ICACHE_DeInit(void)
189 {
190 HAL_StatusTypeDef status;
191
192 /* Disable cache with reset value for 2-ways set associative mode */
193 WRITE_REG(ICACHE->CR, ICACHE_CR_WAYSEL);
194
195 /* Stop monitor and reset monitor values */
196 (void)HAL_ICACHE_Monitor_Stop(ICACHE_MONITOR_HIT_MISS);
197 (void)HAL_ICACHE_Monitor_Reset(ICACHE_MONITOR_HIT_MISS);
198
199 /* No remapped regions */
200 (void)HAL_ICACHE_DisableRemapRegion(ICACHE_REGION_0);
201 (void)HAL_ICACHE_DisableRemapRegion(ICACHE_REGION_1);
202 (void)HAL_ICACHE_DisableRemapRegion(ICACHE_REGION_2);
203 (void)HAL_ICACHE_DisableRemapRegion(ICACHE_REGION_3);
204
205 /* Wait for end of invalidate cache procedure */
206 status = HAL_ICACHE_WaitForInvalidateComplete();
207
208 /* Clear any pending flags */
209 WRITE_REG(ICACHE->FCR, ICACHE_FCR_CBSYENDF | ICACHE_FCR_CERRF);
210
211 return status;
212 }
213
214 /**
215 * @brief Enable the Instruction Cache.
216 * @note This function always returns HAL_OK even if there is any ongoing
217 * cache operation. The Instruction Cache is bypassed until the
218 * cache operation completes.
219 * @retval HAL status (HAL_OK)
220 */
HAL_ICACHE_Enable(void)221 HAL_StatusTypeDef HAL_ICACHE_Enable(void)
222 {
223 SET_BIT(ICACHE->CR, ICACHE_CR_EN);
224
225 return HAL_OK;
226 }
227
228 /**
229 * @brief Disable the Instruction Cache.
230 * @note This function waits for the cache being disabled but
231 * not for the end of the automatic cache invalidation procedure.
232 * @retval HAL status (HAL_OK/HAL_TIMEOUT)
233 */
HAL_ICACHE_Disable(void)234 HAL_StatusTypeDef HAL_ICACHE_Disable(void)
235 {
236 HAL_StatusTypeDef status = HAL_OK;
237 uint32_t tickstart;
238
239 /* Make sure BSYENDF is reset before to disable the instruction cache */
240 /* as it automatically starts a cache invalidation procedure */
241 WRITE_REG(ICACHE->FCR, ICACHE_FCR_CBSYENDF);
242
243 CLEAR_BIT(ICACHE->CR, ICACHE_CR_EN);
244
245 /* Get tick */
246 tickstart = HAL_GetTick();
247
248 /* Wait for instruction cache being disabled */
249 while (READ_BIT(ICACHE->CR, ICACHE_CR_EN) != 0U)
250 {
251 if ((HAL_GetTick() - tickstart) > ICACHE_DISABLE_TIMEOUT_VALUE)
252 {
253 /* New check to avoid false timeout detection in case of preemption */
254 if (READ_BIT(ICACHE->CR, ICACHE_CR_EN) != 0U)
255 {
256 status = HAL_TIMEOUT;
257 break;
258 }
259 }
260 }
261
262 return status;
263 }
264
265 /**
266 * @brief Check whether the Instruction Cache is enabled or not.
267 * @retval Status (0: disabled, 1: enabled)
268 */
HAL_ICACHE_IsEnabled(void)269 uint32_t HAL_ICACHE_IsEnabled(void)
270 {
271 return ((READ_BIT(ICACHE->CR, ICACHE_CR_EN) != 0U) ? 1UL : 0UL);
272 }
273
274 /**
275 * @brief Invalidate the Instruction Cache.
276 * @note This function waits for the end of cache invalidation procedure
277 * and clears the associated BSYENDF flag.
278 * @retval HAL status (HAL_OK/HAL_ERROR/HAL_TIMEOUT)
279 */
HAL_ICACHE_Invalidate(void)280 HAL_StatusTypeDef HAL_ICACHE_Invalidate(void)
281 {
282 HAL_StatusTypeDef status;
283
284 /* Check no ongoing operation */
285 if (READ_BIT(ICACHE->SR, ICACHE_SR_BUSYF) != 0U)
286 {
287 status = HAL_ERROR;
288 }
289 else
290 {
291 /* Make sure BSYENDF is reset before to start cache invalidation */
292 WRITE_REG(ICACHE->FCR, ICACHE_FCR_CBSYENDF);
293
294 /* Launch cache invalidation */
295 SET_BIT(ICACHE->CR, ICACHE_CR_CACHEINV);
296
297 status = HAL_ICACHE_WaitForInvalidateComplete();
298 }
299
300 return status;
301 }
302
303 /**
304 * @brief Invalidate the Instruction Cache with interrupt.
305 * @note This function launches cache invalidation and returns.
306 * User application shall resort to interrupt generation to check
307 * the end of the cache invalidation with the BSYENDF flag and the
308 * HAL_ICACHE_InvalidateCompleteCallback() callback.
309 * @retval HAL status (HAL_OK/HAL_ERROR)
310 */
HAL_ICACHE_Invalidate_IT(void)311 HAL_StatusTypeDef HAL_ICACHE_Invalidate_IT(void)
312 {
313 HAL_StatusTypeDef status = HAL_OK;
314
315 /* Check no ongoing operation */
316 if (READ_BIT(ICACHE->SR, ICACHE_SR_BUSYF) != 0U)
317 {
318 status = HAL_ERROR;
319 }
320 else
321 {
322 /* Make sure BSYENDF is reset before to start cache invalidation */
323 WRITE_REG(ICACHE->FCR, ICACHE_FCR_CBSYENDF);
324
325 /* Enable end of cache invalidation interrupt */
326 SET_BIT(ICACHE->IER, ICACHE_IER_BSYENDIE);
327
328 /* Launch cache invalidation */
329 SET_BIT(ICACHE->CR, ICACHE_CR_CACHEINV);
330 }
331
332 return status;
333 }
334
335 /**
336 * @brief Wait for the end of the Instruction Cache invalidate procedure.
337 * @note This function checks and clears the BSYENDF flag when set.
338 * @retval HAL status (HAL_OK/HAL_TIMEOUT)
339 */
HAL_ICACHE_WaitForInvalidateComplete(void)340 HAL_StatusTypeDef HAL_ICACHE_WaitForInvalidateComplete(void)
341 {
342 HAL_StatusTypeDef status = HAL_OK;
343 uint32_t tickstart;
344
345 /* Check if ongoing invalidation operation */
346 if (READ_BIT(ICACHE->SR, ICACHE_SR_BUSYF) != 0U)
347 {
348 /* Get tick */
349 tickstart = HAL_GetTick();
350
351 /* Wait for end of cache invalidation */
352 while (READ_BIT(ICACHE->SR, ICACHE_SR_BSYENDF) == 0U)
353 {
354 if ((HAL_GetTick() - tickstart) > ICACHE_INVALIDATE_TIMEOUT_VALUE)
355 {
356 /* New check to avoid false timeout detection in case of preemption */
357 if (READ_BIT(ICACHE->SR, ICACHE_SR_BSYENDF) == 0U)
358 {
359 status = HAL_TIMEOUT;
360 break;
361 }
362 }
363 }
364 }
365
366 /* Clear BSYENDF */
367 WRITE_REG(ICACHE->FCR, ICACHE_FCR_CBSYENDF);
368
369 return status;
370 }
371
372
373 /**
374 * @brief Start the Instruction Cache performance monitoring.
375 * @param MonitorType Monitoring type
376 * This parameter can be one of the following values:
377 * @arg ICACHE_MONITOR_HIT_MISS Hit & Miss monitoring
378 * @arg ICACHE_MONITOR_HIT Hit monitoring
379 * @arg ICACHE_MONITOR_MISS Miss monitoring
380 * @retval HAL status (HAL_OK)
381 */
HAL_ICACHE_Monitor_Start(uint32_t MonitorType)382 HAL_StatusTypeDef HAL_ICACHE_Monitor_Start(uint32_t MonitorType)
383 {
384 /* Check the parameters */
385 assert_param(IS_ICACHE_MONITOR_TYPE(MonitorType));
386
387 SET_BIT(ICACHE->CR, MonitorType);
388
389 return HAL_OK;
390 }
391
392 /**
393 * @brief Stop the Instruction Cache performance monitoring.
394 * @note Stopping the monitoring does not reset the values.
395 * @param MonitorType Monitoring type
396 * This parameter can be one of the following values:
397 * @arg ICACHE_MONITOR_HIT_MISS Hit & Miss monitoring
398 * @arg ICACHE_MONITOR_HIT Hit monitoring
399 * @arg ICACHE_MONITOR_MISS Miss monitoring
400 * @retval HAL status (HAL_OK)
401 */
HAL_ICACHE_Monitor_Stop(uint32_t MonitorType)402 HAL_StatusTypeDef HAL_ICACHE_Monitor_Stop(uint32_t MonitorType)
403 {
404 /* Check the parameters */
405 assert_param(IS_ICACHE_MONITOR_TYPE(MonitorType));
406
407 CLEAR_BIT(ICACHE->CR, MonitorType);
408
409 return HAL_OK;
410 }
411
412 /**
413 * @brief Reset the Instruction Cache performance monitoring values.
414 * @param MonitorType Monitoring type
415 * This parameter can be one of the following values:
416 * @arg ICACHE_MONITOR_HIT_MISS Hit & Miss monitoring
417 * @arg ICACHE_MONITOR_HIT Hit monitoring
418 * @arg ICACHE_MONITOR_MISS Miss monitoring
419 * @retval HAL status (HAL_OK)
420 */
HAL_ICACHE_Monitor_Reset(uint32_t MonitorType)421 HAL_StatusTypeDef HAL_ICACHE_Monitor_Reset(uint32_t MonitorType)
422 {
423 /* Check the parameters */
424 assert_param(IS_ICACHE_MONITOR_TYPE(MonitorType));
425
426 /* Force/Release reset */
427 SET_BIT(ICACHE->CR, (MonitorType << 2U));
428 CLEAR_BIT(ICACHE->CR, (MonitorType << 2U));
429
430 return HAL_OK;
431 }
432
433 /**
434 * @brief Get the Instruction Cache performance Hit monitoring value.
435 * @note Upon reaching the 32-bit maximum value, monitor does not wrap.
436 * @retval Hit monitoring value
437 */
HAL_ICACHE_Monitor_GetHitValue(void)438 uint32_t HAL_ICACHE_Monitor_GetHitValue(void)
439 {
440 return (ICACHE->HMONR);
441 }
442
443 /**
444 * @brief Get the Instruction Cache performance Miss monitoring value.
445 * @note Upon reaching the 32-bit maximum value, monitor does not wrap.
446 * @retval Miss monitoring value
447 */
HAL_ICACHE_Monitor_GetMissValue(void)448 uint32_t HAL_ICACHE_Monitor_GetMissValue(void)
449 {
450 return (ICACHE->MMONR);
451 }
452
453 /**
454 * @}
455 */
456
457 /** @defgroup ICACHE_Exported_Functions_Group2 IRQ and callback functions
458 * @brief IRQ and callback functions
459 *
460 @verbatim
461 ==============================================================================
462 ##### IRQ and callback functions #####
463 ==============================================================================
464 [..]
465 This section provides functions allowing to handle ICACHE global interrupt
466 and the associated callback functions.
467 @endverbatim
468 * @{
469 */
470
471 /**
472 * @brief Handle the Instruction Cache interrupt request.
473 * @note This function should be called under the ICACHE_IRQHandler().
474 * @note This function respectively disables the interrupt and clears the
475 * flag of any pending flag before calling the associated user callback.
476 * @retval None
477 */
HAL_ICACHE_IRQHandler(void)478 void HAL_ICACHE_IRQHandler(void)
479 {
480 /* Get current interrupt flags and interrupt sources value */
481 uint32_t itflags = READ_REG(ICACHE->SR);
482 uint32_t itsources = READ_REG(ICACHE->IER);
483
484 /* Check Instruction cache Error interrupt flag */
485 if (((itflags & itsources) & ICACHE_FLAG_ERROR) != 0U)
486 {
487 /* Disable error interrupt */
488 CLEAR_BIT(ICACHE->IER, ICACHE_IER_ERRIE);
489
490 /* Clear ERR pending flag */
491 WRITE_REG(ICACHE->FCR, ICACHE_FCR_CERRF);
492
493 /* Instruction cache error interrupt user callback */
494 HAL_ICACHE_ErrorCallback();
495 }
496
497 /* Check Instruction cache BusyEnd interrupt flag */
498 if (((itflags & itsources) & ICACHE_FLAG_BUSYEND) != 0U)
499 {
500 /* Disable end of cache invalidation interrupt */
501 CLEAR_BIT(ICACHE->IER, ICACHE_IER_BSYENDIE);
502
503 /* Clear BSYENDF pending flag */
504 WRITE_REG(ICACHE->FCR, ICACHE_FCR_CBSYENDF);
505
506 /* Instruction cache busyend interrupt user callback */
507 HAL_ICACHE_InvalidateCompleteCallback();
508 }
509 }
510
511 /**
512 * @brief Cache invalidation complete callback.
513 */
HAL_ICACHE_InvalidateCompleteCallback(void)514 __weak void HAL_ICACHE_InvalidateCompleteCallback(void)
515 {
516 /* NOTE : This function should not be modified, when the callback is needed,
517 the HAL_ICACHE_InvalidateCompleteCallback() should be implemented in the user file
518 */
519 }
520
521 /**
522 * @brief Error callback.
523 */
HAL_ICACHE_ErrorCallback(void)524 __weak void HAL_ICACHE_ErrorCallback(void)
525 {
526 /* NOTE : This function should not be modified, when the callback is needed,
527 the HAL_ICACHE_ErrorCallback() should be implemented in the user file
528 */
529 }
530
531 /**
532 * @}
533 */
534
535 /** @defgroup ICACHE_Exported_Functions_Group3 Memory remapped regions functions
536 * @brief Memory remapped regions functions
537 *
538 @verbatim
539 ==============================================================================
540 ##### Memory remapped regions functions #####
541 ==============================================================================
542 [..]
543 This section provides functions allowing to manage the remapping of
544 external memories to internal Code for execution.
545 @endverbatim
546 * @{
547 */
548
549 /**
550 * @brief Configure and enable a region for memory remapping.
551 * @note The Instruction Cache and the region must be disabled.
552 * @param Region Region number
553 This parameter can be a value of @arg @ref ICACHE_Region
554 * @param pRegionConfig Pointer to structure of ICACHE region configuration parameters
555 * @retval HAL status (HAL_OK/HAL_ERROR)
556 */
HAL_ICACHE_EnableRemapRegion(uint32_t Region,const ICACHE_RegionConfigTypeDef * const pRegionConfig)557 HAL_StatusTypeDef HAL_ICACHE_EnableRemapRegion(uint32_t Region, const ICACHE_RegionConfigTypeDef *const pRegionConfig)
558 {
559 HAL_StatusTypeDef status = HAL_OK;
560 __IO uint32_t *p_reg;
561 uint32_t value;
562
563 /* Check the parameters */
564 assert_param(IS_ICACHE_REGION_NUMBER(Region));
565 assert_param(IS_ICACHE_REGION_SIZE(pRegionConfig->Size));
566 assert_param(IS_ICACHE_REGION_TRAFFIC_ROUTE(pRegionConfig->TrafficRoute));
567 assert_param(IS_ICACHE_REGION_OUTPUT_BURST_TYPE(pRegionConfig->OutputBurstType));
568
569 /* Check cache is not enabled */
570 if (READ_BIT(ICACHE->CR, ICACHE_CR_EN) != 0U)
571 {
572 status = HAL_ERROR;
573 }
574 else
575 {
576 /* Get region control register address */
577 p_reg = &(ICACHE->CRR0) + (1U * Region);
578
579 /* Check region is not already enabled */
580 if ((*p_reg & ICACHE_CRRx_REN) != 0U)
581 {
582 status = HAL_ERROR;
583 }
584 else
585 {
586 /* Region 2MB: BaseAddress size 8 bits, RemapAddress size 11 bits */
587 /* Region 4MB: BaseAddress size 7 bits, RemapAddress size 10 bits */
588 /* Region 8MB: BaseAddress size 6 bits, RemapAddress size 9 bits */
589 /* Region 16MB: BaseAddress size 5 bits, RemapAddress size 8 bits */
590 /* Region 32MB: BaseAddress size 4 bits, RemapAddress size 7 bits */
591 /* Region 64MB: BaseAddress size 3 bits, RemapAddress size 6 bits */
592 /* Region 128MB: BaseAddress size 2 bits, RemapAddress size 5 bits */
593 value = ((pRegionConfig->BaseAddress & 0x1FFFFFFFU) >> 21U) & \
594 (0xFFU & ~(pRegionConfig->Size - 1U));
595 value |= ((pRegionConfig->RemapAddress >> 5U) & \
596 ((uint32_t)(0x7FFU & ~(pRegionConfig->Size - 1U)) << ICACHE_CRRx_REMAPADDR_Pos));
597 value |= (pRegionConfig->Size << ICACHE_CRRx_RSIZE_Pos) | pRegionConfig->TrafficRoute | \
598 pRegionConfig->OutputBurstType;
599 *p_reg = (value | ICACHE_CRRx_REN);
600 }
601 }
602
603 return status;
604 }
605
606 /**
607 * @brief Disable the memory remapping for a predefined region.
608 * @param Region Region number
609 This parameter can be a value of @arg @ref ICACHE_Region
610 * @retval HAL status (HAL_OK/HAL_ERROR)
611 */
HAL_ICACHE_DisableRemapRegion(uint32_t Region)612 HAL_StatusTypeDef HAL_ICACHE_DisableRemapRegion(uint32_t Region)
613 {
614 HAL_StatusTypeDef status = HAL_OK;
615 __IO uint32_t *p_reg;
616
617 /* Check the parameters */
618 assert_param(IS_ICACHE_REGION_NUMBER(Region));
619
620 /* Check cache is not enabled */
621 if (READ_BIT(ICACHE->CR, ICACHE_CR_EN) != 0U)
622 {
623 status = HAL_ERROR;
624 }
625 else
626 {
627 /* Get region control register address */
628 p_reg = &(ICACHE->CRR0) + (1U * Region);
629
630 *p_reg &= ~ICACHE_CRRx_REN;
631 }
632
633 return status;
634 }
635
636
637 /**
638 * @}
639 */
640
641 /**
642 * @}
643 */
644
645 #endif /* HAL_ICACHE_MODULE_ENABLED */
646
647 /**
648 * @}
649 */
650
651 /**
652 * @}
653 */
654