hdl_interrupt.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808
  1. /***************************************************************************//**
  2. * @file hdl_interrupt.c
  3. * @brief Interrupt handler 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
  10. * LICENSE in this 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. * 2011-07-12 onelife Disable interrupts in GPIO handler
  16. * 2011-12-09 onelife Add giant gecko support
  17. * 2011-12-09 onelife Add UART module support
  18. * 2011-12-09 onelife Add LEUART module support
  19. * 2011-12-27 onelife Utilize "XXX_PRESENT" and "XXX_COUNT"
  20. ******************************************************************************/
  21. /* Includes ------------------------------------------------------------------*/
  22. #include "board.h"
  23. #include "hdl_interrupt.h"
  24. /***************************************************************************//**
  25. * @addtogroup efm32
  26. * @{
  27. ******************************************************************************/
  28. /* Private typedef -----------------------------------------------------------*/
  29. /* Private define ------------------------------------------------------------*/
  30. /* Private macro -------------------------------------------------------------*/
  31. #ifdef RT_IRQHDL_DEBUG
  32. #define hdl_debug(format,args...) rt_kprintf(format, ##args)
  33. #else
  34. #define hdl_debug(format,args...)
  35. #endif
  36. /* Private variables ---------------------------------------------------------*/
  37. efm32_irq_hook_t dmaCbTable[DMA_CHAN_COUNT * 2] = {RT_NULL};
  38. efm32_irq_hook_t timerCbTable[TIMER_COUNT] = {RT_NULL};
  39. efm32_irq_hook_t rtcCbTable[RTC_COUNT] = {RT_NULL};
  40. efm32_irq_hook_t gpioCbTable[16] = {RT_NULL};
  41. efm32_irq_hook_t acmpCbTable[ACMP_COUNT] = {RT_NULL};
  42. #if defined(USART_PRESENT)
  43. #if defined(UART_PRESENT)
  44. efm32_irq_hook_t usartCbTable[USART_COUNT * 2 + UART_COUNT * 2] = {RT_NULL};
  45. #else
  46. efm32_irq_hook_t usartCbTable[USART_COUNT * 2] = {RT_NULL};
  47. #endif
  48. #endif
  49. #if defined(LEUART_PRESENT)
  50. efm32_irq_hook_t leuartCbTable[LEUART_COUNT] = {RT_NULL};
  51. #endif
  52. #if defined(I2C_PRESENT)
  53. efm32_irq_hook_t iicCbTable[I2C_COUNT] = {RT_NULL};
  54. #endif
  55. /* Private function prototypes -----------------------------------------------*/
  56. /* Private functions ---------------------------------------------------------*/
  57. /***************************************************************************//**
  58. * @brief
  59. * NMI exception handler
  60. *
  61. * @details
  62. *
  63. * @note
  64. ******************************************************************************/
  65. void NMI_Handler(void)
  66. {
  67. hdl_debug("[NMI_Handler: NOP]\n");
  68. }
  69. /***************************************************************************//**
  70. * @brief
  71. * Memory manage exception handler
  72. *
  73. * @details
  74. *
  75. * @note
  76. ******************************************************************************/
  77. void MemManage_Handler(void)
  78. {
  79. hdl_debug("[MemManage_Handler: infinite loop]\n");
  80. while (1);
  81. }
  82. /***************************************************************************//**
  83. * @brief
  84. * Bus fault exception handler
  85. *
  86. * @details
  87. *
  88. * @note
  89. ******************************************************************************/
  90. void BusFault_Handler(void)
  91. {
  92. hdl_debug("[BusFault_Handler: infinite loop]\n");
  93. while (1);
  94. }
  95. /***************************************************************************//**
  96. * @brief
  97. * Usage fault exception handler
  98. *
  99. * @details
  100. *
  101. * @note
  102. ******************************************************************************/
  103. void UsageFault_Handler(void)
  104. {
  105. hdl_debug("[UsageFault_Handler: infinite loop]\n");
  106. while (1);
  107. }
  108. /***************************************************************************//**
  109. * @brief
  110. * Supervisor call exception handler
  111. *
  112. * @details
  113. *
  114. * @note
  115. ******************************************************************************/
  116. void SVC_Handler(void)
  117. {
  118. hdl_debug("[SVC_Handler: NOP]\n");
  119. }
  120. /***************************************************************************//**
  121. * @brief
  122. * Debug monitor exception handler
  123. *
  124. * @details
  125. *
  126. * @note
  127. ******************************************************************************/
  128. void DebugMon_Handler(void)
  129. {
  130. hdl_debug("[DebugMon_Handler: NOP]\n");
  131. }
  132. /***************************************************************************//**
  133. * @brief
  134. * System tick timer interrupt handler
  135. *
  136. * @details
  137. *
  138. * @note
  139. *
  140. ******************************************************************************/
  141. void SysTick_Handler(void)
  142. {
  143. /* enter interrupt */
  144. rt_interrupt_enter();
  145. rt_tick_increase();
  146. /* leave interrupt */
  147. rt_interrupt_leave();
  148. }
  149. /*******************************************************************************
  150. * STM32F10x Peripherals Interrupt Handlers
  151. * Add here the Interrupt Handler for the used peripheral(s) (PPP), for the
  152. * available peripheral interrupt handler's name please refer to the startup
  153. * file (startup_stm32f10x_xx.s).
  154. /******************************************************************************/
  155. /***************************************************************************//**
  156. * @brief
  157. * Common DMA interrupt handler
  158. *
  159. * @details
  160. *
  161. * @note
  162. *
  163. ******************************************************************************/
  164. void DMA_IRQHandler_All(rt_uint32_t channel, rt_bool_t primary, void *user)
  165. {
  166. /* enter interrupt */
  167. rt_interrupt_enter();
  168. /* invoke callback function */
  169. if (dmaCbTable[channel].cbFunc != RT_NULL)
  170. {
  171. (dmaCbTable[channel].cbFunc)(dmaCbTable[channel].userPtr);
  172. }
  173. /* leave interrupt */
  174. rt_interrupt_leave();
  175. }
  176. /***************************************************************************//**
  177. * @brief
  178. * Common Timer1 interrupt handler
  179. *
  180. * @details
  181. * This function handles Timer1 counter overflow interrupt request
  182. *
  183. * @note
  184. *
  185. ******************************************************************************/
  186. void TIMER1_IRQHandler(void)
  187. {
  188. if (TIMER1->IF & TIMER_IF_OF)
  189. {
  190. /* invoke callback function */
  191. if (timerCbTable[1].cbFunc != RT_NULL)
  192. {
  193. (timerCbTable[1].cbFunc)(timerCbTable[1].userPtr);
  194. }
  195. /* clear interrupt */
  196. BITBAND_Peripheral(&(TIMER1->IFC), _TIMER_IF_OF_SHIFT, 0x1UL);
  197. }
  198. }
  199. /***************************************************************************//**
  200. * @brief
  201. * Common Timer2 interrupt handler
  202. *
  203. * @details
  204. * This function handles Timer2 counter overflow interrupt request
  205. *
  206. * @note
  207. *
  208. ******************************************************************************/
  209. void TIMER2_IRQHandler(void)
  210. {
  211. if (TIMER2->IF & TIMER_IF_OF)
  212. {
  213. /* invoke callback function */
  214. if (timerCbTable[2].cbFunc != RT_NULL)
  215. {
  216. (timerCbTable[2].cbFunc)(timerCbTable[2].userPtr);
  217. }
  218. /* clear interrupt */
  219. BITBAND_Peripheral(&(TIMER2->IFC), _TIMER_IF_OF_SHIFT, 0x1UL);
  220. }
  221. }
  222. /***************************************************************************//**
  223. * @brief
  224. * Common RTC interrupt handler
  225. *
  226. * @details
  227. * This function handles RTC counter overflow interrupt request
  228. *
  229. * @note
  230. *
  231. ******************************************************************************/
  232. void RTC_IRQHandler(void)
  233. {
  234. /* enter interrupt */
  235. rt_interrupt_enter();
  236. if (RTC->IF & RTC_IF_OF)
  237. {
  238. /* invoke callback function */
  239. if (rtcCbTable[0].cbFunc != RT_NULL)
  240. {
  241. (rtcCbTable[0].cbFunc)(rtcCbTable[0].userPtr);
  242. }
  243. }
  244. /* leave interrupt */
  245. rt_interrupt_leave();
  246. }
  247. /***************************************************************************//**
  248. * @brief
  249. * Common even number GPIO interrupt handler
  250. *
  251. * @details
  252. *
  253. * @note
  254. *
  255. ******************************************************************************/
  256. void GPIO_EVEN_IRQHandler(void)
  257. {
  258. rt_uint16_t flag, n;
  259. rt_base_t level;
  260. /* Disable interrupt */
  261. level = rt_hw_interrupt_disable();
  262. /* Enter ISR */
  263. rt_interrupt_enter();
  264. /* invoke callback function */
  265. flag = (rt_uint16_t)(GPIO->IF & 0xFFFF);
  266. for ( n = 0; flag > 0; flag = flag >> 2, n = n + 2)
  267. {
  268. if ((flag & 0x0001) && (gpioCbTable[n].cbFunc != RT_NULL))
  269. {
  270. (gpioCbTable[n].cbFunc)(gpioCbTable[n].userPtr);
  271. }
  272. }
  273. /* clear interrupt */
  274. GPIO->IFC = 0x5555UL;
  275. /* Leave ISR */
  276. rt_interrupt_leave();
  277. /* Enable interrupt */
  278. rt_hw_interrupt_enable(level);
  279. }
  280. /***************************************************************************//**
  281. * @brief
  282. * Common odd number GPIO interrupt handler
  283. *
  284. * @details
  285. *
  286. * @note
  287. *
  288. ******************************************************************************/
  289. void GPIO_ODD_IRQHandler(void)
  290. {
  291. rt_uint16_t flag, n;
  292. rt_base_t level;
  293. /* Disable interrupt */
  294. level = rt_hw_interrupt_disable();
  295. /* Enter ISR */
  296. rt_interrupt_enter();
  297. /* invoke callback function */
  298. flag = (rt_uint16_t)(GPIO->IF & 0xFFFF) >> 1;
  299. for ( n = 1; flag > 0; flag = flag >> 2, n = n + 2)
  300. {
  301. if ((flag & 0x0001) && (gpioCbTable[n].cbFunc != RT_NULL))
  302. {
  303. (gpioCbTable[n].cbFunc)(gpioCbTable[n].userPtr);
  304. }
  305. }
  306. /* clear interrupt */
  307. GPIO->IFC = 0xAAAAUL;
  308. /* Leave ISR */
  309. rt_interrupt_leave();
  310. /* Enable interrupt */
  311. rt_hw_interrupt_enable(level);
  312. }
  313. /***************************************************************************//**
  314. * @brief
  315. * Common ACMP interrupt handler
  316. *
  317. * @details
  318. * This function handles ACMP edge trigger interrupt request
  319. *
  320. * @note
  321. *
  322. ******************************************************************************/
  323. void ACMP0_IRQHandler(void)
  324. {
  325. /* enter interrupt */
  326. rt_interrupt_enter();
  327. if (ACMP0->IF & ACMP_IF_EDGE)
  328. {
  329. /* invoke callback function */
  330. if (acmpCbTable[0].cbFunc != RT_NULL)
  331. {
  332. (acmpCbTable[0].cbFunc)(acmpCbTable[0].userPtr);
  333. }
  334. /* clear interrupt */
  335. BITBAND_Peripheral(&(ACMP0->IFC), _ACMP_IF_EDGE_SHIFT, 0x1UL);
  336. }
  337. if (ACMP1->IF & ACMP_IF_EDGE)
  338. {
  339. /* invoke callback function */
  340. if (acmpCbTable[1].cbFunc != RT_NULL)
  341. {
  342. (acmpCbTable[1].cbFunc)(acmpCbTable[1].userPtr);
  343. }
  344. /* clear interrupt */
  345. BITBAND_Peripheral(&(ACMP1->IFC), _ACMP_IF_EDGE_SHIFT, 0x1UL);
  346. }
  347. /* leave interrupt */
  348. rt_interrupt_leave();
  349. }
  350. #if defined(USART_PRESENT)
  351. /***************************************************************************//**
  352. * @brief
  353. * Common USART0 TX interrupt handler
  354. *
  355. * @details
  356. * This function handles USART0 TX complete interrupt request
  357. *
  358. * @note
  359. *
  360. ******************************************************************************/
  361. void USART0_TX_IRQHandler(void)
  362. {
  363. /* enter interrupt */
  364. rt_interrupt_enter();
  365. if (USART0->IF & USART_IF_TXC)
  366. {
  367. /* invoke callback function */
  368. if (usartCbTable[0].cbFunc != RT_NULL)
  369. {
  370. (usartCbTable[0].cbFunc)(usartCbTable[0].userPtr);
  371. }
  372. /* clear interrupt */
  373. BITBAND_Peripheral(&(USART0->IFC), _USART_IF_TXC_SHIFT, 0x1UL);
  374. }
  375. /* leave interrupt */
  376. rt_interrupt_leave();
  377. }
  378. /***************************************************************************//**
  379. * @brief
  380. * Common USART0 RX interrupt handler
  381. *
  382. * @details
  383. * This function handles USART0 RX data valid interrupt request
  384. *
  385. * @note
  386. *
  387. ******************************************************************************/
  388. void USART0_RX_IRQHandler(void)
  389. {
  390. if (USART0->IF & USART_IF_RXDATAV)
  391. {
  392. /* invoke callback function */
  393. if (usartCbTable[1].cbFunc != RT_NULL)
  394. {
  395. (usartCbTable[1].cbFunc)(usartCbTable[1].userPtr);
  396. }
  397. }
  398. }
  399. #endif
  400. #if (defined(USART_PRESENT) && (USART_COUNT > 1))
  401. /***************************************************************************//**
  402. * @brief
  403. * Common USART1 TX interrupt handler
  404. *
  405. * @details
  406. * This function handles USART1 TX complete interrupt request
  407. *
  408. * @note
  409. *
  410. ******************************************************************************/
  411. void USART1_TX_IRQHandler(void)
  412. {
  413. /* enter interrupt */
  414. rt_interrupt_enter();
  415. if (USART1->IF & USART_IF_TXC)
  416. {
  417. /* invoke callback function */
  418. if (usartCbTable[2].cbFunc != RT_NULL)
  419. {
  420. (usartCbTable[2].cbFunc)(usartCbTable[2].userPtr);
  421. }
  422. /* clear interrupt */
  423. BITBAND_Peripheral(&(USART1->IFC), _USART_IF_TXC_SHIFT, 0x1UL);
  424. }
  425. /* leave interrupt */
  426. rt_interrupt_leave();
  427. }
  428. /***************************************************************************//**
  429. * @brief
  430. * Common USART1 RX interrupt handler
  431. *
  432. * @details
  433. * This function handles USART1 RX data valid interrupt request
  434. *
  435. * @note
  436. *
  437. ******************************************************************************/
  438. void USART1_RX_IRQHandler(void)
  439. {
  440. if (USART1->IF & USART_IF_RXDATAV)
  441. {
  442. /* invoke callback function */
  443. if (usartCbTable[3].cbFunc != RT_NULL)
  444. {
  445. (usartCbTable[3].cbFunc)(usartCbTable[3].userPtr);
  446. }
  447. }
  448. }
  449. #endif
  450. #if (defined(USART_PRESENT) && (USART_COUNT > 2))
  451. /***************************************************************************//**
  452. * @brief
  453. * Common USART2 TX interrupt handler
  454. *
  455. * @details
  456. * This function handles USART2 TX complete interrupt request
  457. *
  458. * @note
  459. *
  460. ******************************************************************************/
  461. void USART2_TX_IRQHandler(void)
  462. {
  463. /* enter interrupt */
  464. rt_interrupt_enter();
  465. if (USART2->IF & USART_IF_TXC)
  466. {
  467. /* invoke callback function */
  468. if (usartCbTable[4].cbFunc != RT_NULL)
  469. {
  470. (usartCbTable[4].cbFunc)(usartCbTable[4].userPtr);
  471. }
  472. /* clear interrupt */
  473. BITBAND_Peripheral(&(USART2->IFC), _USART_IF_TXC_SHIFT, 0x1UL);
  474. }
  475. /* leave interrupt */
  476. rt_interrupt_leave();
  477. }
  478. /***************************************************************************//**
  479. * @brief
  480. * Common USART2 RX interrupt handler
  481. *
  482. * @details
  483. * This function handles USART2 RX data valid interrupt request
  484. *
  485. * @note
  486. *
  487. ******************************************************************************/
  488. void USART2_RX_IRQHandler(void)
  489. {
  490. if (USART2->IF & USART_IF_RXDATAV)
  491. {
  492. /* invoke callback function */
  493. if (usartCbTable[5].cbFunc != RT_NULL)
  494. {
  495. (usartCbTable[5].cbFunc)(usartCbTable[5].userPtr);
  496. }
  497. }
  498. }
  499. #endif
  500. #if defined(UART_PRESENT)
  501. /***************************************************************************//**
  502. * @brief
  503. * Common UART0 TX interrupt handler
  504. *
  505. * @details
  506. * This function handles UART0 TX complete interrupt request
  507. *
  508. * @note
  509. *
  510. ******************************************************************************/
  511. void UART0_TX_IRQHandler(void)
  512. {
  513. /* enter interrupt */
  514. rt_interrupt_enter();
  515. if (UART0->IF & UART_IF_TXC)
  516. {
  517. /* invoke callback function */
  518. if (usartCbTable[USART_COUNT * 2].cbFunc != RT_NULL)
  519. {
  520. (usartCbTable[USART_COUNT * 2].cbFunc)(usartCbTable[USART_COUNT * 2].userPtr);
  521. }
  522. /* clear interrupt */
  523. BITBAND_Peripheral(&(UART0->IFC), _UART_IF_TXC_SHIFT, 0x1UL);
  524. }
  525. /* leave interrupt */
  526. rt_interrupt_leave();
  527. }
  528. /***************************************************************************//**
  529. * @brief
  530. * Common UART0 RX interrupt handler
  531. *
  532. * @details
  533. * This function handles UART0 RX data valid interrupt request
  534. *
  535. * @note
  536. *
  537. ******************************************************************************/
  538. void UART0_RX_IRQHandler(void)
  539. {
  540. if (UART0->IF & UART_IF_RXDATAV)
  541. {
  542. /* invoke callback function */
  543. if (usartCbTable[USART_COUNT * 2 + 1].cbFunc != RT_NULL)
  544. {
  545. (usartCbTable[USART_COUNT * 2 + 1].cbFunc)(usartCbTable[USART_COUNT * 2 + 1].userPtr);
  546. }
  547. }
  548. }
  549. #endif
  550. #if (defined(UART_PRESENT) && (UART_COUNT > 1))
  551. /***************************************************************************//**
  552. * @brief
  553. * Common UART1 TX interrupt handler
  554. *
  555. * @details
  556. * This function handles UART1 TX complete interrupt request
  557. *
  558. * @note
  559. *
  560. ******************************************************************************/
  561. void UART1_TX_IRQHandler(void)
  562. {
  563. /* enter interrupt */
  564. rt_interrupt_enter();
  565. if (UART1->IF & UART_IF_TXC)
  566. {
  567. /* invoke callback function */
  568. if (usartCbTable[USART_COUNT * 2 + 2].cbFunc != RT_NULL)
  569. {
  570. (usartCbTable[USART_COUNT * 2 + 2].cbFunc)(usartCbTable[USART_COUNT * 2 + 2].userPtr);
  571. }
  572. /* clear interrupt */
  573. BITBAND_Peripheral(&(UART1->IFC), _UART_IF_TXC_SHIFT, 0x1UL);
  574. }
  575. /* leave interrupt */
  576. rt_interrupt_leave();
  577. }
  578. /***************************************************************************//**
  579. * @brief
  580. * Common UART1 RX interrupt handler
  581. *
  582. * @details
  583. * This function handles UART1 RX data valid interrupt request
  584. *
  585. * @note
  586. *
  587. ******************************************************************************/
  588. void UART1_RX_IRQHandler(void)
  589. {
  590. if (UART1->IF & UART_IF_RXDATAV)
  591. {
  592. /* invoke callback function */
  593. if (usartCbTable[USART_COUNT * 2 + 3].cbFunc != RT_NULL)
  594. {
  595. (usartCbTable[USART_COUNT * 2 + 3].cbFunc)(usartCbTable[USART_COUNT * 2 + 3].userPtr);
  596. }
  597. }
  598. }
  599. #endif
  600. #if defined(LEUART_PRESENT)
  601. /***************************************************************************//**
  602. * @brief
  603. * Common LEUART0 interrupt handler
  604. *
  605. * @details
  606. * This function handles LEUART0 interrupt request
  607. *
  608. * @note
  609. *
  610. ******************************************************************************/
  611. void LEUART0_IRQHandler(void)
  612. {
  613. if (LEUART0->IF & LEUART_IF_RXDATAV)
  614. {
  615. /* invoke callback function */
  616. if (leuartCbTable[0].cbFunc != RT_NULL)
  617. {
  618. (leuartCbTable[0].cbFunc)(leuartCbTable[0].userPtr);
  619. }
  620. }
  621. }
  622. #endif
  623. #if (defined(LEUART_PRESENT) && (LEUART_COUNT > 1))
  624. /***************************************************************************//**
  625. * @brief
  626. * Common LEUART1 interrupt handler
  627. *
  628. * @details
  629. * This function handles LEUART1 interrupt request
  630. *
  631. * @note
  632. *
  633. ******************************************************************************/
  634. void LEUART1_IRQHandler(void)
  635. {
  636. if (LEUART1->IF & LEUART_IF_RXDATAV)
  637. {
  638. /* invoke callback function */
  639. if (leuartCbTable[1].cbFunc != RT_NULL)
  640. {
  641. (leuartCbTable[1].cbFunc)(leuartCbTable[1].userPtr);
  642. }
  643. }
  644. }
  645. #endif
  646. #if defined(I2C_PRESENT)
  647. /***************************************************************************//**
  648. * @brief
  649. * Common IIC0 interrupt handler
  650. *
  651. * @details
  652. * This function handles IIC0 slave mode interrupt requests
  653. *
  654. * @note
  655. *
  656. ******************************************************************************/
  657. void I2C0_IRQHandler(void)
  658. {
  659. if ((I2C0->IF & I2C_IF_ADDR) || \
  660. (I2C0->IF & I2C_IF_RXDATAV) || \
  661. (I2C0->IF & I2C_IF_SSTOP))
  662. {
  663. /* invoke callback function */
  664. if (iicCbTable[0].cbFunc != RT_NULL)
  665. {
  666. (iicCbTable[0].cbFunc)(iicCbTable[0].userPtr);
  667. }
  668. }
  669. I2C_IntClear(I2C0, I2C_IFC_ADDR | I2C_IFC_SSTOP);
  670. }
  671. #endif
  672. /***************************************************************************//**
  673. * @brief
  674. * EFM32 common interrupt handlers register function
  675. *
  676. * @details
  677. *
  678. * @note
  679. *
  680. ******************************************************************************/
  681. void efm32_irq_hook_register(efm32_irq_hook_init_t *hook)
  682. {
  683. switch (hook->type)
  684. {
  685. case efm32_irq_type_dma:
  686. dmaCbTable[hook->unit].cbFunc = hook->cbFunc;
  687. dmaCbTable[hook->unit].userPtr = hook->userPtr;
  688. break;
  689. case efm32_irq_type_rtc:
  690. rtcCbTable[hook->unit].cbFunc = hook->cbFunc;
  691. rtcCbTable[hook->unit].userPtr = hook->userPtr;
  692. break;
  693. case efm32_irq_type_timer:
  694. timerCbTable[hook->unit].cbFunc = hook->cbFunc;
  695. timerCbTable[hook->unit].userPtr = hook->userPtr;
  696. break;
  697. case efm32_irq_type_gpio:
  698. gpioCbTable[hook->unit].cbFunc = hook->cbFunc;
  699. gpioCbTable[hook->unit].userPtr = hook->userPtr;
  700. break;
  701. case efm32_irq_type_acmp:
  702. acmpCbTable[hook->unit].cbFunc = hook->cbFunc;
  703. acmpCbTable[hook->unit].userPtr = hook->userPtr;
  704. break;
  705. #if defined(USART_PRESENT)
  706. case efm32_irq_type_usart:
  707. usartCbTable[hook->unit].cbFunc = hook->cbFunc;
  708. usartCbTable[hook->unit].userPtr = hook->userPtr;
  709. break;
  710. #endif
  711. #if defined(LEUART_PRESENT)
  712. case efm32_irq_type_leuart:
  713. leuartCbTable[hook->unit].cbFunc = hook->cbFunc;
  714. leuartCbTable[hook->unit].userPtr = hook->userPtr;
  715. break;
  716. #endif
  717. #if defined(I2C_PRESENT)
  718. case efm32_irq_type_iic:
  719. iicCbTable[hook->unit].cbFunc = hook->cbFunc;
  720. iicCbTable[hook->unit].userPtr = hook->userPtr;
  721. break;
  722. #endif
  723. default:
  724. break;
  725. }
  726. hdl_debug("Hook Registered: type: %s, unit: %x, cbFunc: %x, userPtr: %x\n", \
  727. hook->type, hook->unit, hook->cbFunc, hook->userPtr);
  728. }
  729. /***************************************************************************//**
  730. * @}
  731. ******************************************************************************/