libxr
Embedded C++ framework for bare-metal, RTOS and Linux
Loading...
Searching...
No Matches
mspm0_group1_shared.cpp
1#include "mspm0_group1_shared.hpp"
2
3namespace LibXR::MSPM0Group1Shared
4{
5namespace
6{
7// INT_GROUP1 的成员共用一个中断号;优先级低于 SysTick 时基。
8// The INT_GROUP1 members share one interrupt number; the priority stays below the
9// SysTick timebase.
10void EnableIRQ(IRQn_Type irqn)
11{
12 NVIC_SetPriority(irqn, 1U);
13 NVIC_EnableIRQ(irqn);
14}
15} // namespace
16
17void EnableGroup1IRQ()
18{
19#if defined(GPIOA_BASE)
20 EnableIRQ(GPIOA_INT_IRQn);
21#elif defined(GPIOB_BASE)
22 EnableIRQ(GPIOB_INT_IRQn);
23#elif defined(GPIOC_BASE)
24 EnableIRQ(GPIOC_INT_IRQn);
25#elif defined(COMP0_BASE)
26 EnableIRQ(COMP0_INT_IRQn);
27#elif defined(COMP1_BASE)
28 EnableIRQ(COMP1_INT_IRQn);
29#elif defined(COMP2_BASE)
30 EnableIRQ(COMP2_INT_IRQn);
31#elif defined(TRNG_BASE)
32 EnableIRQ(TRNG_INT_IRQn);
33#endif
34}
35} // namespace LibXR::MSPM0Group1Shared
36
37// NOLINTNEXTLINE(readability-identifier-naming)
38extern "C" void GROUP1_IRQHandler(void)
39{
40 uint32_t iidx = DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1);
41 using namespace LibXR::MSPM0Group1Shared;
42
43 switch (iidx)
44 {
45#if defined(GPIOA_BASE)
46 case DL_INTERRUPT_GROUP1_IIDX_GPIOA:
47 if (auto fn = gpioa_irq_cb)
48 {
49 fn();
50 }
51 break;
52#endif
53#if defined(GPIOB_BASE)
54 case DL_INTERRUPT_GROUP1_IIDX_GPIOB:
55 if (auto fn = gpiob_irq_cb)
56 {
57 fn();
58 }
59 break;
60#endif
61#if defined(COMP0_BASE)
62 case DL_INTERRUPT_GROUP1_IIDX_COMP0:
63 if (auto fn = comp0_irq_cb)
64 {
65 fn();
66 }
67 break;
68#endif
69#if defined(COMP1_BASE)
70 case DL_INTERRUPT_GROUP1_IIDX_COMP1:
71 if (auto fn = comp1_irq_cb)
72 {
73 fn();
74 }
75 break;
76#endif
77#if defined(COMP2_BASE)
78 case DL_INTERRUPT_GROUP1_IIDX_COMP2:
79 if (auto fn = comp2_irq_cb)
80 {
81 fn();
82 }
83 break;
84#endif
85#if defined(TRNG_BASE)
86 case DL_INTERRUPT_GROUP1_IIDX_TRNG:
87 if (auto fn = trng_irq_cb)
88 {
89 fn();
90 }
91 break;
92#endif
93#if defined(GPIOC_BASE)
94 case DL_INTERRUPT_GROUP1_IIDX_GPIOC:
95 if (auto fn = gpioc_irq_cb)
96 {
97 fn();
98 }
99 break;
100#endif
101 default:
102 break;
103 }
104}