训练营PLSR题目
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 
 

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