训练营PLSR题目
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 
 
 

746 rindas
30 KiB

  1. /*
  2. *********************************************************************************************************
  3. * uC/CPU
  4. * CPU CONFIGURATION & PORT LAYER
  5. *
  6. * (c) Copyright 2004-2013; Micrium, Inc.; Weston, FL
  7. *
  8. * All rights reserved. Protected by international copyright laws.
  9. *
  10. * uC/CPU is provided in source form to registered licensees ONLY. It is
  11. * illegal to distribute this source code to any third party unless you receive
  12. * written permission by an authorized Micrium representative. Knowledge of
  13. * the source code may NOT be used to develop a similar product.
  14. *
  15. * Please help us continue to provide the Embedded community with the finest
  16. * software available. Your honesty is greatly appreciated.
  17. *
  18. * You can find our product's user manual, API reference, release notes and
  19. * more information at https://doc.micrium.com.
  20. * You can contact us at www.micrium.com.
  21. *********************************************************************************************************
  22. */
  23. /*
  24. *********************************************************************************************************
  25. *
  26. * CPU PORT FILE
  27. *
  28. * ARM-Cortex-M4
  29. * IAR C Compiler
  30. *
  31. * Filename : cpu_c.c
  32. * Version : V1.30.01.00
  33. * Programmer(s) : JJL
  34. * BAN
  35. *********************************************************************************************************
  36. */
  37. /*
  38. *********************************************************************************************************
  39. * INCLUDE FILES
  40. *********************************************************************************************************
  41. */
  42. #define MICRIUM_SOURCE
  43. #include <cpu.h>
  44. #include <cpu_core.h>
  45. #include <lib_def.h>
  46. #ifdef __cplusplus
  47. extern "C" {
  48. #endif
  49. /*
  50. *********************************************************************************************************
  51. * LOCAL DEFINES
  52. *********************************************************************************************************
  53. */
  54. #define CPU_INT_SRC_POS_MAX ((((CPU_REG_NVIC_NVIC + 1) & 0x1F) * 32) + 16)
  55. #define CPU_BIT_BAND_SRAM_REG_LO 0x20000000
  56. #define CPU_BIT_BAND_SRAM_REG_HI 0x200FFFFF
  57. #define CPU_BIT_BAND_SRAM_BASE 0x22000000
  58. #define CPU_BIT_BAND_PERIPH_REG_LO 0x40000000
  59. #define CPU_BIT_BAND_PERIPH_REG_HI 0x400FFFFF
  60. #define CPU_BIT_BAND_PERIPH_BASE 0x42000000
  61. /*
  62. *********************************************************************************************************
  63. * LOCAL CONSTANTS
  64. *********************************************************************************************************
  65. */
  66. /*
  67. *********************************************************************************************************
  68. * LOCAL DATA TYPES
  69. *********************************************************************************************************
  70. */
  71. /*
  72. *********************************************************************************************************
  73. * LOCAL TABLES
  74. *********************************************************************************************************
  75. */
  76. /*
  77. *********************************************************************************************************
  78. * LOCAL GLOBAL VARIABLES
  79. *********************************************************************************************************
  80. */
  81. /*
  82. *********************************************************************************************************
  83. * LOCAL FUNCTION PROTOTYPES
  84. *********************************************************************************************************
  85. */
  86. /*
  87. *********************************************************************************************************
  88. * LOCAL CONFIGURATION ERRORS
  89. *********************************************************************************************************
  90. */
  91. /*
  92. *********************************************************************************************************
  93. * CPU_BitBandClr()
  94. *
  95. * Description : Clear bit in bit-band region.
  96. *
  97. * Argument(s) : addr Byte address in memory space.
  98. *
  99. * bit_nbr Bit number in byte.
  100. *
  101. * Return(s) : none.
  102. *
  103. * Caller(s) : Application.
  104. *
  105. * Note(s) : none.
  106. *********************************************************************************************************
  107. */
  108. void CPU_BitBandClr (CPU_ADDR addr,
  109. CPU_INT08U bit_nbr)
  110. {
  111. CPU_ADDR bit_word_off;
  112. CPU_ADDR bit_word_addr;
  113. if ((addr >= CPU_BIT_BAND_SRAM_REG_LO) &&
  114. (addr <= CPU_BIT_BAND_SRAM_REG_HI)) {
  115. bit_word_off = ((addr - CPU_BIT_BAND_SRAM_REG_LO ) * 32) + (bit_nbr * 4);
  116. bit_word_addr = CPU_BIT_BAND_SRAM_BASE + bit_word_off;
  117. *(volatile CPU_INT32U *)(bit_word_addr) = 0;
  118. } else if ((addr >= CPU_BIT_BAND_PERIPH_REG_LO) &&
  119. (addr <= CPU_BIT_BAND_PERIPH_REG_HI)) {
  120. bit_word_off = ((addr - CPU_BIT_BAND_PERIPH_REG_LO) * 32) + (bit_nbr * 4);
  121. bit_word_addr = CPU_BIT_BAND_PERIPH_BASE + bit_word_off;
  122. *(volatile CPU_INT32U *)(bit_word_addr) = 0;
  123. }
  124. }
  125. /*
  126. *********************************************************************************************************
  127. * CPU_BitBandSet()
  128. *
  129. * Description : Set bit in bit-band region.
  130. *
  131. * Argument(s) : addr Byte address in memory space.
  132. *
  133. * bit_nbr Bit number in byte.
  134. *
  135. * Return(s) : none.
  136. *
  137. * Caller(s) : Application.
  138. *
  139. * Note(s) : none.
  140. *********************************************************************************************************
  141. */
  142. void CPU_BitBandSet (CPU_ADDR addr,
  143. CPU_INT08U bit_nbr)
  144. {
  145. CPU_ADDR bit_word_off;
  146. CPU_ADDR bit_word_addr;
  147. if ((addr >= CPU_BIT_BAND_SRAM_REG_LO) &&
  148. (addr <= CPU_BIT_BAND_SRAM_REG_HI)) {
  149. bit_word_off = ((addr - CPU_BIT_BAND_SRAM_REG_LO ) * 32) + (bit_nbr * 4);
  150. bit_word_addr = CPU_BIT_BAND_SRAM_BASE + bit_word_off;
  151. *(volatile CPU_INT32U *)(bit_word_addr) = 1;
  152. } else if ((addr >= CPU_BIT_BAND_PERIPH_REG_LO) &&
  153. (addr <= CPU_BIT_BAND_PERIPH_REG_HI)) {
  154. bit_word_off = ((addr - CPU_BIT_BAND_PERIPH_REG_LO) * 32) + (bit_nbr * 4);
  155. bit_word_addr = CPU_BIT_BAND_PERIPH_BASE + bit_word_off;
  156. *(volatile CPU_INT32U *)(bit_word_addr) = 1;
  157. }
  158. }
  159. /*
  160. *********************************************************************************************************
  161. * CPU_IntSrcDis()
  162. *
  163. * Description : Disable an interrupt source.
  164. *
  165. * Argument(s) : pos Position of interrupt vector in interrupt table :
  166. *
  167. * 0 Invalid (see Note #1a).
  168. * 1 Invalid (see Note #1b).
  169. * 2 Non-maskable interrupt.
  170. * 3 Hard Fault.
  171. * 4 Memory Management.
  172. * 5 Bus Fault.
  173. * 6 Usage Fault.
  174. * 7-10 Reserved.
  175. * 11 SVCall
  176. * 12 Debug monitor.
  177. * 13 Reserved
  178. * 14 PendSV.
  179. * 15 SysTick.
  180. * 16+ External Interrupt.
  181. *
  182. * Return(s) : none.
  183. *
  184. * Caller(s) : Application.
  185. *
  186. * Note(s) : (1) Several table positions do not contain interrupt sources :
  187. *
  188. * (a) Position 0 contains the stack pointer.
  189. * (b) Positions 7-10, 13 are reserved.
  190. *
  191. * (2) Several interrupts cannot be disabled/enabled :
  192. *
  193. * (a) Reset.
  194. * (b) NMI.
  195. * (c) Hard fault.
  196. * (d) SVCall.
  197. * (e) Debug monitor.
  198. * (f) PendSV.
  199. *
  200. * (3) The maximum Cortex-M3 table position is 256. A particular Cortex-M3 may have fewer
  201. * than 240 external exceptions and, consequently, fewer than 256 table positions.
  202. * This function assumes that the specified table position is valid if the interrupt
  203. * controller type register's INTLINESNUM field is large enough so that the position
  204. * COULD be valid.
  205. *********************************************************************************************************
  206. */
  207. void CPU_IntSrcDis (CPU_INT08U pos)
  208. {
  209. CPU_INT08U group;
  210. CPU_INT08U pos_max;
  211. CPU_INT08U nbr;
  212. CPU_SR_ALLOC();
  213. switch (pos) {
  214. case CPU_INT_STK_PTR: /* ---------------- INVALID OR RESERVED --------------- */
  215. case CPU_INT_RSVD_07:
  216. case CPU_INT_RSVD_08:
  217. case CPU_INT_RSVD_09:
  218. case CPU_INT_RSVD_10:
  219. case CPU_INT_RSVD_13:
  220. break;
  221. /* ----------------- SYSTEM EXCEPTIONS ---------------- */
  222. case CPU_INT_RESET: /* Reset (see Note #2). */
  223. case CPU_INT_NMI: /* Non-maskable interrupt (see Note #2). */
  224. case CPU_INT_HFAULT: /* Hard fault (see Note #2). */
  225. case CPU_INT_SVCALL: /* SVCall (see Note #2). */
  226. case CPU_INT_DBGMON: /* Debug monitor (see Note #2). */
  227. case CPU_INT_PENDSV: /* PendSV (see Note #2). */
  228. break;
  229. case CPU_INT_MEM: /* Memory management. */
  230. CPU_CRITICAL_ENTER();
  231. CPU_REG_NVIC_SHCSR &= ~CPU_REG_NVIC_SHCSR_MEMFAULTENA;
  232. CPU_CRITICAL_EXIT();
  233. break;
  234. case CPU_INT_BUSFAULT: /* Bus fault. */
  235. CPU_CRITICAL_ENTER();
  236. CPU_REG_NVIC_SHCSR &= ~CPU_REG_NVIC_SHCSR_BUSFAULTENA;
  237. CPU_CRITICAL_EXIT();
  238. break;
  239. case CPU_INT_USAGEFAULT: /* Usage fault. */
  240. CPU_CRITICAL_ENTER();
  241. CPU_REG_NVIC_SHCSR &= ~CPU_REG_NVIC_SHCSR_USGFAULTENA;
  242. CPU_CRITICAL_EXIT();
  243. break;
  244. case CPU_INT_SYSTICK: /* SysTick. */
  245. CPU_CRITICAL_ENTER();
  246. CPU_REG_NVIC_ST_CTRL &= ~CPU_REG_NVIC_ST_CTRL_ENABLE;
  247. CPU_CRITICAL_EXIT();
  248. break;
  249. /* ---------------- EXTERNAL INTERRUPT ---------------- */
  250. default:
  251. pos_max = CPU_INT_SRC_POS_MAX;
  252. if (pos < pos_max) { /* See Note #3. */
  253. group = (pos - 16) / 32;
  254. nbr = (pos - 16) % 32;
  255. CPU_CRITICAL_ENTER();
  256. CPU_REG_NVIC_CLREN(group) = DEF_BIT(nbr);
  257. CPU_CRITICAL_EXIT();
  258. }
  259. break;
  260. }
  261. }
  262. /*
  263. *********************************************************************************************************
  264. * CPU_IntSrcEn()
  265. *
  266. * Description : Enable an interrupt source.
  267. *
  268. * Argument(s) : pos Position of interrupt vector in interrupt table (see 'CPU_IntSrcDis()').
  269. *
  270. * Return(s) : none.
  271. *
  272. * Caller(s) : Application.
  273. *
  274. * Note(s) : (1) See 'CPU_IntSrcDis() Note #1'.
  275. *
  276. * (2) See 'CPU_IntSrcDis() Note #2'.
  277. *
  278. * (3) See 'CPU_IntSrcDis() Note #3'.
  279. *********************************************************************************************************
  280. */
  281. void CPU_IntSrcEn (CPU_INT08U pos)
  282. {
  283. CPU_INT08U group;
  284. CPU_INT08U nbr;
  285. CPU_INT08U pos_max;
  286. CPU_SR_ALLOC();
  287. switch (pos) {
  288. case CPU_INT_STK_PTR: /* ---------------- INVALID OR RESERVED --------------- */
  289. case CPU_INT_RSVD_07:
  290. case CPU_INT_RSVD_08:
  291. case CPU_INT_RSVD_09:
  292. case CPU_INT_RSVD_10:
  293. case CPU_INT_RSVD_13:
  294. break;
  295. /* ----------------- SYSTEM EXCEPTIONS ---------------- */
  296. case CPU_INT_RESET: /* Reset (see Note #2). */
  297. case CPU_INT_NMI: /* Non-maskable interrupt (see Note #2). */
  298. case CPU_INT_HFAULT: /* Hard fault (see Note #2). */
  299. case CPU_INT_SVCALL: /* SVCall (see Note #2). */
  300. case CPU_INT_DBGMON: /* Debug monitor (see Note #2). */
  301. case CPU_INT_PENDSV: /* PendSV (see Note #2). */
  302. break;
  303. case CPU_INT_MEM: /* Memory management. */
  304. CPU_CRITICAL_ENTER();
  305. CPU_REG_NVIC_SHCSR |= CPU_REG_NVIC_SHCSR_MEMFAULTENA;
  306. CPU_CRITICAL_EXIT();
  307. break;
  308. case CPU_INT_BUSFAULT: /* Bus fault. */
  309. CPU_CRITICAL_ENTER();
  310. CPU_REG_NVIC_SHCSR |= CPU_REG_NVIC_SHCSR_BUSFAULTENA;
  311. CPU_CRITICAL_EXIT();
  312. break;
  313. case CPU_INT_USAGEFAULT: /* Usage fault. */
  314. CPU_CRITICAL_ENTER();
  315. CPU_REG_NVIC_SHCSR |= CPU_REG_NVIC_SHCSR_USGFAULTENA;
  316. CPU_CRITICAL_EXIT();
  317. break;
  318. case CPU_INT_SYSTICK: /* SysTick. */
  319. CPU_CRITICAL_ENTER();
  320. CPU_REG_NVIC_ST_CTRL |= CPU_REG_NVIC_ST_CTRL_ENABLE;
  321. CPU_CRITICAL_EXIT();
  322. break;
  323. /* ---------------- EXTERNAL INTERRUPT ---------------- */
  324. default:
  325. pos_max = CPU_INT_SRC_POS_MAX;
  326. if (pos < pos_max) { /* See Note #3. */
  327. group = (pos - 16) / 32;
  328. nbr = (pos - 16) % 32;
  329. CPU_CRITICAL_ENTER();
  330. CPU_REG_NVIC_SETEN(group) = DEF_BIT(nbr);
  331. CPU_CRITICAL_EXIT();
  332. }
  333. break;
  334. }
  335. }
  336. /*
  337. *********************************************************************************************************
  338. * CPU_IntSrcPendClr()
  339. *
  340. * Description : Clear a pending interrupt.
  341. *
  342. * Argument(s) : pos Position of interrupt vector in interrupt table (see 'CPU_IntSrcDis()').
  343. *
  344. * Return(s) : none.
  345. *
  346. * Caller(s) : Application.
  347. *
  348. * Note(s) : (1) See 'CPU_IntSrcDis() Note #1'.
  349. *
  350. * (2) The pending status of several interrupts cannot be clear/set :
  351. *
  352. * (a) Reset.
  353. * (b) NMI.
  354. * (c) Hard fault.
  355. * (d) Memory Managment.
  356. * (e) Bus Fault.
  357. * (f) Usage Fault.
  358. * (g) SVCall.
  359. * (h) Debug monitor.
  360. * (i) PendSV.
  361. * (j) Systick
  362. *
  363. * (3) See 'CPU_IntSrcDis() Note #3'.
  364. *********************************************************************************************************
  365. */
  366. void CPU_IntSrcPendClr (CPU_INT08U pos)
  367. {
  368. CPU_INT08U group;
  369. CPU_INT08U nbr;
  370. CPU_INT08U pos_max;
  371. CPU_SR_ALLOC();
  372. switch (pos) {
  373. case CPU_INT_STK_PTR: /* ---------------- INVALID OR RESERVED --------------- */
  374. case CPU_INT_RSVD_07:
  375. case CPU_INT_RSVD_08:
  376. case CPU_INT_RSVD_09:
  377. case CPU_INT_RSVD_10:
  378. case CPU_INT_RSVD_13:
  379. break;
  380. /* ----------------- SYSTEM EXCEPTIONS ---------------- */
  381. case CPU_INT_RESET: /* Reset (see Note #2). */
  382. case CPU_INT_NMI: /* Non-maskable interrupt (see Note #2). */
  383. case CPU_INT_HFAULT: /* Hard fault (see Note #2). */
  384. case CPU_INT_MEM: /* Memory management (see Note #2). */
  385. case CPU_INT_SVCALL: /* SVCall (see Note #2). */
  386. case CPU_INT_DBGMON: /* Debug monitor (see Note #2). */
  387. case CPU_INT_PENDSV: /* PendSV (see Note #2). */
  388. case CPU_INT_BUSFAULT: /* Bus fault. */
  389. case CPU_INT_USAGEFAULT: /* Usage fault. */
  390. case CPU_INT_SYSTICK: /* SysTick. */
  391. break;
  392. /* ---------------- EXTERNAL INTERRUPT ---------------- */
  393. default:
  394. pos_max = CPU_INT_SRC_POS_MAX;
  395. if (pos < pos_max) { /* See Note #3. */
  396. group = (pos - 16) / 32;
  397. nbr = (pos - 16) % 32;
  398. CPU_CRITICAL_ENTER();
  399. CPU_REG_NVIC_CLRPEND(group) = DEF_BIT(nbr);
  400. CPU_CRITICAL_EXIT();
  401. }
  402. break;
  403. }
  404. }
  405. /*
  406. *********************************************************************************************************
  407. * CPU_IntSrcPrioSet()
  408. *
  409. * Description : Set priority of an interrupt source.
  410. *
  411. * Argument(s) : pos Position of interrupt vector in interrupt table (see 'CPU_IntSrcDis()').
  412. *
  413. * prio Priority. Use a lower priority number for a higher priority.
  414. *
  415. * Return(s) : none.
  416. *
  417. * Caller(s) : Application.
  418. *
  419. * Note(s) : (1) See 'CPU_IntSrcDis() Note #1'.
  420. *
  421. * (2) Several interrupts priorities CANNOT be set :
  422. *
  423. * (a) Reset (always -3).
  424. * (b) NMI (always -2).
  425. * (c) Hard fault (always -1).
  426. *
  427. * (3) See 'CPU_IntSrcDis() Note #3'.
  428. *********************************************************************************************************
  429. */
  430. void CPU_IntSrcPrioSet (CPU_INT08U pos,
  431. CPU_INT08U prio)
  432. {
  433. CPU_INT08U group;
  434. CPU_INT08U nbr;
  435. CPU_INT08U pos_max;
  436. CPU_INT32U temp;
  437. CPU_SR_ALLOC();
  438. switch (pos) {
  439. case CPU_INT_STK_PTR: /* ---------------- INVALID OR RESERVED --------------- */
  440. case CPU_INT_RSVD_07:
  441. case CPU_INT_RSVD_08:
  442. case CPU_INT_RSVD_09:
  443. case CPU_INT_RSVD_10:
  444. case CPU_INT_RSVD_13:
  445. break;
  446. /* ----------------- SYSTEM EXCEPTIONS ---------------- */
  447. case CPU_INT_RESET: /* Reset (see Note #2). */
  448. case CPU_INT_NMI: /* Non-maskable interrupt (see Note #2). */
  449. case CPU_INT_HFAULT: /* Hard fault (see Note #2). */
  450. break;
  451. case CPU_INT_MEM: /* Memory management. */
  452. CPU_CRITICAL_ENTER();
  453. temp = CPU_REG_NVIC_SHPRI1;
  454. temp &= ~(DEF_OCTET_MASK << (0 * DEF_OCTET_NBR_BITS));
  455. temp |= (prio << (0 * DEF_OCTET_NBR_BITS));
  456. CPU_REG_NVIC_SHPRI1 = temp;
  457. CPU_CRITICAL_EXIT();
  458. break;
  459. case CPU_INT_BUSFAULT: /* Bus fault. */
  460. CPU_CRITICAL_ENTER();
  461. temp = CPU_REG_NVIC_SHPRI1;
  462. temp &= ~(DEF_OCTET_MASK << (1 * DEF_OCTET_NBR_BITS));
  463. temp |= (prio << (1 * DEF_OCTET_NBR_BITS));
  464. CPU_REG_NVIC_SHPRI1 = temp;
  465. CPU_CRITICAL_EXIT();
  466. break;
  467. case CPU_INT_USAGEFAULT: /* Usage fault. */
  468. CPU_CRITICAL_ENTER();
  469. temp = CPU_REG_NVIC_SHPRI1;
  470. temp &= ~(DEF_OCTET_MASK << (2 * DEF_OCTET_NBR_BITS));
  471. temp |= (prio << (2 * DEF_OCTET_NBR_BITS));
  472. CPU_REG_NVIC_SHPRI1 = temp;
  473. CPU_CRITICAL_EXIT();
  474. break;
  475. case CPU_INT_SVCALL: /* SVCall. */
  476. CPU_CRITICAL_ENTER();
  477. temp = CPU_REG_NVIC_SHPRI2;
  478. temp &= ~((CPU_INT32U)DEF_OCTET_MASK << (3 * DEF_OCTET_NBR_BITS));
  479. temp |= (prio << (3 * DEF_OCTET_NBR_BITS));
  480. CPU_REG_NVIC_SHPRI2 = temp;
  481. CPU_CRITICAL_EXIT();
  482. break;
  483. case CPU_INT_DBGMON: /* Debug monitor. */
  484. CPU_CRITICAL_ENTER();
  485. temp = CPU_REG_NVIC_SHPRI3;
  486. temp &= ~(DEF_OCTET_MASK << (0 * DEF_OCTET_NBR_BITS));
  487. temp |= (prio << (0 * DEF_OCTET_NBR_BITS));
  488. CPU_REG_NVIC_SHPRI3 = temp;
  489. CPU_CRITICAL_EXIT();
  490. break;
  491. case CPU_INT_PENDSV: /* PendSV. */
  492. CPU_CRITICAL_ENTER();
  493. temp = CPU_REG_NVIC_SHPRI3;
  494. temp &= ~(DEF_OCTET_MASK << (2 * DEF_OCTET_NBR_BITS));
  495. temp |= (prio << (2 * DEF_OCTET_NBR_BITS));
  496. CPU_REG_NVIC_SHPRI3 = temp;
  497. CPU_CRITICAL_EXIT();
  498. break;
  499. case CPU_INT_SYSTICK: /* SysTick. */
  500. CPU_CRITICAL_ENTER();
  501. temp = CPU_REG_NVIC_SHPRI3;
  502. temp &= ~((CPU_INT32U)DEF_OCTET_MASK << (3 * DEF_OCTET_NBR_BITS));
  503. temp |= (prio << (3 * DEF_OCTET_NBR_BITS));
  504. CPU_REG_NVIC_SHPRI3 = temp;
  505. CPU_CRITICAL_EXIT();
  506. break;
  507. /* ---------------- EXTERNAL INTERRUPT ---------------- */
  508. default:
  509. pos_max = CPU_INT_SRC_POS_MAX;
  510. if (pos < pos_max) { /* See Note #3. */
  511. group = (pos - 16) / 4;
  512. nbr = (pos - 16) % 4;
  513. CPU_CRITICAL_ENTER();
  514. temp = CPU_REG_NVIC_PRIO(group);
  515. temp &= ~(DEF_OCTET_MASK << (nbr * DEF_OCTET_NBR_BITS));
  516. temp |= (prio << (nbr * DEF_OCTET_NBR_BITS));
  517. CPU_REG_NVIC_PRIO(group) = temp;
  518. CPU_CRITICAL_EXIT();
  519. }
  520. break;
  521. }
  522. }
  523. /*
  524. *********************************************************************************************************
  525. * CPU_IntSrcPrioGet()
  526. *
  527. * Description : Get priority of an interrupt source.
  528. *
  529. * Argument(s) : pos Position of interrupt vector in interrupt table (see 'CPU_IntSrcDis()').
  530. *
  531. * Return(s) : Priority of interrupt source. If the interrupt source specified is invalid, then
  532. * DEF_INT_16S_MIN_VAL is returned.
  533. *
  534. * Caller(s) : Application.
  535. *
  536. * Note(s) : (1) See 'CPU_IntSrcDis() Note #1'.
  537. *
  538. * (2) See 'CPU_IntSrcPrioSet() Note #2'.
  539. *
  540. * (3) See 'CPU_IntSrcDis() Note #3'.
  541. *********************************************************************************************************
  542. */
  543. CPU_INT16S CPU_IntSrcPrioGet (CPU_INT08U pos)
  544. {
  545. CPU_INT08U group;
  546. CPU_INT08U nbr;
  547. CPU_INT08U pos_max;
  548. CPU_INT16S prio;
  549. CPU_INT32U temp;
  550. CPU_SR_ALLOC();
  551. switch (pos) {
  552. case CPU_INT_STK_PTR: /* ---------------- INVALID OR RESERVED --------------- */
  553. case CPU_INT_RSVD_07:
  554. case CPU_INT_RSVD_08:
  555. case CPU_INT_RSVD_09:
  556. case CPU_INT_RSVD_10:
  557. case CPU_INT_RSVD_13:
  558. prio = DEF_INT_16S_MIN_VAL;
  559. break;
  560. /* ----------------- SYSTEM EXCEPTIONS ---------------- */
  561. case CPU_INT_RESET: /* Reset (see Note #2). */
  562. prio = -3;
  563. break;
  564. case CPU_INT_NMI: /* Non-maskable interrupt (see Note #2). */
  565. prio = -2;
  566. break;
  567. case CPU_INT_HFAULT: /* Hard fault (see Note #2). */
  568. prio = -1;
  569. break;
  570. case CPU_INT_MEM: /* Memory management. */
  571. CPU_CRITICAL_ENTER();
  572. temp = CPU_REG_NVIC_SHPRI1;
  573. prio = (temp >> (0 * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
  574. CPU_CRITICAL_EXIT();
  575. break;
  576. case CPU_INT_BUSFAULT: /* Bus fault. */
  577. CPU_CRITICAL_ENTER();
  578. temp = CPU_REG_NVIC_SHPRI1;
  579. prio = (temp >> (1 * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
  580. CPU_CRITICAL_EXIT();
  581. break;
  582. case CPU_INT_USAGEFAULT: /* Usage fault. */
  583. CPU_CRITICAL_ENTER();
  584. temp = CPU_REG_NVIC_SHPRI1;
  585. prio = (temp >> (2 * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
  586. break;
  587. case CPU_INT_SVCALL: /* SVCall. */
  588. CPU_CRITICAL_ENTER();
  589. temp = CPU_REG_NVIC_SHPRI2;
  590. prio = (temp >> (3 * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
  591. CPU_CRITICAL_EXIT();
  592. break;
  593. case CPU_INT_DBGMON: /* Debug monitor. */
  594. CPU_CRITICAL_ENTER();
  595. temp = CPU_REG_NVIC_SHPRI3;
  596. prio = (temp >> (0 * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
  597. CPU_CRITICAL_EXIT();
  598. break;
  599. case CPU_INT_PENDSV: /* PendSV. */
  600. CPU_CRITICAL_ENTER();
  601. temp = CPU_REG_NVIC_SHPRI3;
  602. prio = (temp >> (2 * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
  603. CPU_CRITICAL_EXIT();
  604. break;
  605. case CPU_INT_SYSTICK: /* SysTick. */
  606. CPU_CRITICAL_ENTER();
  607. temp = CPU_REG_NVIC_SHPRI3;
  608. prio = (temp >> (3 * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
  609. CPU_CRITICAL_EXIT();
  610. break;
  611. /* ---------------- EXTERNAL INTERRUPT ---------------- */
  612. default:
  613. pos_max = CPU_INT_SRC_POS_MAX;
  614. if (pos < pos_max) { /* See Note #3. */
  615. group = (pos - 16) / 4;
  616. nbr = (pos - 16) % 4;
  617. CPU_CRITICAL_ENTER();
  618. temp = CPU_REG_NVIC_PRIO(group);
  619. CPU_CRITICAL_EXIT();
  620. prio = (temp >> (nbr * DEF_OCTET_NBR_BITS)) & DEF_OCTET_MASK;
  621. } else {
  622. prio = DEF_INT_16S_MIN_VAL;
  623. }
  624. break;
  625. }
  626. return (prio);
  627. }
  628. #ifdef __cplusplus
  629. }
  630. #endif