hdl_interrupt.c 23 KB

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