system_psoc6.h 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  1. /***************************************************************************//**
  2. * \file system_psoc6.h
  3. * \version 2.70.1
  4. *
  5. * \brief Device system header file.
  6. *
  7. ********************************************************************************
  8. * \copyright
  9. * Copyright 2016-2020 Cypress Semiconductor Corporation
  10. * SPDX-License-Identifier: Apache-2.0
  11. *
  12. * Licensed under the Apache License, Version 2.0 (the "License");
  13. * you may not use this file except in compliance with the License.
  14. * You may obtain a copy of the License at
  15. *
  16. * http://www.apache.org/licenses/LICENSE-2.0
  17. *
  18. * Unless required by applicable law or agreed to in writing, software
  19. * distributed under the License is distributed on an "AS IS" BASIS,
  20. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  21. * See the License for the specific language governing permissions and
  22. * limitations under the License.
  23. *******************************************************************************/
  24. #ifndef _SYSTEM_PSOC6_H_
  25. #define _SYSTEM_PSOC6_H_
  26. /**
  27. * \addtogroup group_system_config
  28. * \{
  29. * Provides device startup, system configuration, and linker script files.
  30. * The system startup provides the followings features:
  31. * - See \ref group_system_config_device_initialization for the:
  32. * * \ref group_system_config_dual_core_device_initialization
  33. * * \ref group_system_config_single_core_device_initialization
  34. * - \ref group_system_config_device_memory_definition
  35. * - \ref group_system_config_heap_stack_config
  36. * - \ref group_system_config_default_handlers
  37. * - \ref group_system_config_device_vector_table
  38. * - \ref group_system_config_cm4_functions
  39. *
  40. * \section group_system_config_configuration Configuration Considerations
  41. *
  42. * \subsection group_system_config_device_memory_definition Device Memory Definition
  43. * The flash and RAM allocation for each CPU is defined by the linker scripts.
  44. * For dual-core devices, the physical flash and RAM memory is shared between the CPU cores.
  45. * 2 KB of RAM (allocated at the end of RAM) are reserved for system use.
  46. * For Single-Core devices the system reserves additional 80 bytes of RAM.
  47. * Using the reserved memory area for other purposes will lead to unexpected behavior.
  48. *
  49. * \note The linker files provided with the PDL are generic and handle all common
  50. * use cases. Your project may not use every section defined in the linker files.
  51. * In that case you may see warnings during the build process. To eliminate build
  52. * warnings in your project, you can simply comment out or remove the relevant
  53. * code in the linker file.
  54. *
  55. * \note For the PSoC 64 Secure MCUs devices, refer to the following page:
  56. * https://www.cypress.com/documentation/software-and-drivers/psoc-64-secure-mcu-secure-boot-sdk-user-guide
  57. *
  58. *
  59. * <b>ARM GCC</b>\n
  60. * The flash and RAM sections for the CPU are defined in the linker files:
  61. * 'xx_yy.ld', where 'xx' is the device group, and 'yy' is the target CPU; for example,
  62. * 'cy8c6xx7_cm0plus.ld' and 'cy8c6xx7_cm4_dual.ld'.
  63. * \note If the start of the Cortex-M4 application image is changed, the value
  64. * of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The
  65. * \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the
  66. * Cy_SysEnableCM4() function call.
  67. * By default, the COMPONENT_CM0P_SLEEP prebuilt image is used for the CM0p core.
  68. * More about CM0+ prebuilt images, see here:
  69. * https://github.com/cypresssemiconductorco/psoc6cm0p
  70. *
  71. * Change the flash and RAM sizes by editing the macros value in the
  72. * linker files for both CPUs:
  73. * - 'xx_cm0plus.ld', where 'xx' is the device group:
  74. * \code
  75. * flash (rx) : ORIGIN = 0x10000000, LENGTH = 0x2000
  76. * ram (rwx) : ORIGIN = 0x08000000, LENGTH = 0x2000
  77. * \endcode
  78. * - 'xx_cm4_dual.ld', where 'xx' is the device group:
  79. * \code
  80. * flash (rx) : ORIGIN = 0x10000000, LENGTH = 0x100000
  81. * ram (rwx) : ORIGIN = 0x08002000, LENGTH = 0x45800
  82. * \endcode
  83. *
  84. * Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the ROM ORIGIN's
  85. * value (0x10000000) + FLASH_CM0P_SIZE value (0x2000, the size of a flash image
  86. * of the Cortex-M0+ application should be the same value as the flash LENGTH in
  87. * 'xx_cm0plus.ld') in the 'xx_cm4_dual.ld' file, where 'xx' is the device group.
  88. * Do this by either:
  89. * - Passing the following commands to the compiler:\n
  90. * \code -D CY_CORTEX_M4_APPL_ADDR=0x10002000 \endcode
  91. * or
  92. * - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where
  93. * 'xx' is the device family:\n
  94. * \code #define CY_CORTEX_M4_APPL_ADDR (0x10002000u) \endcode
  95. *
  96. * <b>ARM Compiler</b>\n
  97. * The flash and RAM sections for the CPU are defined in the linker files:
  98. * 'xx_yy.sct', where 'xx' is the device group, and 'yy' is the target CPU; for
  99. * example 'cy8c6xx7_cm0plus.sct' and 'cy8c6xx7_cm4_dual.sct'.
  100. * \note If the start of the Cortex-M4 application image is changed, the value
  101. * of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The
  102. * \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the \ref
  103. * Cy_SysEnableCM4() function call.
  104. * By default, the COMPONENT_CM0P_SLEEP prebuilt image is used for the CM0p core.
  105. * More about CM0+ prebuilt images, see here:
  106. * https://github.com/cypresssemiconductorco/psoc6cm0p
  107. *
  108. * \note The linker files provided with the PDL are generic and handle all common
  109. * use cases. Your project may not use every section defined in the linker files.
  110. * In that case you may see the warnings during the build process:
  111. * L6314W (no section matches pattern) and/or L6329W
  112. * (pattern only matches removed unused sections). In your project, you can
  113. * suppress the warning by passing the "--diag_suppress=L6314W,L6329W" option to
  114. * the linker. You can also comment out or remove the relevant code in the linker
  115. * file.
  116. *
  117. * Change the flash and RAM sizes by editing the macros value in the
  118. * linker files for both CPUs:
  119. * - 'xx_cm0plus.sct', where 'xx' is the device group:
  120. * \code
  121. * #define FLASH_START 0x10000000
  122. * #define FLASH_SIZE 0x00002000
  123. * #define RAM_START 0x08000000
  124. * #define RAM_SIZE 0x00002000
  125. * \endcode
  126. * - 'xx_cm4_dual.sct', where 'xx' is the device group:
  127. * \code
  128. * #define FLASH_START 0x10000000
  129. * #define FLASH_SIZE 0x00100000
  130. * #define RAM_START 0x08002000
  131. * #define RAM_SIZE 0x00045800
  132. * \endcode
  133. *
  134. * Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the FLASH_START
  135. * value (0x10000000) + FLASH_CM0P_SIZE value (0x2000, the size of a flash image
  136. * of the Cortex-M0+ application should be the same value as the FLASH_SIZE in the
  137. * 'xx_cm0plus.sct') in the 'xx_cm4_dual.sct' file, where 'xx' is the device group.
  138. * Do this by either:
  139. * - Passing the following commands to the compiler:\n
  140. * \code -D CY_CORTEX_M4_APPL_ADDR=0x10002000 \endcode
  141. * or
  142. * - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where
  143. * 'xx' is the device family:\n
  144. * \code #define CY_CORTEX_M4_APPL_ADDR (0x10002000u) \endcode
  145. *
  146. * <b>IAR</b>\n
  147. * The flash and RAM sections for the CPU are defined in the linker files:
  148. * 'xx_yy.icf', where 'xx' is the device group, and 'yy' is the target CPU; for example,
  149. * 'cy8c6xx7_cm0plus.icf' and 'cy8c6xx7_cm4_dual.icf'.
  150. * \note If the start of the Cortex-M4 application image is changed, the value
  151. * of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The
  152. * \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the \ref
  153. * Cy_SysEnableCM4() function call.
  154. * By default, the COMPONENT_CM0P_SLEEP prebuilt image is used for the CM0p core.
  155. * More about CM0+ prebuilt images, see here:
  156. * https://github.com/cypresssemiconductorco/psoc6cm0p
  157. *
  158. * Change the flash and RAM sizes by editing the macros value in the
  159. * linker files for both CPUs:
  160. * - 'xx_cm0plus.icf', where 'xx' is the device group:
  161. * \code
  162. * define symbol __ICFEDIT_region_IROM1_start__ = 0x10000000;
  163. * define symbol __ICFEDIT_region_IROM1_end__ = 0x10001FFF;
  164. * define symbol __ICFEDIT_region_IRAM1_start__ = 0x08000000;
  165. * define symbol __ICFEDIT_region_IRAM1_end__ = 0x08001FFF;
  166. * \endcode
  167. * - 'xx_cm4_dual.icf', where 'xx' is the device group:
  168. * \code
  169. * define symbol __ICFEDIT_region_IROM1_start__ = 0x10000000;
  170. * define symbol __ICFEDIT_region_IROM1_end__ = 0x100FFFFF;
  171. * define symbol __ICFEDIT_region_IRAM1_start__ = 0x08002000;
  172. * define symbol __ICFEDIT_region_IRAM1_end__ = 0x080477FF;
  173. * \endcode
  174. *
  175. * Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the
  176. * __ICFEDIT_region_IROM1_start__ value (0x10000000) + FLASH_CM0P_SIZE value
  177. * (0x2000, the size of a flash image of the Cortex-M0+ application) in the
  178. * 'xx_cm4_dual.icf' file, where 'xx' is the device group. The sum result
  179. * should be the same as (__ICFEDIT_region_IROM1_end__ + 1) value in the
  180. * 'xx_cm0plus.icf'. Do this by either:
  181. * - Passing the following commands to the compiler:\n
  182. * \code -D CY_CORTEX_M4_APPL_ADDR=0x10002000 \endcode
  183. * or
  184. * - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where
  185. * 'xx' is the device family:\n
  186. * \code #define CY_CORTEX_M4_APPL_ADDR (0x10002000u) \endcode
  187. *
  188. * \subsection group_system_config_device_initialization Device Initialization
  189. * After a power-on-reset (POR), the boot process is handled by the boot code
  190. * from the on-chip ROM that is always executed by the Cortex-M0+ core. The boot
  191. * code passes the control to the Cortex-M0+ startup code located in flash.
  192. *
  193. * \subsubsection group_system_config_dual_core_device_initialization Dual-Core Devices
  194. * The Cortex-M0+ startup code performs the device initialization by a call to
  195. * SystemInit() and then calls the main() function. The Cortex-M4 core is disabled
  196. * by default. Enable the core using the \ref Cy_SysEnableCM4() function.
  197. * See \ref group_system_config_cm4_functions for more details.
  198. * \note Startup code executes SystemInit() function for the both Cortex-M0+ and Cortex-M4 cores.
  199. * The function has a separate implementation on each core.
  200. * Both function implementations unlock and disable the WDT.
  201. * Therefore enable the WDT after both cores have been initialized.
  202. *
  203. * \subsubsection group_system_config_single_core_device_initialization Single-Core Devices
  204. * The Cortex-M0+ core is not user-accessible on these devices. In this case the
  205. * Flash Boot handles setup of the CM0+ core and starts the Cortex-M4 core.
  206. *
  207. * \subsection group_system_config_heap_stack_config Heap and Stack Configuration
  208. * There are two ways to adjust heap and stack configurations:
  209. * -# Editing source code files
  210. * -# Specifying via command line
  211. *
  212. * By default, the stack size is set to 0x00001000 and the heap size is allocated
  213. * dynamically to the whole available free memory up to stack memory and it
  214. * is set to the 0x00000400 (for ARM GCC and IAR compilers) as minimal value.
  215. *
  216. * \subsubsection group_system_config_heap_stack_config_gcc ARM GCC
  217. * - <b>Editing source code files</b>\n
  218. * The heap and stack sizes are defined in the assembler startup files
  219. * (e.g. startup_psoc6_01_cm0plus.S and startup_psoc6_01_cm4.S).
  220. * Change the heap and stack sizes by modifying the following lines:\n
  221. * \code .equ Stack_Size, 0x00001000 \endcode
  222. * \code .equ Heap_Size, 0x00000400 \endcode
  223. * Also, the stack size is defined in the linker script files: 'xx_yy.ld',
  224. * where 'xx' is the device family, and 'yy' is the target CPU; for example,
  225. * cy8c6xx7_cm0plus.ld and cy8c6xx7_cm4_dual.ld.
  226. * Change the stack size by modifying the following line:\n
  227. * \code STACK_SIZE = 0x1000; \endcode
  228. *
  229. * \subsubsection group_system_config_heap_stack_config_mdk ARM Compiler
  230. * - <b>Editing source code files</b>\n
  231. * The stack size is defined in the linker script files: 'xx_yy.sct',
  232. * where 'xx' is the device family, and 'yy' is the target CPU; for example,
  233. * cy8c6xx7_cm0plus.sct and cy8c6xx7_cm4_dual.sct.
  234. * Change the stack size by modifying the following line:\n
  235. * \code STACK_SIZE = 0x1000; \endcode
  236. *
  237. * \subsubsection group_system_config_heap_stack_config_iar IAR
  238. * - <b>Editing source code files</b>\n
  239. * The heap and stack sizes are defined in the linker script files: 'xx_yy.icf',
  240. * where 'xx' is the device family, and 'yy' is the target CPU; for example,
  241. * cy8c6xx7_cm0plus.icf and cy8c6xx7_cm4_dual.icf.
  242. * Change the heap and stack sizes by modifying the following lines:\n
  243. * \code Stack_Size EQU 0x00001000 \endcode
  244. * \code Heap_Size EQU 0x00000400 \endcode
  245. *
  246. * - <b>Specifying via command line</b>\n
  247. * Change the heap and stack sizes passing the following commands to the
  248. * linker (including quotation marks):\n
  249. * \code --define_symbol __STACK_SIZE=0x000000400 \endcode
  250. * \code --define_symbol __HEAP_SIZE=0x000000100 \endcode
  251. *
  252. * \subsection group_system_config_default_handlers Default Interrupt Handlers Definition
  253. * The default interrupt handler functions are defined as weak functions to a dummy
  254. * handler in the startup file. The naming convention for the interrupt handler names
  255. * is \<interrupt_name\>_IRQHandler. A default interrupt handler can be overwritten in
  256. * user code by defining the handler function using the same name. For example:
  257. * \code
  258. * void scb_0_interrupt_IRQHandler(void)
  259. *{
  260. * ...
  261. *}
  262. * \endcode
  263. *
  264. * \subsection group_system_config_device_vector_table Vectors Table Copy from Flash to RAM
  265. * This process uses memory sections defined in the linker script. The startup
  266. * code actually defines the contents of the vector table and performs the copy.
  267. * \subsubsection group_system_config_device_vector_table_gcc ARM GCC
  268. * The linker script file is 'xx_yy.ld', where 'xx' is the device family, and
  269. * 'yy' is the target CPU; for example, cy8c6xx7_cm0plus.ld and cy8c6xx7_cm4_dual.ld.
  270. * It defines sections and locations in memory.\n
  271. * Copy interrupt vectors from flash to RAM: \n
  272. * From: \code LONG (__Vectors) \endcode
  273. * To: \code LONG (__ram_vectors_start__) \endcode
  274. * Size: \code LONG (__Vectors_End - __Vectors) \endcode
  275. * The vector table address (and the vector table itself) are defined in the
  276. * assembler startup files (e.g. startup_psoc6_01_cm0plus.S and startup_psoc6_01_cm4.S).
  277. * The code in these files copies the vector table from Flash to RAM.
  278. * \subsubsection group_system_config_device_vector_table_mdk ARM Compiler
  279. * The linker script file is 'xx_yy.sct', where 'xx' is the device family,
  280. * and 'yy' is the target CPU; for example, cy8c6xx7_cm0plus.sct and
  281. * cy8c6xx7_cm4_dual.sct. The linker script specifies that the vector table
  282. * (RESET_RAM) shall be first in the RAM section.\n
  283. * RESET_RAM represents the vector table. It is defined in the assembler startup
  284. * files (e.g. startup_psoc6_01_cm0plus.s and startup_psoc6_01_cm4.s).
  285. * The code in these files copies the vector table from Flash to RAM.
  286. *
  287. * \subsubsection group_system_config_device_vector_table_iar IAR
  288. * The linker script file is 'xx_yy.icf', where 'xx' is the device family, and
  289. * 'yy' is the target CPU; for example, cy8c6xx7_cm0plus.icf and cy8c6xx7_cm4_dual.icf.
  290. * This file defines the .intvec_ram section and its location.
  291. * \code place at start of IRAM1_region { readwrite section .intvec_ram}; \endcode
  292. * The vector table address (and the vector table itself) are defined in the
  293. * assembler startup files (e.g. startup_psoc6_01_cm0plus.s and startup_psoc6_01_cm4.s).
  294. * The code in these files copies the vector table from Flash to RAM.
  295. *
  296. * \section group_system_config_MISRA MISRA Compliance
  297. *
  298. * <table class="doxtable">
  299. * <tr>
  300. * <th>MISRA Rule</th>
  301. * <th>Rule Class (Required/Advisory)</th>
  302. * <th>Rule Description</th>
  303. * <th>Description of Deviation(s)</th>
  304. * </tr>
  305. * <tr>
  306. * <td>2.3</td>
  307. * <td>R</td>
  308. * <td>The character sequence // shall not be used within a comment.</td>
  309. * <td>The comments provide a useful WEB link to the documentation.</td>
  310. * </tr>
  311. * </table>
  312. *
  313. * \section group_system_config_changelog Changelog
  314. * <table class="doxtable">
  315. * <tr>
  316. * <th>Version</th>
  317. * <th>Changes</th>
  318. * <th>Reason for Change</th>
  319. * </tr>
  320. * <tr>
  321. * <td>2.70.1</td>
  322. * <td>Updated documentation for the better description of the existing startup implementation.</td>
  323. * <td>User experience enhancement.</td>
  324. * </tr>
  325. * <tr>
  326. * <td rowspan="5">2.70</td>
  327. * <td>Updated \ref SystemCoreClockUpdate() implementation - The SysClk API is reused.</td>
  328. * <td>Code optimization.</td>
  329. * </tr>
  330. * <tr>
  331. * <td>Updated \ref SystemInit() implementation - The IPC7 structure is initialized for both cores.</td>
  332. * <td>Provided support for SysPM driver updates.</td>
  333. * </tr>
  334. * <tr>
  335. * <td>Updated the linker scripts.</td>
  336. * <td>Reserved FLASH area for the MCU boot headers.</td>
  337. * </tr>
  338. * <tr>
  339. * <td>Added System Pipe initialization for all devices. </td>
  340. * <td>Improved PDL usability according to user experience.</td>
  341. * </tr>
  342. * <tr>
  343. * <td>Removed redundant legacy macros: CY_CLK_EXT_FREQ_HZ, CY_CLK_ECO_FREQ_HZ and CY_CLK_ALTHF_FREQ_HZ.
  344. * Use \ref Cy_SysClk_ExtClkSetFrequency, \ref Cy_SysClk_EcoConfigure and \ref Cy_BLE_EcoConfigure functions instead them. </td>
  345. * <td>Defect fixing.</td>
  346. * </tr>
  347. * <tr>
  348. * <td>2.60</td>
  349. * <td>Updated linker scripts.</td>
  350. * <td>Provided support for new devices, updated usage of CM0p prebuilt image.</td>
  351. * </tr>
  352. * <tr>
  353. * <td>2.50</td>
  354. * <td>Updated assembler files, C files, linker scripts.</td>
  355. * <td>Dynamic allocated HEAP size for Arm Compiler 6, IAR 8.</td>
  356. * </tr>
  357. * <tr>
  358. * <td>2.40</td>
  359. * <td>Updated assembler files, C files, linker scripts.</td>
  360. * <td>Added Arm Compiler 6 support.</td>
  361. * </tr>
  362. * <tr>
  363. * <td rowspan="2">2.30</td>
  364. * <td>Added assembler files, linker scripts for Mbed OS.</td>
  365. * <td>Added Arm Mbed OS embedded operating system support.</td>
  366. * </tr>
  367. * <tr>
  368. * <td>Updated linker scripts to extend the Flash and Ram memories size available for the CM4 core.</td>
  369. * <td>Enhanced PDL usability.</td>
  370. * </tr>
  371. * <tr>
  372. * <td>2.20</td>
  373. * <td>Moved the Cy_IPC_SystemSemaInit(), Cy_IPC_SystemPipeInit() functions implementation from IPC to Startup.</td>
  374. * <td>Changed the IPC driver configuration method from compile time to run time.</td>
  375. * </tr>
  376. * <tr>
  377. * <td rowspan="2"> 2.10</td>
  378. * <td>Added constructor attribute to SystemInit() function declaration for ARM MDK compiler. \n
  379. * Removed $Sub$$main symbol for ARM MDK compiler.
  380. * </td>
  381. * <td>uVision Debugger support.</td>
  382. * </tr>
  383. * <tr>
  384. * <td>Updated description of the Startup behavior for Single-Core Devices. \n
  385. * Added note about WDT disabling by SystemInit() function.
  386. * </td>
  387. * <td>Documentation improvement.</td>
  388. * </tr>
  389. * <tr>
  390. * <td rowspan="4"> 2.0</td>
  391. * <td>Added restoring of FLL registers to the default state in SystemInit() API for single core devices.
  392. * Single core device support.
  393. * </td>
  394. * <td></td>
  395. * </tr>
  396. * <tr>
  397. * <td>Added Normal Access Restrictions, Public Key, TOC part2 and TOC part2 copy to Supervisory flash linker memory regions. \n
  398. * Renamed 'wflash' memory region to 'em_eeprom'.
  399. * </td>
  400. * <td>Linker scripts usability improvement.</td>
  401. * </tr>
  402. * <tr>
  403. * <td>Added Cy_IPC_SystemSemaInit(), Cy_IPC_SystemPipeInit(), Cy_Flash_Init() functions call to SystemInit() API.</td>
  404. * <td>Reserved system resources for internal operations.</td>
  405. * </tr>
  406. * <tr>
  407. * <td>Added clearing and releasing of IPC structure #7 (reserved for the Deep-Sleep operations) to SystemInit() API.</td>
  408. * <td>To avoid deadlocks in case of SW or WDT reset during Deep-Sleep entering.</td>
  409. * </tr>
  410. * <tr>
  411. * <td>1.0</td>
  412. * <td>Initial version</td>
  413. * <td></td>
  414. * </tr>
  415. * </table>
  416. *
  417. *
  418. * \defgroup group_system_config_macro Macro
  419. * \{
  420. * \defgroup group_system_config_system_macro System
  421. * \defgroup group_system_config_cm4_status_macro Cortex-M4 Status
  422. * \defgroup group_system_config_user_settings_macro User Settings
  423. * \}
  424. * \defgroup group_system_config_functions Functions
  425. * \{
  426. * \defgroup group_system_config_system_functions System
  427. * \defgroup group_system_config_cm4_functions Cortex-M4 Control
  428. * \}
  429. * \defgroup group_system_config_globals Global Variables
  430. *
  431. * \}
  432. */
  433. /**
  434. * \addtogroup group_system_config_system_functions
  435. * \{
  436. * \details
  437. * The following system functions implement CMSIS Core functions.
  438. * Refer to the [CMSIS documentation]
  439. * (http://www.keil.com/pack/doc/CMSIS/Core/html/group__system__init__gr.html "System and Clock Configuration")
  440. * for more details.
  441. * \}
  442. */
  443. #ifdef __cplusplus
  444. extern "C" {
  445. #endif
  446. /*******************************************************************************
  447. * Include files
  448. *******************************************************************************/
  449. #include <stdint.h>
  450. /*******************************************************************************
  451. * Global preprocessor symbols/macros ('define')
  452. *******************************************************************************/
  453. #if ((defined(__GNUC__) && (__ARM_ARCH == 6) && (__ARM_ARCH_6M__ == 1)) || \
  454. (defined (__ICCARM__) && (__CORE__ == __ARM6M__)) || \
  455. (defined(__ARMCC_VERSION) && (__TARGET_ARCH_THUMB == 3)))
  456. #define CY_SYSTEM_CPU_CM0P 1UL
  457. #else
  458. #define CY_SYSTEM_CPU_CM0P 0UL
  459. #endif
  460. /*******************************************************************************
  461. *
  462. * START OF USER SETTINGS HERE
  463. * ===========================
  464. *
  465. * All lines with '<<<' can be set by user.
  466. *
  467. *******************************************************************************/
  468. /**
  469. * \addtogroup group_system_config_user_settings_macro
  470. * \{
  471. */
  472. /***************************************************************************//**
  473. * \brief Start address of the Cortex-M4 application ([address]UL)
  474. * <i>(USER SETTING)</i>
  475. *******************************************************************************/
  476. #if !defined (CY_CORTEX_M4_APPL_ADDR)
  477. #define CY_CORTEX_M4_APPL_ADDR (CY_FLASH_BASE + 0x2000U) /* <<< 8 kB of flash is reserved for the Cortex-M0+ application */
  478. #endif /* (CY_CORTEX_M4_APPL_ADDR) */
  479. /***************************************************************************//**
  480. * \brief IPC Semaphores allocation ([value]UL).
  481. * <i>(USER SETTING)</i>
  482. *******************************************************************************/
  483. #define CY_IPC_SEMA_COUNT (128UL) /* <<< This will allow 128 (4*32) semaphores */
  484. /***************************************************************************//**
  485. * \brief IPC Pipe definitions ([value]UL).
  486. * <i>(USER SETTING)</i>
  487. *******************************************************************************/
  488. #define CY_IPC_MAX_ENDPOINTS (8UL) /* <<< 8 endpoints */
  489. /*******************************************************************************
  490. *
  491. * END OF USER SETTINGS HERE
  492. * =========================
  493. *
  494. *******************************************************************************/
  495. /** \} group_system_config_user_settings_macro */
  496. /**
  497. * \addtogroup group_system_config_system_macro
  498. * \{
  499. */
  500. #if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN)
  501. /** The Cortex-M0+ startup driver identifier */
  502. #define CY_STARTUP_M0P_ID ((uint32_t)((uint32_t)((0x0EU) & 0x3FFFU) << 18U))
  503. #endif /* (CY_SYSTEM_CPU_CM0P == 1UL) */
  504. #if (CY_SYSTEM_CPU_CM0P != 1UL) || defined(CY_DOXYGEN)
  505. /** The Cortex-M4 startup driver identifier */
  506. #define CY_STARTUP_M4_ID ((uint32_t)((uint32_t)((0x0FU) & 0x3FFFU) << 18U))
  507. #endif /* (CY_SYSTEM_CPU_CM0P != 1UL) */
  508. /** \} group_system_config_system_macro */
  509. /**
  510. * \addtogroup group_system_config_system_functions
  511. * \{
  512. */
  513. #if defined(__ARMCC_VERSION)
  514. extern void SystemInit(void) __attribute__((constructor));
  515. #else
  516. extern void SystemInit(void);
  517. #endif /* (__ARMCC_VERSION) */
  518. extern void SystemCoreClockUpdate(void);
  519. /** \} group_system_config_system_functions */
  520. /**
  521. * \addtogroup group_system_config_cm4_functions
  522. * \{
  523. */
  524. extern uint32_t Cy_SysGetCM4Status(void);
  525. extern void Cy_SysEnableCM4(uint32_t vectorTableOffset);
  526. extern void Cy_SysDisableCM4(void);
  527. extern void Cy_SysRetainCM4(void);
  528. extern void Cy_SysResetCM4(void);
  529. /** \} group_system_config_cm4_functions */
  530. /** \cond */
  531. extern void Default_Handler (void);
  532. void Cy_SysIpcPipeIsrCm0(void);
  533. void Cy_SysIpcPipeIsrCm4(void);
  534. extern void Cy_SystemInit(void);
  535. extern void Cy_SystemInitFpuEnable(void);
  536. extern uint32_t cy_delayFreqKhz;
  537. extern uint8_t cy_delayFreqMhz;
  538. extern uint32_t cy_delay32kMs;
  539. /** \endcond */
  540. #if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN)
  541. /**
  542. * \addtogroup group_system_config_cm4_status_macro
  543. * \{
  544. */
  545. #define CY_SYS_CM4_STATUS_ENABLED (3U) /**< The Cortex-M4 core is enabled: power on, clock on, no isolate, no reset and no retain. */
  546. #define CY_SYS_CM4_STATUS_DISABLED (0U) /**< The Cortex-M4 core is disabled: power off, clock off, isolate, reset and no retain. */
  547. #define CY_SYS_CM4_STATUS_RETAINED (2U) /**< The Cortex-M4 core is retained. power off, clock off, isolate, no reset and retain. */
  548. #define CY_SYS_CM4_STATUS_RESET (1U) /**< The Cortex-M4 core is in the Reset mode: clock off, no isolated, no retain and reset. */
  549. /** \} group_system_config_cm4_status_macro */
  550. #endif /* (CY_SYSTEM_CPU_CM0P == 1UL) */
  551. /*******************************************************************************
  552. * IPC Configuration
  553. * =========================
  554. *******************************************************************************/
  555. /* IPC CY_PIPE default configuration */
  556. #define CY_SYS_CYPIPE_CLIENT_CNT (8UL)
  557. #define CY_SYS_INTR_CYPIPE_MUX_EP0 (1UL) /* IPC CYPRESS PIPE */
  558. #define CY_SYS_INTR_CYPIPE_PRIOR_EP0 (1UL) /* Notifier Priority */
  559. #define CY_SYS_INTR_CYPIPE_PRIOR_EP1 (1UL) /* Notifier Priority */
  560. #define CY_SYS_CYPIPE_CHAN_MASK_EP0 (0x0001UL << CY_IPC_CHAN_CYPIPE_EP0)
  561. #define CY_SYS_CYPIPE_CHAN_MASK_EP1 (0x0001UL << CY_IPC_CHAN_CYPIPE_EP1)
  562. /******************************************************************************/
  563. /*
  564. * The System pipe configuration defines the IPC channel number, interrupt
  565. * number, and the pipe interrupt mask for the endpoint.
  566. *
  567. * The format of the endPoint configuration
  568. * Bits[31:16] Interrupt Mask
  569. * Bits[15:8 ] IPC interrupt
  570. * Bits[ 7:0 ] IPC channel
  571. */
  572. /* System Pipe addresses */
  573. /* CyPipe defines */
  574. #define CY_SYS_CYPIPE_INTR_MASK ( CY_SYS_CYPIPE_CHAN_MASK_EP0 | CY_SYS_CYPIPE_CHAN_MASK_EP1 )
  575. #define CY_SYS_CYPIPE_CONFIG_EP0 ( (CY_SYS_CYPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos) \
  576. | (CY_IPC_INTR_CYPIPE_EP0 << CY_IPC_PIPE_CFG_INTR_Pos) \
  577. | CY_IPC_CHAN_CYPIPE_EP0)
  578. #define CY_SYS_CYPIPE_CONFIG_EP1 ( (CY_SYS_CYPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos) \
  579. | (CY_IPC_INTR_CYPIPE_EP1 << CY_IPC_PIPE_CFG_INTR_Pos) \
  580. | CY_IPC_CHAN_CYPIPE_EP1)
  581. /******************************************************************************/
  582. /** \addtogroup group_system_config_globals
  583. * \{
  584. */
  585. extern uint32_t SystemCoreClock;
  586. extern uint32_t cy_BleEcoClockFreqHz;
  587. extern uint32_t cy_Hfclk0FreqHz;
  588. extern uint32_t cy_PeriClkFreqHz;
  589. /** \} group_system_config_globals */
  590. /** \cond INTERNAL */
  591. /*******************************************************************************
  592. * Backward compatibility macros. The following code is DEPRECATED and must
  593. * not be used in new projects
  594. *******************************************************************************/
  595. /* BWC defines for functions related to enter/exit critical section */
  596. #define Cy_SaveIRQ Cy_SysLib_EnterCriticalSection
  597. #define Cy_RestoreIRQ Cy_SysLib_ExitCriticalSection
  598. #define CY_SYS_INTR_CYPIPE_EP0 (CY_IPC_INTR_CYPIPE_EP0)
  599. #define CY_SYS_INTR_CYPIPE_EP1 (CY_IPC_INTR_CYPIPE_EP1)
  600. #define cy_delayFreqHz (SystemCoreClock)
  601. /** \endcond */
  602. #ifdef __cplusplus
  603. }
  604. #endif
  605. #endif /* _SYSTEM_PSOC6_H_ */
  606. /* [] END OF FILE */