hdl_interrupt.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. /******************************************************************//**
  2. * @file hdl_interrupt.c
  3. * @brief USART driver of RT-Thread RTOS for EFM32
  4. * COPYRIGHT (C) 2011, RT-Thread Development Team
  5. * @author onelife
  6. * @version 0.4 beta
  7. **********************************************************************
  8. * @section License
  9. * The license and distribution terms for this file may be found in the file LICENSE in this
  10. * distribution or at http://www.rt-thread.org/license/LICENSE
  11. **********************************************************************
  12. * @section Change Logs
  13. * Date Author Notes
  14. * 2010-12-29 onelife Initial creation for EFM32
  15. *********************************************************************/
  16. /* Includes ------------------------------------------------------------------*/
  17. #include "board.h"
  18. #include "hdl_interrupt.h"
  19. /******************************************************************//**
  20. * @addtogroup efm32
  21. * @{
  22. *********************************************************************/
  23. /* Private typedef -----------------------------------------------------------*/
  24. /* Private define ------------------------------------------------------------*/
  25. /* Private macro -------------------------------------------------------------*/
  26. /* Private variables ---------------------------------------------------------*/
  27. efm32_irq_hook_t dmaCbTable[DMA_CHAN_COUNT * 2] = {RT_NULL};
  28. efm32_irq_hook_t timerCbTable[TIMER_COUNT] = {RT_NULL};
  29. efm32_irq_hook_t rtcCbTable[RTC_COUNT] = {RT_NULL};
  30. efm32_irq_hook_t gpioCbTable[16] = {RT_NULL};
  31. efm32_irq_hook_t acmpCbTable[ACMP_COUNT] = {RT_NULL};
  32. efm32_irq_hook_t usartCbTable[USART_COUNT * 2] = {RT_NULL};
  33. /* Private function prototypes -----------------------------------------------*/
  34. /* Private functions ---------------------------------------------------------*/
  35. /******************************************************************//**
  36. * @brief
  37. * NMI exception handler
  38. *
  39. * @details
  40. *
  41. * @note
  42. *********************************************************************/
  43. void NMI_Handler(void)
  44. {
  45. #ifdef RT_IRQHDL_DEBUG
  46. rt_kprintf("[NMI_Handler: NOP]\n");
  47. #endif
  48. }
  49. /******************************************************************//**
  50. * @brief
  51. * Memory manage exception handler
  52. *
  53. * @details
  54. *
  55. * @note
  56. *********************************************************************/
  57. void MemManage_Handler(void)
  58. {
  59. #ifdef RT_IRQHDL_DEBUG
  60. rt_kprintf("[MemManage_Handler: infinite loop]\n");
  61. #endif
  62. while (1);
  63. }
  64. /******************************************************************//**
  65. * @brief
  66. * Bus fault exception handler
  67. *
  68. * @details
  69. *
  70. * @note
  71. *********************************************************************/
  72. void BusFault_Handler(void)
  73. {
  74. #ifdef RT_IRQHDL_DEBUG
  75. rt_kprintf("[BusFault_Handler: infinite loop]\n");
  76. #endif
  77. while (1);
  78. }
  79. /******************************************************************//**
  80. * @brief
  81. * Usage fault exception handler
  82. *
  83. * @details
  84. *
  85. * @note
  86. *********************************************************************/
  87. void UsageFault_Handler(void)
  88. {
  89. #ifdef RT_IRQHDL_DEBUG
  90. rt_kprintf("[UsageFault_Handler: infinite loop]\n");
  91. #endif
  92. while (1);
  93. }
  94. /******************************************************************//**
  95. * @brief
  96. * Supervisor call exception handler
  97. *
  98. * @details
  99. *
  100. * @note
  101. *********************************************************************/
  102. void SVC_Handler(void)
  103. {
  104. #ifdef RT_IRQHDL_DEBUG
  105. rt_kprintf("[SVC_Handler: NOP]\n");
  106. #endif
  107. }
  108. /******************************************************************//**
  109. * @brief
  110. * Debug monitor exception handler
  111. *
  112. * @details
  113. *
  114. * @note
  115. *********************************************************************/
  116. void DebugMon_Handler(void)
  117. {
  118. #ifdef RT_IRQHDL_DEBUG
  119. rt_kprintf("[DebugMon_Handler: NOP]\n");
  120. #endif
  121. }
  122. /******************************************************************//**
  123. * @brief
  124. * System tick timer interrupt handler
  125. *
  126. * @details
  127. *
  128. * @note
  129. *
  130. *********************************************************************/
  131. void rt_hw_timer_handler(void)
  132. {
  133. /* enter interrupt */
  134. rt_interrupt_enter();
  135. rt_tick_increase();
  136. /* leave interrupt */
  137. rt_interrupt_leave();
  138. }
  139. /**********************************************************************
  140. * STM32F10x Peripherals Interrupt Handlers
  141. * Add here the Interrupt Handler for the used peripheral(s) (PPP), for the
  142. * available peripheral interrupt handler's name please refer to the startup
  143. * file (startup_stm32f10x_xx.s).
  144. /*********************************************************************/
  145. /******************************************************************//**
  146. * @brief
  147. * Common DMA interrupt handler
  148. *
  149. * @details
  150. *
  151. * @note
  152. *
  153. *********************************************************************/
  154. void DMA_IRQHandler_All(unsigned int channel, bool primary, void *user)
  155. {
  156. /* enter interrupt */
  157. rt_interrupt_enter();
  158. /* invoke callback function */
  159. if (dmaCbTable[channel].cbFunc != RT_NULL)
  160. {
  161. (dmaCbTable[channel].cbFunc)(dmaCbTable[channel].userPtr);
  162. }
  163. /* leave interrupt */
  164. rt_interrupt_leave();
  165. }
  166. /******************************************************************//**
  167. * @brief
  168. * Common Timer2 interrupt handler
  169. *
  170. * @details
  171. * This function handles Timer2 counter overflow interrupt request
  172. *
  173. * @note
  174. *
  175. *********************************************************************/
  176. void TIMER2_IRQHandler(void)
  177. {
  178. if (TIMER2->IF & TIMER_IF_OF)
  179. {
  180. /* invoke callback function */
  181. if (timerCbTable[2].cbFunc != RT_NULL)
  182. {
  183. (timerCbTable[2].cbFunc)(timerCbTable[2].userPtr);
  184. }
  185. /* clear interrupt */
  186. BITBAND_Peripheral(&(TIMER2->IFC), _TIMER_IF_OF_SHIFT, 0x1UL);
  187. }
  188. }
  189. /******************************************************************//**
  190. * @brief
  191. * Common RTC interrupt handler
  192. *
  193. * @details
  194. * This function handles RTC counter overflow interrupt request
  195. *
  196. * @note
  197. *
  198. *********************************************************************/
  199. void RTC_IRQHandler(void)
  200. {
  201. /* enter interrupt */
  202. rt_interrupt_enter();
  203. if (RTC->IF & RTC_IF_OF)
  204. {
  205. /* invoke callback function */
  206. if (rtcCbTable[0].cbFunc != RT_NULL)
  207. {
  208. (rtcCbTable[0].cbFunc)(rtcCbTable[0].userPtr);
  209. }
  210. }
  211. /* leave interrupt */
  212. rt_interrupt_leave();
  213. }
  214. /******************************************************************//**
  215. * @brief
  216. * Common even number GPIO interrupt handler
  217. *
  218. * @details
  219. *
  220. * @note
  221. *
  222. *********************************************************************/
  223. void GPIO_EVEN_IRQHandler(void)
  224. {
  225. rt_uint16_t flag, n;
  226. /* enter interrupt */
  227. rt_interrupt_enter();
  228. /* invoke callback function */
  229. flag = (rt_uint16_t)(GPIO->IF & 0xFFFF);
  230. for ( n = 0; flag > 0; flag = flag >> 2, n = n + 2)
  231. {
  232. if ((flag & 0x0001) && (gpioCbTable[n].cbFunc != RT_NULL))
  233. {
  234. (gpioCbTable[n].cbFunc)(gpioCbTable[n].userPtr);
  235. }
  236. }
  237. /* clear interrupt */
  238. GPIO->IFC = 0x5555UL;
  239. /* leave interrupt */
  240. rt_interrupt_leave();
  241. }
  242. /******************************************************************//**
  243. * @brief
  244. * Common odd number GPIO interrupt handler
  245. *
  246. * @details
  247. *
  248. * @note
  249. *
  250. *********************************************************************/
  251. void GPIO_ODD_IRQHandler(void)
  252. {
  253. rt_uint16_t flag, n;
  254. /* enter interrupt */
  255. rt_interrupt_enter();
  256. /* invoke callback function */
  257. flag = (rt_uint16_t)(GPIO->IF & 0xFFFF) >> 1;
  258. for ( n = 1; flag > 0; flag = flag >> 2, n = n + 2)
  259. {
  260. if ((flag & 0x0001) && (gpioCbTable[n].cbFunc != RT_NULL))
  261. {
  262. (gpioCbTable[n].cbFunc)(gpioCbTable[n].userPtr);
  263. }
  264. }
  265. /* clear interrupt */
  266. GPIO->IFC = 0xAAAAUL;
  267. /* leave interrupt */
  268. rt_interrupt_leave();
  269. }
  270. /******************************************************************//**
  271. * @brief
  272. * Common ACMP interrupt handler
  273. *
  274. * @details
  275. * This function handles ACMP edge trigger interrupt request
  276. *
  277. * @note
  278. *
  279. *********************************************************************/
  280. void ACMP0_IRQHandler(void)
  281. {
  282. /* enter interrupt */
  283. rt_interrupt_enter();
  284. if (ACMP0->IF & ACMP_IF_EDGE)
  285. {
  286. /* invoke callback function */
  287. if (acmpCbTable[0].cbFunc != RT_NULL)
  288. {
  289. (acmpCbTable[0].cbFunc)(acmpCbTable[0].userPtr);
  290. }
  291. /* clear interrupt */
  292. BITBAND_Peripheral(&(ACMP0->IFC), _ACMP_IF_EDGE_SHIFT, 0x1UL);
  293. }
  294. if (ACMP1->IF & ACMP_IF_EDGE)
  295. {
  296. /* invoke callback function */
  297. if (acmpCbTable[1].cbFunc != RT_NULL)
  298. {
  299. (acmpCbTable[1].cbFunc)(acmpCbTable[1].userPtr);
  300. }
  301. /* clear interrupt */
  302. BITBAND_Peripheral(&(ACMP1->IFC), _ACMP_IF_EDGE_SHIFT, 0x1UL);
  303. }
  304. /* leave interrupt */
  305. rt_interrupt_leave();
  306. }
  307. /******************************************************************//**
  308. * @brief
  309. * Common USART0 TX interrupt handler
  310. *
  311. * @details
  312. * This function handles USART0 TX complete interrupt request
  313. *
  314. * @note
  315. *
  316. *********************************************************************/
  317. void USART0_TX_IRQHandler(void)
  318. {
  319. /* enter interrupt */
  320. rt_interrupt_enter();
  321. if (USART0->IF & USART_IF_TXC)
  322. {
  323. /* invoke callback function */
  324. if (usartCbTable[0].cbFunc != RT_NULL)
  325. {
  326. (usartCbTable[0].cbFunc)(usartCbTable[0].userPtr);
  327. }
  328. /* clear interrupt */
  329. BITBAND_Peripheral(&(USART0->IFC), _USART_IF_TXC_SHIFT, 0x1UL);
  330. }
  331. /* leave interrupt */
  332. rt_interrupt_leave();
  333. }
  334. /******************************************************************//**
  335. * @brief
  336. * Common USART0 RX interrupt handler
  337. *
  338. * @details
  339. * This function handles USART0 RX data valid interrupt request
  340. *
  341. * @note
  342. *
  343. *********************************************************************/
  344. void USART0_RX_IRQHandler(void)
  345. {
  346. if (USART0->IF & USART_IF_RXDATAV)
  347. {
  348. /* invoke callback function */
  349. if (usartCbTable[1].cbFunc != RT_NULL)
  350. {
  351. (usartCbTable[1].cbFunc)(usartCbTable[1].userPtr);
  352. }
  353. }
  354. }
  355. /******************************************************************//**
  356. * @brief
  357. * Common USART1 TX interrupt handler
  358. *
  359. * @details
  360. * This function handles USART1 TX complete interrupt request
  361. *
  362. * @note
  363. *
  364. *********************************************************************/
  365. void USART1_TX_IRQHandler(void)
  366. {
  367. /* enter interrupt */
  368. rt_interrupt_enter();
  369. if (USART1->IF & USART_IF_TXC)
  370. {
  371. /* invoke callback function */
  372. if (usartCbTable[2].cbFunc != RT_NULL)
  373. {
  374. (usartCbTable[2].cbFunc)(usartCbTable[2].userPtr);
  375. }
  376. /* clear interrupt */
  377. BITBAND_Peripheral(&(USART1->IFC), _USART_IF_TXC_SHIFT, 0x1UL);
  378. }
  379. /* leave interrupt */
  380. rt_interrupt_leave();
  381. }
  382. /******************************************************************//**
  383. * @brief
  384. * Common USART1 RX interrupt handler
  385. *
  386. * @details
  387. * This function handles USART1 RX data valid interrupt request
  388. *
  389. * @note
  390. *
  391. *********************************************************************/
  392. void USART1_RX_IRQHandler(void)
  393. {
  394. if (USART1->IF & USART_IF_RXDATAV)
  395. {
  396. /* invoke callback function */
  397. if (usartCbTable[3].cbFunc != RT_NULL)
  398. {
  399. (usartCbTable[3].cbFunc)(usartCbTable[3].userPtr);
  400. }
  401. }
  402. }
  403. /******************************************************************//**
  404. * @brief
  405. * Common USART2 TX interrupt handler
  406. *
  407. * @details
  408. * This function handles USART2 TX complete interrupt request
  409. *
  410. * @note
  411. *
  412. *********************************************************************/
  413. void USART2_TX_IRQHandler(void)
  414. {
  415. /* enter interrupt */
  416. rt_interrupt_enter();
  417. if (USART2->IF & USART_IF_TXC)
  418. {
  419. /* invoke callback function */
  420. if (usartCbTable[4].cbFunc != RT_NULL)
  421. {
  422. (usartCbTable[4].cbFunc)(usartCbTable[4].userPtr);
  423. }
  424. /* clear interrupt */
  425. BITBAND_Peripheral(&(USART2->IFC), _USART_IF_TXC_SHIFT, 0x1UL);
  426. }
  427. /* leave interrupt */
  428. rt_interrupt_leave();
  429. }
  430. /******************************************************************//**
  431. * @brief
  432. * Common USART2 RX interrupt handler
  433. *
  434. * @details
  435. * This function handles USART2 RX data valid interrupt request
  436. *
  437. * @note
  438. *
  439. *********************************************************************/
  440. void USART2_RX_IRQHandler(void)
  441. {
  442. if (USART2->IF & USART_IF_RXDATAV)
  443. {
  444. /* invoke callback function */
  445. if (usartCbTable[5].cbFunc != RT_NULL)
  446. {
  447. (usartCbTable[5].cbFunc)(usartCbTable[5].userPtr);
  448. }
  449. }
  450. }
  451. /******************************************************************//**
  452. * @brief
  453. * EFM32 common interrupt handlers register function
  454. *
  455. * @details
  456. *
  457. * @note
  458. *
  459. *********************************************************************/
  460. rt_err_t efm32_irq_hook_register(efm32_irq_hook_init_t *hook)
  461. {
  462. switch (hook->type)
  463. {
  464. case efm32_irq_type_dma:
  465. dmaCbTable[hook->unit].cbFunc = hook->cbFunc;
  466. dmaCbTable[hook->unit].userPtr = hook->userPtr;
  467. break;
  468. case efm32_irq_type_rtc:
  469. rtcCbTable[hook->unit].cbFunc = hook->cbFunc;
  470. rtcCbTable[hook->unit].userPtr = hook->userPtr;
  471. break;
  472. case efm32_irq_type_timer:
  473. timerCbTable[hook->unit].cbFunc = hook->cbFunc;
  474. timerCbTable[hook->unit].userPtr = hook->userPtr;
  475. break;
  476. case efm32_irq_type_gpio:
  477. gpioCbTable[hook->unit].cbFunc = hook->cbFunc;
  478. gpioCbTable[hook->unit].userPtr = hook->userPtr;
  479. break;
  480. case efm32_irq_type_acmp:
  481. acmpCbTable[hook->unit].cbFunc = hook->cbFunc;
  482. acmpCbTable[hook->unit].userPtr = hook->userPtr;
  483. break;
  484. case efm32_irq_type_usart:
  485. usartCbTable[hook->unit].cbFunc = hook->cbFunc;
  486. usartCbTable[hook->unit].userPtr = hook->userPtr;
  487. break;
  488. default:
  489. break;
  490. }
  491. #ifdef RT_IRQHDL_DEBUG
  492. rt_kprintf("Hook Registered: type: %s, unit: %x, cbFunc: %x, userPtr: %x\n", \
  493. hook->type, hook->unit, hook->cbFunc, hook->userPtr);
  494. #endif
  495. }
  496. /******************************************************************//**
  497. * @}
  498. *********************************************************************/