board.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2009-01-05 Bernard first implementation
  9. */
  10. #include <rthw.h>
  11. #include <rtthread.h>
  12. #include "board.h"
  13. /**
  14. * @addtogroup STM32
  15. */
  16. /*@{*/
  17. #if STM32_USE_SDIO
  18. /**
  19. * @brief DeInitializes the SDIO interface.
  20. * @param None
  21. * @retval None
  22. */
  23. void SD_LowLevel_DeInit(void)
  24. {
  25. GPIO_InitTypeDef GPIO_InitStructure;
  26. /*!< Disable SDIO Clock */
  27. SDIO_ClockCmd(DISABLE);
  28. /*!< Set Power State to OFF */
  29. SDIO_SetPowerState(SDIO_PowerState_OFF);
  30. /*!< DeInitializes the SDIO peripheral */
  31. SDIO_DeInit();
  32. /* Disable the SDIO APB2 Clock */
  33. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, DISABLE);
  34. GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_MCO);
  35. GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_MCO);
  36. GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_MCO);
  37. GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_MCO);
  38. GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_MCO);
  39. GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_MCO);
  40. /* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */
  41. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  42. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  43. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  44. GPIO_Init(GPIOC, &GPIO_InitStructure);
  45. /* Configure PD.02 CMD line */
  46. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  47. GPIO_Init(GPIOD, &GPIO_InitStructure);
  48. /* Configure PC.12 pin: CLK pin */
  49. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  50. GPIO_Init(GPIOC, &GPIO_InitStructure);
  51. }
  52. /**
  53. * @brief Initializes the SD Card and put it into StandBy State (Ready for
  54. * data transfer).
  55. * @param None
  56. * @retval None
  57. */
  58. void SD_LowLevel_Init(void)
  59. {
  60. GPIO_InitTypeDef GPIO_InitStructure;
  61. /* GPIOC and GPIOD Periph clock enable */
  62. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | SD_DETECT_GPIO_CLK, ENABLE);
  63. GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_SDIO);
  64. GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_SDIO);
  65. GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_SDIO);
  66. GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_SDIO);
  67. GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_SDIO);
  68. GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_SDIO);
  69. /* Configure PC.08, PC.09, PC.10, PC.11 pins: D0, D1, D2, D3 pins */
  70. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
  71. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
  72. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  73. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  74. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  75. GPIO_Init(GPIOC, &GPIO_InitStructure);
  76. /* Configure PD.02 CMD line */
  77. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  78. GPIO_Init(GPIOD, &GPIO_InitStructure);
  79. /* Configure PC.12 pin: CLK pin */
  80. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  81. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  82. GPIO_Init(GPIOC, &GPIO_InitStructure);
  83. /*!< Configure SD_SPI_DETECT_PIN pin: SD Card detect pin */
  84. GPIO_InitStructure.GPIO_Pin = SD_DETECT_PIN;
  85. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  86. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  87. GPIO_Init(SD_DETECT_GPIO_PORT, &GPIO_InitStructure);
  88. /* Enable the SDIO APB2 Clock */
  89. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDIO, ENABLE);
  90. /* Enable the DMA2 Clock */
  91. RCC_AHB1PeriphClockCmd(SD_SDIO_DMA_CLK, ENABLE);
  92. }
  93. /**
  94. * @brief Configures the DMA2 Channel4 for SDIO Tx request.
  95. * @param BufferSRC: pointer to the source buffer
  96. * @param BufferSize: buffer size
  97. * @retval None
  98. */
  99. void SD_LowLevel_DMA_TxConfig(uint32_t *BufferSRC, uint32_t BufferSize)
  100. {
  101. DMA_InitTypeDef SDDMA_InitStructure;
  102. DMA_ClearFlag(SD_SDIO_DMA_STREAM, SD_SDIO_DMA_FLAG_FEIF | SD_SDIO_DMA_FLAG_DMEIF | SD_SDIO_DMA_FLAG_TEIF | SD_SDIO_DMA_FLAG_HTIF | SD_SDIO_DMA_FLAG_TCIF);
  103. /* DMA2 Stream3 or Stream6 disable */
  104. DMA_Cmd(SD_SDIO_DMA_STREAM, DISABLE);
  105. /* DMA2 Stream3 or Stream6 Config */
  106. DMA_DeInit(SD_SDIO_DMA_STREAM);
  107. SDDMA_InitStructure.DMA_Channel = SD_SDIO_DMA_CHANNEL;
  108. SDDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_ADDRESS;
  109. SDDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)BufferSRC;
  110. SDDMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  111. SDDMA_InitStructure.DMA_BufferSize = 0;
  112. SDDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  113. SDDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  114. SDDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  115. SDDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  116. SDDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  117. SDDMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  118. SDDMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
  119. SDDMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  120. SDDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC4;
  121. SDDMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_INC4;
  122. DMA_Init(SD_SDIO_DMA_STREAM, &SDDMA_InitStructure);
  123. DMA_FlowControllerConfig(SD_SDIO_DMA_STREAM, DMA_FlowCtrl_Peripheral);
  124. /* DMA2 Stream3 or Stream6 enable */
  125. DMA_Cmd(SD_SDIO_DMA_STREAM, ENABLE);
  126. }
  127. /**
  128. * @brief Configures the DMA2 Channel4 for SDIO Rx request.
  129. * @param BufferDST: pointer to the destination buffer
  130. * @param BufferSize: buffer size
  131. * @retval None
  132. */
  133. void SD_LowLevel_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize)
  134. {
  135. DMA_InitTypeDef SDDMA_InitStructure;
  136. DMA_ClearFlag(SD_SDIO_DMA_STREAM, SD_SDIO_DMA_FLAG_FEIF | SD_SDIO_DMA_FLAG_DMEIF | SD_SDIO_DMA_FLAG_TEIF | SD_SDIO_DMA_FLAG_HTIF | SD_SDIO_DMA_FLAG_TCIF);
  137. /* DMA2 Stream3 or Stream6 disable */
  138. DMA_Cmd(SD_SDIO_DMA_STREAM, DISABLE);
  139. /* DMA2 Stream3 or Stream6 Config */
  140. DMA_DeInit(SD_SDIO_DMA_STREAM);
  141. SDDMA_InitStructure.DMA_Channel = SD_SDIO_DMA_CHANNEL;
  142. SDDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_ADDRESS;
  143. SDDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)BufferDST;
  144. SDDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  145. SDDMA_InitStructure.DMA_BufferSize = 0;
  146. SDDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  147. SDDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  148. SDDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  149. SDDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  150. SDDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  151. SDDMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
  152. SDDMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
  153. SDDMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  154. SDDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC4;
  155. SDDMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_INC4;
  156. DMA_Init(SD_SDIO_DMA_STREAM, &SDDMA_InitStructure);
  157. DMA_FlowControllerConfig(SD_SDIO_DMA_STREAM, DMA_FlowCtrl_Peripheral);
  158. /* DMA2 Stream3 or Stream6 enable */
  159. DMA_Cmd(SD_SDIO_DMA_STREAM, ENABLE);
  160. }
  161. /**
  162. * @brief Returns the DMA End Of Transfer Status.
  163. * @param None
  164. * @retval DMA SDIO Stream Status.
  165. */
  166. uint32_t SD_DMAEndOfTransferStatus(void)
  167. {
  168. return (uint32_t)DMA_GetFlagStatus(SD_SDIO_DMA_STREAM, SD_SDIO_DMA_FLAG_TCIF);
  169. }
  170. #endif
  171. /*******************************************************************************
  172. * Function Name : NVIC_Configuration
  173. * Description : Configures Vector Table base location.
  174. * Input : None
  175. * Output : None
  176. * Return : None
  177. *******************************************************************************/
  178. void NVIC_Configuration(void)
  179. {
  180. #ifdef VECT_TAB_RAM
  181. /* Set the Vector Table base location at 0x20000000 */
  182. NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  183. #else /* VECT_TAB_FLASH */
  184. /* Set the Vector Table base location at 0x08000000 */
  185. NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
  186. #endif
  187. }
  188. /*******************************************************************************
  189. * Function Name : SysTick_Configuration
  190. * Description : Configures the SysTick for OS tick.
  191. * Input : None
  192. * Output : None
  193. * Return : None
  194. *******************************************************************************/
  195. void SysTick_Configuration(void)
  196. {
  197. RCC_ClocksTypeDef rcc_clocks;
  198. rt_uint32_t cnts;
  199. RCC_GetClocksFreq(&rcc_clocks);
  200. cnts = (rt_uint32_t)rcc_clocks.HCLK_Frequency / RT_TICK_PER_SECOND;
  201. SysTick_Config(cnts);
  202. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
  203. }
  204. /**
  205. * This is the timer interrupt service routine.
  206. *
  207. */
  208. void SysTick_Handler(void)
  209. {
  210. /* enter interrupt */
  211. rt_interrupt_enter();
  212. rt_tick_increase();
  213. /* leave interrupt */
  214. rt_interrupt_leave();
  215. }
  216. /**
  217. * This function will initial STM32 board.
  218. */
  219. void rt_hw_board_init()
  220. {
  221. /* NVIC Configuration */
  222. NVIC_Configuration();
  223. /* Configure the SysTick */
  224. SysTick_Configuration();
  225. rt_hw_usart_init();
  226. #ifdef RT_USING_CONSOLE
  227. rt_console_set_device(CONSOLE_DEVICE);
  228. #endif
  229. }
  230. /*@}*/