cpu_c.c 30 KB

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