hal_fsmc.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. ////////////////////////////////////////////////////////////////////////////////
  2. /// @file hal_fsmc.c
  3. /// @author AE TEAM
  4. /// @brief THIS FILE PROVIDES ALL THE FSMC FIRMWARE FUNCTIONS.
  5. /// Interface with SRAM, PSRAM, NOR memories
  6. /// Interrupts and flags management
  7. ////////////////////////////////////////////////////////////////////////////////
  8. /// @attention
  9. ///
  10. /// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
  11. /// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
  12. /// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
  13. /// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
  14. /// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
  15. /// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
  16. ///
  17. /// <H2><CENTER>&COPY; COPYRIGHT MINDMOTION </CENTER></H2>
  18. ////////////////////////////////////////////////////////////////////////////////
  19. // Define to prevent recursive inclusion
  20. #define _HAL_FSMC_C_
  21. // Files includes
  22. #include "reg_rcc.h"
  23. #include "reg_syscfg.h"
  24. #include "hal_fsmc.h"
  25. ////////////////////////////////////////////////////////////////////////////////
  26. /// @addtogroup MM32_Hardware_Abstract_Layer
  27. /// @{
  28. ////////////////////////////////////////////////////////////////////////////////
  29. /// @addtogroup FSMC_HAL
  30. /// @{
  31. ////////////////////////////////////////////////////////////////////////////////
  32. /// @addtogroup FSMC_Exported_Functions
  33. /// @{
  34. void FSMC_NORSRAMStructInit(FSMC_InitTypeDef* init_struct)
  35. {
  36. init_struct->FSMC_Mode = FSMC_Mode_NorFlash;
  37. init_struct->FSMC_AddrDataMode = FSMC_AddrDataDeMUX;
  38. init_struct->FSMC_TimingRegSelect = FSMC_TimingRegSelect_0;
  39. init_struct->FSMC_MemSize = FSMC_MemSize_64MB;
  40. init_struct->FSMC_MemType = FSMC_MemType_NorSRAM;
  41. }
  42. void FSMC_NORSRAM_BankStructInit(FSMC_NORSRAM_Bank_InitTypeDef* init_struct)
  43. {
  44. init_struct->FSMC_SMReadPipe = 0;
  45. init_struct->FSMC_ReadyMode = 0;
  46. init_struct->FSMC_WritePeriod = 0x2;
  47. init_struct->FSMC_WriteHoldTime = 1;
  48. init_struct->FSMC_AddrSetTime = 3;
  49. init_struct->FSMC_ReadPeriod = 0x1;
  50. init_struct->FSMC_DataWidth = FSMC_DataWidth_16bits;
  51. }
  52. void FSMC_NORSRAMInit(FSMC_InitTypeDef* init_struct)
  53. {
  54. SYSCFG->CFGR &= ~(SYSCFG_CFGR_FSMC_MODE | SYSCFG_CFGR_FSMC_AF_ADDR | SYSCFG_CFGR_FSMC_SYNC_EN);
  55. SYSCFG->CFGR |= (u32)init_struct->FSMC_Mode | \
  56. (u32)init_struct->FSMC_AddrDataMode;
  57. FSMC->SMSKR = (u32)init_struct->FSMC_TimingRegSelect | \
  58. (u32)init_struct->FSMC_MemSize | \
  59. (u32)init_struct->FSMC_MemType;
  60. }
  61. ////////////////////////////////////////////////////////////////////////////////
  62. /// @brief Initialize the FSMC_NORSRAM Timing according to the specified
  63. /// parameters in the FSMC_NORSRAM_TimingTypeDef
  64. /// @param FSMC_Bank_InitStruct: Timing Pointer to NORSRAM Timing structure
  65. /// @param Bank: NORSRAM bank number
  66. /// @retval None.
  67. ////////////////////////////////////////////////////////////////////////////////
  68. void FSMC_NORSRAM_Bank_Init(FSMC_NORSRAM_Bank_InitTypeDef* FSMC_Bank_InitStruct, FSMC_NORSRAM_BANK_TypeDef bank)
  69. {
  70. // Set FSMC_NORSRAM device timing parameters
  71. if(bank == FSMC_NORSRAM_BANK0) {
  72. FSMC->SMTMGR_SET0 = (u32)(FSMC_Bank_InitStruct->FSMC_SMReadPipe << FSMC_SMTMGR_SET_SM_READ_PIPE_Pos) | \
  73. (u32)(FSMC_Bank_InitStruct->FSMC_ReadyMode << FSMC_SMTMGR_SET_READ_MODE_Pos) | \
  74. (u32)(FSMC_Bank_InitStruct->FSMC_WritePeriod << FSMC_SMTMGR_SET_T_WP_Pos) | \
  75. (u32)(FSMC_Bank_InitStruct->FSMC_WriteHoldTime << FSMC_SMTMGR_SET_T_WR_Pos) | \
  76. (u32)(FSMC_Bank_InitStruct->FSMC_AddrSetTime << FSMC_SMTMGR_SET_T_AS_Pos) | \
  77. (u32)(FSMC_Bank_InitStruct->FSMC_ReadPeriod << FSMC_SMTMGR_SET_T_RC_Pos ) ;
  78. FSMC->SMCTLR &= ~FSMC_SMCTLR_SM_DATA_WIDTH_SET0;
  79. FSMC->SMCTLR |= (FSMC_Bank_InitStruct->FSMC_DataWidth) << FSMC_SMCTLR_SM_DATA_WIDTH_SET0_Pos;
  80. }
  81. else if(bank == FSMC_NORSRAM_BANK1) {
  82. FSMC->SMTMGR_SET1 = (u32)(FSMC_Bank_InitStruct->FSMC_SMReadPipe << FSMC_SMTMGR_SET_SM_READ_PIPE_Pos) | \
  83. (u32)(FSMC_Bank_InitStruct->FSMC_ReadyMode << FSMC_SMTMGR_SET_READ_MODE_Pos) | \
  84. (u32)(FSMC_Bank_InitStruct->FSMC_WritePeriod << FSMC_SMTMGR_SET_T_WP_Pos) | \
  85. (u32)(FSMC_Bank_InitStruct->FSMC_WriteHoldTime << FSMC_SMTMGR_SET_T_WR_Pos) | \
  86. (u32)(FSMC_Bank_InitStruct->FSMC_AddrSetTime << FSMC_SMTMGR_SET_T_AS_Pos) | \
  87. (u32)(FSMC_Bank_InitStruct->FSMC_ReadPeriod << FSMC_SMTMGR_SET_T_RC_Pos ) ;
  88. FSMC->SMCTLR &= ~FSMC_SMCTLR_SM_DATA_WIDTH_SET1;
  89. FSMC->SMCTLR |= (FSMC_Bank_InitStruct->FSMC_DataWidth) << FSMC_SMCTLR_SM_DATA_WIDTH_SET1_Pos;
  90. }
  91. else if(bank == FSMC_NORSRAM_BANK2) {
  92. FSMC->SMTMGR_SET2 = (u32)(FSMC_Bank_InitStruct->FSMC_SMReadPipe << FSMC_SMTMGR_SET_SM_READ_PIPE_Pos) | \
  93. (u32)(FSMC_Bank_InitStruct->FSMC_ReadyMode << FSMC_SMTMGR_SET_READ_MODE_Pos) | \
  94. (u32)(FSMC_Bank_InitStruct->FSMC_WritePeriod << FSMC_SMTMGR_SET_T_WP_Pos) | \
  95. (u32)(FSMC_Bank_InitStruct->FSMC_WriteHoldTime << FSMC_SMTMGR_SET_T_WR_Pos) | \
  96. (u32)(FSMC_Bank_InitStruct->FSMC_AddrSetTime << FSMC_SMTMGR_SET_T_AS_Pos) | \
  97. (u32)(FSMC_Bank_InitStruct->FSMC_ReadPeriod << FSMC_SMTMGR_SET_T_RC_Pos ) ;
  98. FSMC->SMCTLR &= ~FSMC_SMCTLR_SM_DATA_WIDTH_SET2;
  99. FSMC->SMCTLR |= (FSMC_Bank_InitStruct->FSMC_DataWidth) << FSMC_SMCTLR_SM_DATA_WIDTH_SET2_Pos;
  100. }
  101. }
  102. /// @}
  103. /// @}
  104. /// @}
  105. ////////////////////////////////////////////////////////////////////////////////
  106. ////////////////////////////////////////////////////////////////////////////////