2
2
******************************************************************************
3
3
* @file system_stm32f4xx.c
4
4
* @author MCD Application Team
5
- * @version V2.3 .2
6
- * @date 26-June -2015
5
+ * @version V2.4 .2
6
+ * @date 13-November -2015
7
7
* @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File.
8
8
*
9
9
* This file provides two functions and one global variable to be called from
106
106
107
107
/************************* Miscellaneous Configuration ************************/
108
108
/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */
109
- #if defined(STM32F405xx ) || defined(STM32F415xx ) || defined(STM32F407xx ) || defined(STM32F417xx ) || \
110
- defined(STM32F427xx ) || defined(STM32F437xx ) || defined(STM32F429xx ) || defined(STM32F439xx )
109
+ #if defined(STM32F405xx ) || defined(STM32F415xx ) || defined(STM32F407xx ) || defined(STM32F417xx )\
110
+ || defined(STM32F427xx ) || defined(STM32F437xx ) || defined(STM32F429xx ) || defined(STM32F439xx )\
111
+ || defined(STM32F469xx ) || defined(STM32F479xx )
111
112
/* #define DATA_IN_ExtSRAM */
112
- #endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx */
113
+ #endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx */
113
114
114
- #if defined(STM32F427xx ) || defined(STM32F437xx ) || defined(STM32F429xx ) || defined(STM32F439xx ) || \
115
- defined(STM32F446xx )
115
+ #if defined(STM32F427xx ) || defined(STM32F437xx ) || defined(STM32F429xx ) || defined(STM32F439xx )\
116
+ || defined( STM32F446xx ) || defined(STM32F469xx ) || defined( STM32F479xx )
116
117
/* #define DATA_IN_ExtSDRAM */
117
- #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx */
118
-
119
- #if defined(DATA_IN_ExtSRAM ) && defined(DATA_IN_ExtSDRAM )
120
- #error "Please select DATA_IN_ExtSRAM or DATA_IN_ExtSDRAM "
121
- #endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */
118
+ #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\
119
+ STM32F479xx */
122
120
123
121
/*!< Uncomment the following line if you need to relocate your vector Table in
124
122
Internal SRAM. */
@@ -327,7 +325,9 @@ void SystemCoreClockUpdate(void)
327
325
SystemCoreClock >>= tmp ;
328
326
}
329
327
330
- #if defined (DATA_IN_ExtSRAM ) || defined (DATA_IN_ExtSDRAM )
328
+ #if defined (DATA_IN_ExtSRAM ) && defined (DATA_IN_ExtSDRAM )
329
+ #if defined(STM32F427xx ) || defined(STM32F437xx ) || defined(STM32F429xx ) || defined(STM32F439xx ) || \
330
+ defined(STM32F469xx ) || defined(STM32F479xx )
331
331
/**
332
332
* @brief Setup the external memory controller.
333
333
* Called in startup_stm32f4xx.s before jump to main.
@@ -339,7 +339,171 @@ void SystemCoreClockUpdate(void)
339
339
void SystemInit_ExtMemCtl (void )
340
340
{
341
341
__IO uint32_t tmp = 0x00 ;
342
- #if defined(STM32F427xx ) || defined(STM32F437xx ) || defined(STM32F429xx ) || defined(STM32F439xx ) || defined(STM32F446xx )
342
+
343
+ register uint32_t tmpreg = 0 , timeout = 0xFFFF ;
344
+ register uint32_t index ;
345
+
346
+ /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */
347
+ RCC -> AHB1ENR |= 0x000001F8 ;
348
+
349
+ /* Delay after an RCC peripheral clock enabling */
350
+ tmp = READ_BIT (RCC -> AHB1ENR , RCC_AHB1ENR_GPIOCEN );
351
+
352
+ /* Connect PDx pins to FMC Alternate function */
353
+ GPIOD -> AFR [0 ] = 0x00CCC0CC ;
354
+ GPIOD -> AFR [1 ] = 0xCCCCCCCC ;
355
+ /* Configure PDx pins in Alternate function mode */
356
+ GPIOD -> MODER = 0xAAAA0A8A ;
357
+ /* Configure PDx pins speed to 100 MHz */
358
+ GPIOD -> OSPEEDR = 0xFFFF0FCF ;
359
+ /* Configure PDx pins Output type to push-pull */
360
+ GPIOD -> OTYPER = 0x00000000 ;
361
+ /* No pull-up, pull-down for PDx pins */
362
+ GPIOD -> PUPDR = 0x00000000 ;
363
+
364
+ /* Connect PEx pins to FMC Alternate function */
365
+ GPIOE -> AFR [0 ] = 0xC00CC0CC ;
366
+ GPIOE -> AFR [1 ] = 0xCCCCCCCC ;
367
+ /* Configure PEx pins in Alternate function mode */
368
+ GPIOE -> MODER = 0xAAAA828A ;
369
+ /* Configure PEx pins speed to 100 MHz */
370
+ GPIOE -> OSPEEDR = 0xFFFFC3CF ;
371
+ /* Configure PEx pins Output type to push-pull */
372
+ GPIOE -> OTYPER = 0x00000000 ;
373
+ /* No pull-up, pull-down for PEx pins */
374
+ GPIOE -> PUPDR = 0x00000000 ;
375
+
376
+ /* Connect PFx pins to FMC Alternate function */
377
+ GPIOF -> AFR [0 ] = 0xCCCCCCCC ;
378
+ GPIOF -> AFR [1 ] = 0xCCCCCCCC ;
379
+ /* Configure PFx pins in Alternate function mode */
380
+ GPIOF -> MODER = 0xAA800AAA ;
381
+ /* Configure PFx pins speed to 50 MHz */
382
+ GPIOF -> OSPEEDR = 0xAA800AAA ;
383
+ /* Configure PFx pins Output type to push-pull */
384
+ GPIOF -> OTYPER = 0x00000000 ;
385
+ /* No pull-up, pull-down for PFx pins */
386
+ GPIOF -> PUPDR = 0x00000000 ;
387
+
388
+ /* Connect PGx pins to FMC Alternate function */
389
+ GPIOG -> AFR [0 ] = 0xCCCCCCCC ;
390
+ GPIOG -> AFR [1 ] = 0xCCCCCCCC ;
391
+ /* Configure PGx pins in Alternate function mode */
392
+ GPIOG -> MODER = 0xAAAAAAAA ;
393
+ /* Configure PGx pins speed to 50 MHz */
394
+ GPIOG -> OSPEEDR = 0xAAAAAAAA ;
395
+ /* Configure PGx pins Output type to push-pull */
396
+ GPIOG -> OTYPER = 0x00000000 ;
397
+ /* No pull-up, pull-down for PGx pins */
398
+ GPIOG -> PUPDR = 0x00000000 ;
399
+
400
+ /* Connect PHx pins to FMC Alternate function */
401
+ GPIOH -> AFR [0 ] = 0x00C0CC00 ;
402
+ GPIOH -> AFR [1 ] = 0xCCCCCCCC ;
403
+ /* Configure PHx pins in Alternate function mode */
404
+ GPIOH -> MODER = 0xAAAA08A0 ;
405
+ /* Configure PHx pins speed to 50 MHz */
406
+ GPIOH -> OSPEEDR = 0xAAAA08A0 ;
407
+ /* Configure PHx pins Output type to push-pull */
408
+ GPIOH -> OTYPER = 0x00000000 ;
409
+ /* No pull-up, pull-down for PHx pins */
410
+ GPIOH -> PUPDR = 0x00000000 ;
411
+
412
+ /* Connect PIx pins to FMC Alternate function */
413
+ GPIOI -> AFR [0 ] = 0xCCCCCCCC ;
414
+ GPIOI -> AFR [1 ] = 0x00000CC0 ;
415
+ /* Configure PIx pins in Alternate function mode */
416
+ GPIOI -> MODER = 0x0028AAAA ;
417
+ /* Configure PIx pins speed to 50 MHz */
418
+ GPIOI -> OSPEEDR = 0x0028AAAA ;
419
+ /* Configure PIx pins Output type to push-pull */
420
+ GPIOI -> OTYPER = 0x00000000 ;
421
+ /* No pull-up, pull-down for PIx pins */
422
+ GPIOI -> PUPDR = 0x00000000 ;
423
+
424
+ /*-- FMC Configuration -------------------------------------------------------*/
425
+ /* Enable the FMC interface clock */
426
+ RCC -> AHB3ENR |= 0x00000001 ;
427
+ /* Delay after an RCC peripheral clock enabling */
428
+ tmp = READ_BIT (RCC -> AHB3ENR , RCC_AHB3ENR_FMCEN );
429
+
430
+ FMC_Bank5_6 -> SDCR [0 ] = 0x000019E4 ;
431
+ FMC_Bank5_6 -> SDTR [0 ] = 0x01115351 ;
432
+
433
+ /* SDRAM initialization sequence */
434
+ /* Clock enable command */
435
+ FMC_Bank5_6 -> SDCMR = 0x00000011 ;
436
+ tmpreg = FMC_Bank5_6 -> SDSR & 0x00000020 ;
437
+ while ((tmpreg != 0 ) && (timeout -- > 0 ))
438
+ {
439
+ tmpreg = FMC_Bank5_6 -> SDSR & 0x00000020 ;
440
+ }
441
+
442
+ /* Delay */
443
+ for (index = 0 ; index < 1000 ; index ++ );
444
+
445
+ /* PALL command */
446
+ FMC_Bank5_6 -> SDCMR = 0x00000012 ;
447
+ timeout = 0xFFFF ;
448
+ while ((tmpreg != 0 ) && (timeout -- > 0 ))
449
+ {
450
+ tmpreg = FMC_Bank5_6 -> SDSR & 0x00000020 ;
451
+ }
452
+
453
+ /* Auto refresh command */
454
+ FMC_Bank5_6 -> SDCMR = 0x00000073 ;
455
+ timeout = 0xFFFF ;
456
+ while ((tmpreg != 0 ) && (timeout -- > 0 ))
457
+ {
458
+ tmpreg = FMC_Bank5_6 -> SDSR & 0x00000020 ;
459
+ }
460
+
461
+ /* MRD register program */
462
+ FMC_Bank5_6 -> SDCMR = 0x00046014 ;
463
+ timeout = 0xFFFF ;
464
+ while ((tmpreg != 0 ) && (timeout -- > 0 ))
465
+ {
466
+ tmpreg = FMC_Bank5_6 -> SDSR & 0x00000020 ;
467
+ }
468
+
469
+ /* Set refresh count */
470
+ tmpreg = FMC_Bank5_6 -> SDRTR ;
471
+ FMC_Bank5_6 -> SDRTR = (tmpreg | (0x0000027C <<1 ));
472
+
473
+ /* Disable write protection */
474
+ tmpreg = FMC_Bank5_6 -> SDCR [0 ];
475
+ FMC_Bank5_6 -> SDCR [0 ] = (tmpreg & 0xFFFFFDFF );
476
+
477
+ #if defined(STM32F427xx ) || defined(STM32F437xx ) || defined(STM32F429xx ) || defined(STM32F439xx )
478
+ /* Configure and enable Bank1_SRAM2 */
479
+ FMC_Bank1 -> BTCR [2 ] = 0x00001011 ;
480
+ FMC_Bank1 -> BTCR [3 ] = 0x00000201 ;
481
+ FMC_Bank1E -> BWTR [2 ] = 0x0fffffff ;
482
+ #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
483
+ #if defined(STM32F469xx ) || defined(STM32F479xx )
484
+ /* Configure and enable Bank1_SRAM2 */
485
+ FMC_Bank1 -> BTCR [2 ] = 0x00001091 ;
486
+ FMC_Bank1 -> BTCR [3 ] = 0x00110212 ;
487
+ FMC_Bank1E -> BWTR [2 ] = 0x0fffffff ;
488
+ #endif /* STM32F469xx || STM32F479xx */
489
+
490
+ (void )(tmp );
491
+ }
492
+ #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */
493
+ #elif defined (DATA_IN_ExtSRAM ) || defined (DATA_IN_ExtSDRAM )
494
+ /**
495
+ * @brief Setup the external memory controller.
496
+ * Called in startup_stm32f4xx.s before jump to main.
497
+ * This function configures the external memories (SRAM/SDRAM)
498
+ * This SRAM/SDRAM will be used as program data memory (including heap and stack).
499
+ * @param None
500
+ * @retval None
501
+ */
502
+ void SystemInit_ExtMemCtl (void )
503
+ {
504
+ __IO uint32_t tmp = 0x00 ;
505
+ #if defined(STM32F427xx ) || defined(STM32F437xx ) || defined(STM32F429xx ) || defined(STM32F439xx )\
506
+ || defined(STM32F446xx ) || defined(STM32F469xx ) || defined(STM32F479xx )
343
507
#if defined (DATA_IN_ExtSDRAM )
344
508
register uint32_t tmpreg = 0 , timeout = 0xFFFF ;
345
509
register uint32_t index ;
@@ -430,7 +594,8 @@ void SystemInit_ExtMemCtl(void)
430
594
/* No pull-up, pull-down for PGx pins */
431
595
GPIOG -> PUPDR = 0x00000000 ;
432
596
433
- #if defined(STM32F427xx ) || defined(STM32F437xx ) || defined(STM32F429xx ) || defined(STM32F439xx )
597
+ #if defined(STM32F427xx ) || defined(STM32F437xx ) || defined(STM32F429xx ) || defined(STM32F439xx )\
598
+ || defined(STM32F469xx ) || defined(STM32F479xx )
434
599
/* Connect PHx pins to FMC Alternate function */
435
600
GPIOH -> AFR [0 ] = 0x00C0CC00 ;
436
601
GPIOH -> AFR [1 ] = 0xCCCCCCCC ;
@@ -454,7 +619,7 @@ void SystemInit_ExtMemCtl(void)
454
619
GPIOI -> OTYPER = 0x00000000 ;
455
620
/* No pull-up, pull-down for PIx pins */
456
621
GPIOI -> PUPDR = 0x00000000 ;
457
- #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
622
+ #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */
458
623
459
624
/*-- FMC Configuration -------------------------------------------------------*/
460
625
/* Enable the FMC interface clock */
@@ -526,10 +691,11 @@ void SystemInit_ExtMemCtl(void)
526
691
tmpreg = FMC_Bank5_6 -> SDCR [0 ];
527
692
FMC_Bank5_6 -> SDCR [0 ] = (tmpreg & 0xFFFFFDFF );
528
693
#endif /* DATA_IN_ExtSDRAM */
529
- #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx */
694
+ #endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */
530
695
531
- #if defined(STM32F405xx ) || defined(STM32F415xx ) || defined(STM32F407xx ) || defined(STM32F417xx ) || \
532
- defined(STM32F427xx ) || defined(STM32F437xx ) || defined(STM32F429xx ) || defined(STM32F439xx )
696
+ #if defined(STM32F405xx ) || defined(STM32F415xx ) || defined(STM32F407xx ) || defined(STM32F417xx )\
697
+ || defined(STM32F427xx ) || defined(STM32F437xx ) || defined(STM32F429xx ) || defined(STM32F439xx )\
698
+ || defined(STM32F469xx ) || defined(STM32F479xx )
533
699
534
700
#if defined(DATA_IN_ExtSRAM )
535
701
/*-- GPIOs Configuration -----------------------------------------------------*/
@@ -590,15 +756,22 @@ void SystemInit_ExtMemCtl(void)
590
756
/* Enable the FMC/FSMC interface clock */
591
757
RCC -> AHB3ENR |= 0x00000001 ;
592
758
593
- #if defined(STM32F427xx ) || defined(STM32F437xx ) || defined(STM32F429xx )|| defined(STM32F439xx )
759
+ #if defined(STM32F427xx ) || defined(STM32F437xx ) || defined(STM32F429xx ) || defined(STM32F439xx )
594
760
/* Delay after an RCC peripheral clock enabling */
595
761
tmp = READ_BIT (RCC -> AHB3ENR , RCC_AHB3ENR_FMCEN );
596
762
/* Configure and enable Bank1_SRAM2 */
597
763
FMC_Bank1 -> BTCR [2 ] = 0x00001011 ;
598
764
FMC_Bank1 -> BTCR [3 ] = 0x00000201 ;
599
765
FMC_Bank1E -> BWTR [2 ] = 0x0fffffff ;
600
766
#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
601
-
767
+ #if defined(STM32F469xx ) || defined(STM32F479xx )
768
+ /* Delay after an RCC peripheral clock enabling */
769
+ tmp = READ_BIT (RCC -> AHB3ENR , RCC_AHB3ENR_FMCEN );
770
+ /* Configure and enable Bank1_SRAM2 */
771
+ FMC_Bank1 -> BTCR [2 ] = 0x00001091 ;
772
+ FMC_Bank1 -> BTCR [3 ] = 0x00110212 ;
773
+ FMC_Bank1E -> BWTR [2 ] = 0x0fffffff ;
774
+ #endif /* STM32F469xx || STM32F479xx */
602
775
#if defined(STM32F405xx ) || defined(STM32F415xx ) || defined(STM32F407xx )|| defined(STM32F417xx )
603
776
/* Delay after an RCC peripheral clock enabling */
604
777
tmp = READ_BIT (RCC -> AHB3ENR , RCC_AHB3ENR_FSMCEN );
@@ -609,10 +782,11 @@ void SystemInit_ExtMemCtl(void)
609
782
#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */
610
783
611
784
#endif /* DATA_IN_ExtSRAM */
612
- #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
785
+ #endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\
786
+ STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */
613
787
(void )(tmp );
614
788
}
615
- #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
789
+ #endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */
616
790
617
791
/**
618
792
* @brief Configures the System clock source, PLL Multiplier and Divider factors,
0 commit comments