/DeviceCode/Targets/Native/STM32F4/DeviceCode/STM32F4_Bootstrap/STM32F4_bootstrap.cpp

https://github.com/NETMF/netmf-interpreter · C++ · 303 lines · 234 code · 41 blank · 28 comment · 41 complexity · f2ca5f202ccf9cbba4b60cc8471561b4 MD5 · raw file

  1. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
  6. //
  7. // Copyright (c) Microsoft Corporation. All rights reserved.
  8. // Implementation for STM32F4: Copyright (c) Oberon microsystems, Inc.
  9. //
  10. // *** Bootstrap ***
  11. //
  12. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  13. #include <tinyhal.h>
  14. #ifdef STM32F4XX
  15. #include "..\stm32f4xx.h"
  16. #else
  17. #include "..\stm32f2xx.h"
  18. #endif
  19. #ifndef FLASH
  20. #define FLASH ((FLASH_TypeDef *) FLASH_R_BASE)
  21. #endif
  22. ///////////////////////////////////////////////////////////////////////////////
  23. /* STM32F4 clock configuration */
  24. #if SYSTEM_CRYSTAL_CLOCK_HZ % ONE_MHZ != 0
  25. #error SYSTEM_CRYSTAL_CLOCK_HZ must be a multiple of 1MHz
  26. #endif
  27. #if SYSTEM_CRYSTAL_CLOCK_HZ != 0
  28. #define RCC_PLLCFGR_PLLM_BITS (SYSTEM_CRYSTAL_CLOCK_HZ / ONE_MHZ * RCC_PLLCFGR_PLLM_0)
  29. #define RCC_PLLCFGR_PLLS_BITS (RCC_PLLCFGR_PLLSRC_HSE)
  30. #else // 16MHz internal oscillator
  31. #define RCC_PLLCFGR_PLLM_BITS (16 * RCC_PLLCFGR_PLLM_0)
  32. #define RCC_PLLCFGR_PLLS_BITS (RCC_PLLCFGR_PLLSRC_HSI)
  33. #endif
  34. #if (SYSTEM_CLOCK_HZ * 2 >= 192000000)\
  35. && (SYSTEM_CLOCK_HZ * 2 <= 432000000)\
  36. && (SYSTEM_CLOCK_HZ * 2 % 48000000 == 0)
  37. #define RCC_PLLCFGR_PLLN_BITS (SYSTEM_CLOCK_HZ * 2 / ONE_MHZ * RCC_PLLCFGR_PLLN_0)
  38. #define RCC_PLLCFGR_PLLP_BITS (0) // P = 2
  39. #define RCC_PLLCFGR_PLLQ_BITS (SYSTEM_CLOCK_HZ * 2 / 48000000 * RCC_PLLCFGR_PLLQ_0)
  40. #elif (SYSTEM_CLOCK_HZ * 4 >= 192000000)\
  41. && (SYSTEM_CLOCK_HZ * 4 <= 432000000)\
  42. && (SYSTEM_CLOCK_HZ * 4 % 48000000 == 0)
  43. #define RCC_PLLCFGR_PLLN_BITS (SYSTEM_CLOCK_HZ * 4 / ONE_MHZ * RCC_PLLCFGR_PLLN_0)
  44. #define RCC_PLLCFGR_PLLP_BITS (RCC_PLLCFGR_PLLP_0) // P = 4
  45. #define RCC_PLLCFGR_PLLQ_BITS (SYSTEM_CLOCK_HZ * 4 / 48000000 * RCC_PLLCFGR_PLLQ_0)
  46. #elif (SYSTEM_CLOCK_HZ * 6 >= 192000000)\
  47. && (SYSTEM_CLOCK_HZ * 6 <= 432000000)\
  48. && (SYSTEM_CLOCK_HZ * 6 % 48000000 == 0)
  49. #define RCC_PLLCFGR_PLLN_BITS (SYSTEM_CLOCK_HZ * 6 / ONE_MHZ * RCC_PLLCFGR_PLLN_0)
  50. #define RCC_PLLCFGR_PLLP_BITS (RCC_PLLCFGR_PLLP_1) // P = 6
  51. #define RCC_PLLCFGR_PLLQ_BITS (SYSTEM_CLOCK_HZ * 6 / 48000000 * RCC_PLLCFGR_PLLQ_0)
  52. #elif (SYSTEM_CLOCK_HZ * 8 >= 192000000)\
  53. && (SYSTEM_CLOCK_HZ * 8 <= 432000000)\
  54. && (SYSTEM_CLOCK_HZ * 8 % 48000000 == 0)
  55. #define RCC_PLLCFGR_PLLN_BITS (SYSTEM_CLOCK_HZ * 8 / ONE_MHZ * RCC_PLLCFGR_PLLN_0)
  56. #define RCC_PLLCFGR_PLLP_BITS (RCC_PLLCFGR_PLLP_0 | RCC_PLLCFGR_PLLP_1) // P = 8
  57. #define RCC_PLLCFGR_PLLQ_BITS (SYSTEM_CLOCK_HZ * 8 / 48000000 * RCC_PLLCFGR_PLLQ_0)
  58. #else
  59. #error illegal SYSTEM_CLOCK_HZ frequency
  60. #endif
  61. #define RCC_PLLCFGR_PLL_BITS (RCC_PLLCFGR_PLLM_BITS \
  62. | RCC_PLLCFGR_PLLN_BITS \
  63. | RCC_PLLCFGR_PLLP_BITS \
  64. | RCC_PLLCFGR_PLLQ_BITS \
  65. | RCC_PLLCFGR_PLLS_BITS)
  66. #if SYSTEM_CLOCK_HZ == SYSTEM_CYCLE_CLOCK_HZ * 1
  67. #define RCC_CFGR_HPRE_DIV_BITS RCC_CFGR_HPRE_DIV1
  68. #elif SYSTEM_CLOCK_HZ == SYSTEM_CYCLE_CLOCK_HZ * 2
  69. #define RCC_CFGR_HPRE_DIV_BITS RCC_CFGR_HPRE_DIV2
  70. #elif SYSTEM_CLOCK_HZ == SYSTEM_CYCLE_CLOCK_HZ * 4
  71. #define RCC_CFGR_HPRE_DIV_BITS RCC_CFGR_HPRE_DIV4
  72. #elif SYSTEM_CLOCK_HZ == SYSTEM_CYCLE_CLOCK_HZ * 8
  73. #define RCC_CFGR_HPRE_DIV_BITS RCC_CFGR_HPRE_DIV8
  74. #elif SYSTEM_CLOCK_HZ == SYSTEM_CYCLE_CLOCK_HZ * 16
  75. #define RCC_CFGR_HPRE_DIV_BITS RCC_CFGR_HPRE_DIV16
  76. #elif SYSTEM_CLOCK_HZ == SYSTEM_CYCLE_CLOCK_HZ * 64
  77. #define RCC_CFGR_HPRE_DIV_BITS RCC_CFGR_HPRE_DIV64
  78. #elif SYSTEM_CLOCK_HZ == SYSTEM_CYCLE_CLOCK_HZ * 128
  79. #define RCC_CFGR_HPRE_DIV_BITS RCC_CFGR_HPRE_DIV128
  80. #elif SYSTEM_CLOCK_HZ == SYSTEM_CYCLE_CLOCK_HZ * 256
  81. #define RCC_CFGR_HPRE_DIV_BITS RCC_CFGR_HPRE_DIV256
  82. #elif SYSTEM_CLOCK_HZ == SYSTEM_CYCLE_CLOCK_HZ * 512
  83. #define RCC_CFGR_HPRE_DIV_BITS RCC_CFGR_HPRE_DIV512
  84. #else
  85. #error SYSTEM_CLOCK_HZ must be SYSTEM_CYCLE_CLOCK_HZ * 1, 2, 4, 8, .. 256, or 512
  86. #endif
  87. #if SYSTEM_CYCLE_CLOCK_HZ == SYSTEM_APB1_CLOCK_HZ * 1
  88. #define RCC_CFGR_PPRE1_DIV_BITS RCC_CFGR_PPRE1_DIV1
  89. #elif SYSTEM_CYCLE_CLOCK_HZ == SYSTEM_APB1_CLOCK_HZ * 2
  90. #define RCC_CFGR_PPRE1_DIV_BITS RCC_CFGR_PPRE1_DIV2
  91. #elif SYSTEM_CYCLE_CLOCK_HZ == SYSTEM_APB1_CLOCK_HZ * 4
  92. #define RCC_CFGR_PPRE1_DIV_BITS RCC_CFGR_PPRE1_DIV4
  93. #elif SYSTEM_CYCLE_CLOCK_HZ == SYSTEM_APB1_CLOCK_HZ * 8
  94. #define RCC_CFGR_PPRE1_DIV_BITS RCC_CFGR_PPRE1_DIV8
  95. #elif SYSTEM_CYCLE_CLOCK_HZ == SYSTEM_APB1_CLOCK_HZ * 16
  96. #define RCC_CFGR_PPRE1_DIV_BITS RCC_CFGR_PPRE1_DIV16
  97. #else
  98. #error SYSTEM_CYCLE_CLOCK_HZ must be SYSTEM_APB1_CLOCK_HZ * 1, 2, 4, 8, or 16
  99. #endif
  100. #if SYSTEM_CYCLE_CLOCK_HZ == SYSTEM_APB2_CLOCK_HZ * 1
  101. #define RCC_CFGR_PPRE2_DIV_BITS RCC_CFGR_PPRE2_DIV1
  102. #elif SYSTEM_CYCLE_CLOCK_HZ == SYSTEM_APB2_CLOCK_HZ * 2
  103. #define RCC_CFGR_PPRE2_DIV_BITS RCC_CFGR_PPRE2_DIV2
  104. #elif SYSTEM_CYCLE_CLOCK_HZ == SYSTEM_APB2_CLOCK_HZ * 4
  105. #define RCC_CFGR_PPRE2_DIV_BITS RCC_CFGR_PPRE2_DIV4
  106. #elif SYSTEM_CYCLE_CLOCK_HZ == SYSTEM_APB2_CLOCK_HZ * 8
  107. #define RCC_CFGR_PPRE2_DIV_BITS RCC_CFGR_PPRE2_DIV8
  108. #elif SYSTEM_CYCLE_CLOCK_HZ == SYSTEM_APB2_CLOCK_HZ * 16
  109. #define RCC_CFGR_PPRE2_DIV_BITS RCC_CFGR_PPRE2_DIV16
  110. #else
  111. #error SYSTEM_CYCLE_CLOCK_HZ must be SYSTEM_APB2_CLOCK_HZ * 1, 2, 4, 8, or 16
  112. #endif
  113. #if SUPPLY_VOLTAGE_MV < 2100
  114. #if SYSTEM_CYCLE_CLOCK_HZ <= 20000000
  115. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_0WS // no wait states
  116. #elif SYSTEM_CYCLE_CLOCK_HZ <= 40000000
  117. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_1WS // 1 wait state
  118. #elif SYSTEM_CYCLE_CLOCK_HZ <= 60000000
  119. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_2WS // 2 wait states
  120. #elif SYSTEM_CYCLE_CLOCK_HZ <= 80000000
  121. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_3WS // 3 wait states
  122. #elif SYSTEM_CYCLE_CLOCK_HZ <= 100000000
  123. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_4WS // 4 wait states
  124. #elif SYSTEM_CYCLE_CLOCK_HZ <= 120000000
  125. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_5WS // 5 wait states
  126. #elif SYSTEM_CYCLE_CLOCK_HZ <= 140000000
  127. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_6WS // 6 wait states
  128. #elif SYSTEM_CYCLE_CLOCK_HZ <= 160000000
  129. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_7WS // 7 wait states
  130. #else
  131. #error SYSTEM_CYCLE_CLOCK_HZ must be <= 160MHz at < 2.1V
  132. #endif
  133. #elif SUPPLY_VOLTAGE_MV < 2400
  134. #if SYSTEM_CYCLE_CLOCK_HZ <= 22000000
  135. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_0WS // no wait states
  136. #elif SYSTEM_CYCLE_CLOCK_HZ <= 44000000
  137. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_1WS // 1 wait state
  138. #elif SYSTEM_CYCLE_CLOCK_HZ <= 66000000
  139. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_2WS // 2 wait states
  140. #elif SYSTEM_CYCLE_CLOCK_HZ <= 88000000
  141. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_3WS // 3 wait states
  142. #elif SYSTEM_CYCLE_CLOCK_HZ <= 110000000
  143. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_4WS // 4 wait states
  144. #elif SYSTEM_CYCLE_CLOCK_HZ <= 1328000000
  145. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_5WS // 5 wait states
  146. #elif SYSTEM_CYCLE_CLOCK_HZ <= 154000000
  147. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_6WS // 6 wait states
  148. #elif SYSTEM_CYCLE_CLOCK_HZ <= 176000000
  149. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_7WS // 7 wait states
  150. #else
  151. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_8WS // 8 wait states
  152. #endif
  153. #elif SUPPLY_VOLTAGE_MV < 2700
  154. #if SYSTEM_CYCLE_CLOCK_HZ <= 24000000
  155. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_0WS // no wait states
  156. #elif SYSTEM_CYCLE_CLOCK_HZ <= 48000000
  157. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_1WS // 1 wait state
  158. #elif SYSTEM_CYCLE_CLOCK_HZ <= 72000000
  159. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_2WS // 2 wait states
  160. #elif SYSTEM_CYCLE_CLOCK_HZ <= 96000000
  161. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_3WS // 3 wait states
  162. #elif SYSTEM_CYCLE_CLOCK_HZ <= 120000000
  163. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_4WS // 4 wait states
  164. #elif SYSTEM_CYCLE_CLOCK_HZ <= 144000000
  165. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_5WS // 5 wait states
  166. #elif SYSTEM_CYCLE_CLOCK_HZ <= 168000000
  167. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_6WS // 6 wait states
  168. #else
  169. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_7WS // 7 wait states
  170. #endif
  171. #else
  172. #if SYSTEM_CYCLE_CLOCK_HZ <= 30000000
  173. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_0WS // no wait states
  174. #elif SYSTEM_CYCLE_CLOCK_HZ <= 60000000
  175. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_1WS // 1 wait state
  176. #elif SYSTEM_CYCLE_CLOCK_HZ <= 90000000
  177. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_2WS // 2 wait states
  178. #elif SYSTEM_CYCLE_CLOCK_HZ <= 120000000
  179. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_3WS // 3 wait states
  180. #elif SYSTEM_CYCLE_CLOCK_HZ <= 150000000
  181. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_4WS // 4 wait states
  182. #else
  183. #define FLASH_ACR_LATENCY_BITS FLASH_ACR_LATENCY_5WS // 5 wait states
  184. #endif
  185. #endif
  186. #pragma arm section code = "SectionForBootstrapOperations"
  187. /* IO initialization implemented in solution DeviceCode\Init */
  188. void BootstrapCode_GPIO();
  189. extern "C"
  190. {
  191. void __section("SectionForBootstrapOperations") STM32F4_BootstrapCode()
  192. {
  193. #ifdef STM32F4XX
  194. // enable FPU coprocessors (CP10, CP11)
  195. SCB->CPACR |= 0x3 << 2 * 10 | 0x3 << 2 * 11; // full access
  196. #endif
  197. // allow unaligned memory access and do not enforce 8 byte stack alignment
  198. SCB->CCR &= ~(SCB_CCR_UNALIGN_TRP_Msk | SCB_CCR_STKALIGN_Msk);
  199. // for clock configuration the cpu has to run on the internal 16MHz oscillator
  200. RCC->CR |= RCC_CR_HSION;
  201. while(!(RCC->CR & RCC_CR_HSIRDY));
  202. RCC->CFGR = RCC_CFGR_SW_HSI; // sysclk = AHB = APB1 = APB2 = HSI (16MHz)
  203. RCC->CR &= ~(RCC_CR_PLLON | RCC_CR_PLLI2SON); // pll off
  204. #if SYSTEM_CRYSTAL_CLOCK_HZ != 0
  205. // turn HSE on
  206. RCC->CR |= RCC_CR_HSEON;
  207. while(!(RCC->CR & RCC_CR_HSERDY));
  208. #endif
  209. // Set flash access time and enable caches & prefetch buffer
  210. #ifdef STM32F4XX
  211. // The prefetch buffer must not be enabled on rev A devices.
  212. // Rev A cannot be read from revision field (another rev A error!).
  213. // The wrong device field (411=F2) must be used instead!
  214. if ((DBGMCU->IDCODE & 0xFF) == 0x11) {
  215. FLASH->ACR = FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_BITS;
  216. } else {
  217. FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_BITS;
  218. }
  219. #else
  220. FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | FLASH_ACR_LATENCY_BITS;
  221. #endif
  222. // setup PLL
  223. RCC->PLLCFGR = RCC_PLLCFGR_PLL_BITS; // pll multipliers
  224. RCC->CR |= RCC_CR_PLLON; // pll on
  225. while(!(RCC->CR & RCC_CR_PLLRDY));
  226. // final clock setup
  227. RCC->CFGR = RCC_CFGR_SW_PLL // sysclk = pll out (SYSTEM_CLOCK_HZ)
  228. | RCC_CFGR_HPRE_DIV_BITS // AHB clock
  229. | RCC_CFGR_PPRE1_DIV_BITS // APB1 clock
  230. | RCC_CFGR_PPRE2_DIV_BITS; // APB2 clock
  231. // minimal peripheral clocks
  232. #ifdef STM32F4XX
  233. RCC->AHB1ENR = RCC_AHB1ENR_CCMDATARAMEN; // 64k RAM (CCM)
  234. #else
  235. RCC->AHB1ENR = 0;
  236. #endif
  237. RCC->AHB2ENR = 0;
  238. RCC->AHB3ENR = 0;
  239. RCC->APB1ENR = RCC_APB1ENR_PWREN; // PWR clock used for sleep;
  240. RCC->APB2ENR = RCC_APB2ENR_SYSCFGEN; // SYSCFG clock used for IO;
  241. // stop HSI clock
  242. #if SYSTEM_CRYSTAL_CLOCK_HZ != 0
  243. RCC->CR &= ~RCC_CR_HSION;
  244. #endif
  245. // remove Flash remap to Boot area to avoid problems with Monitor_Execute
  246. SYSCFG->MEMRMP = 1; // map System memory to Boot area
  247. #ifdef STM32F4_Enable_RTC
  248. STM32F4_RTC_Initialize(); // enable RTC
  249. #endif
  250. }
  251. __section("SectionForBootstrapOperations") void BootstrapCode()
  252. {
  253. STM32F4_BootstrapCode();
  254. PrepareImageRegions();
  255. BootstrapCode_GPIO();
  256. }
  257. __section("SectionForBootstrapOperations") void BootstrapCodeMinimal()
  258. {
  259. STM32F4_BootstrapCode();
  260. BootstrapCode_GPIO();
  261. }
  262. }