board.c 9.0 KB

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