1 /*
2  * Copyright (c) 2006-2020, YICHIP Development Team
3  * @file     yc_exit.c
4  * @brief    source file for setting exit
5  *
6  * Change Logs:
7  * Date            Author             Version        Notes
8  * 2021-12-24      yangzhengfeng      V1.0.0         Modify the register module configuration
9  * 2021-01-03      wangjingfan        V1.0.1         Compile error correction
10  * 2021-01-20      yangzhengfeng      V1.0.2         Update library function
11  */
12 
13 #include "yc_exti.h"
14 
15 /**
16   * @brief  Clear interrupt flag
17   * @param  EXTI_Line:EXTI_Line_0...EXTI_Line_4
18   * @param  EXTI_PinSource:EXTI_PinSource0...EXTI_PinSource15
19   * @retval none
20   */
EXTI_ClearITPendingBit(EXTI_LineTypeDef EXTI_Line,EXTI_PIN_TypeDef EXTI_PinSource)21 void EXTI_ClearITPendingBit(EXTI_LineTypeDef EXTI_Line, EXTI_PIN_TypeDef EXTI_PinSource)
22 {
23     _ASSERT(IS_EXTI_LINE(EXTI_Line));
24     _ASSERT(IS_EXTI_PIN_SOURCE(EXTI_PinSource));
25 
26     MGPIO->IRQ_STATUS.reg[EXTI_Line] |= EXTI_PinSource;
27 }
28 
29 /**
30   * @brief  Deinitializes the EXTI registers to default reset values.
31   * @param  none
32   * @retval none
33   */
EXTI_DeInit()34 void EXTI_DeInit()
35 {
36     uint32_t i;
37 
38     for (i = 0; i < EXIT_Num; i++)
39     {
40         MGPIO->INTR.reg[i]           = 0;
41         MGPIO->IRQ_LEVEL.reg[i]            = 0;
42         MGPIO->IRQ_RISE.reg[i]            = 0;
43         MGPIO->IRQ_FALL.reg[i]            = 0;
44     }
45 }
46 
47 /**
48   * @brief  get interrupt status
49   * @param  EXTI_Line:EXTI_Line_0...EXTI_Line_4
50   * @retval none
51   */
EXTI_GetITLineStatus(EXTI_LineTypeDef EXTI_Line)52 uint16_t EXTI_GetITLineStatus(EXTI_LineTypeDef EXTI_Line)
53 {
54     _ASSERT(IS_EXTI_LINE(EXTI_Line));
55 
56     return MGPIO->INTR.reg[EXTI_Line];
57 }
58 
59 /**
60   * @brief  get interrupt pinsource status
61   * @param  EXTI_Line:EXTI_Line_0...EXTI_Line_4
62   * @param  EXTI_PinSource:EXTI_PinSource0...EXTI_PinSource15
63   * @retval none
64   */
EXTI_GetITEXTI_PinSourceStatus(EXTI_LineTypeDef EXTI_Line,EXTI_PIN_TypeDef EXTI_PinSource)65 uint16_t EXTI_GetITEXTI_PinSourceStatus(EXTI_LineTypeDef EXTI_Line, EXTI_PIN_TypeDef EXTI_PinSource)
66 {
67     _ASSERT(IS_EXTI_LINE(EXTI_Line));
68     _ASSERT(IS_EXTI_PIN_SOURCE(EXTI_PinSource));
69 
70     if(MGPIO->INTR.reg[EXTI_Line] & EXTI_PinSource)
71     {
72         return ENABLE;
73     }
74     else
75     {
76         return DISABLE;
77     }
78 
79 }
80 
81 /**
82   * @brief  EXTI LineConfig
83   * @param  EXTI_Line:EXTI_Line_0...EXTI_Line_4
84   * @param  EXTI_PinSource:EXTI_PinSource0...EXTI_PinSource15
85   * @param  EXTI_Trigger:EXTI Trigger mode
86   * @retval none
87   */
EXTI_LineConfig(EXTI_LineTypeDef EXTI_Line,EXTI_PIN_TypeDef EXTI_PinSource,EXTI_TriggerTypeDef EXTI_Trigger)88 void EXTI_LineConfig(EXTI_LineTypeDef EXTI_Line, EXTI_PIN_TypeDef EXTI_PinSource, EXTI_TriggerTypeDef EXTI_Trigger)
89 {
90     _ASSERT(IS_EXTI_LINE(EXTI_Line));
91     _ASSERT(IS_EXTI_PIN_SOURCE(EXTI_PinSource));
92     _ASSERT(IS_TRIG_TYPEDEF(EXTI_Trigger));
93 
94     uint16_t val_intr_lts,val_intr_rts,val_intr_fts,val_intr_en;
95     switch (EXTI_Trigger)
96     {
97     case EXTI_Trigger_Off:
98         val_intr_en  = ~EXTI_PinSource;
99         val_intr_lts = ~EXTI_PinSource;
100         val_intr_rts = ~EXTI_PinSource;
101         val_intr_fts = ~EXTI_PinSource;
102         break;
103     case EXTI_Trigger_HighLev:
104         val_intr_en  = EXTI_PinSource;
105         val_intr_lts = ~EXTI_PinSource;
106         val_intr_rts = ~EXTI_PinSource;
107         val_intr_fts = ~EXTI_PinSource;
108         break;
109     case EXTI_Trigger_LowLev:
110         val_intr_en  = EXTI_PinSource;
111         val_intr_lts = EXTI_PinSource;
112         val_intr_rts = ~EXTI_PinSource;
113         val_intr_fts = ~EXTI_PinSource;
114         break;
115     case EXTI_Trigger_Rising:
116         val_intr_en  = EXTI_PinSource;
117         val_intr_lts = ~EXTI_PinSource;
118         val_intr_rts = EXTI_PinSource;
119         val_intr_fts = ~EXTI_PinSource;
120         break;
121     case EXTI_Trigger_Falling:
122         val_intr_en  = EXTI_PinSource;
123         val_intr_lts = ~EXTI_PinSource;
124         val_intr_rts = ~EXTI_PinSource;
125         val_intr_fts = EXTI_PinSource;
126         break;
127     case EXTI_Trigger_Rising_Falling:
128         val_intr_en  = EXTI_PinSource;
129         val_intr_lts = ~EXTI_PinSource;
130         val_intr_rts = EXTI_PinSource;
131         val_intr_fts = EXTI_PinSource;
132         break;
133     default:
134         break;
135     }
136     if (EXTI_Trigger == EXTI_Trigger_Off)
137     {
138         MGPIO->INTR.reg[EXTI_Line] &= val_intr_en;
139         MGPIO->IRQ_LEVEL.reg[EXTI_Line]  &= val_intr_lts;
140         MGPIO->IRQ_RISE.reg[EXTI_Line]  &= val_intr_rts;
141         MGPIO->IRQ_FALL.reg[EXTI_Line]  &= val_intr_fts;
142     }
143     else if (EXTI_Trigger == EXTI_Trigger_HighLev )
144     {
145         MGPIO->IRQ_LEVEL.reg[EXTI_Line]  &= val_intr_lts;
146         MGPIO->IRQ_RISE.reg[EXTI_Line]  &= val_intr_rts;
147         MGPIO->IRQ_FALL.reg[EXTI_Line]  &= val_intr_fts;
148         MGPIO->INTR.reg[EXTI_Line] |= val_intr_en;
149     }
150     else if (EXTI_Trigger == EXTI_Trigger_LowLev )
151     {
152         MGPIO->IRQ_LEVEL.reg[EXTI_Line]  |= val_intr_lts;
153         MGPIO->IRQ_RISE.reg[EXTI_Line]  &= val_intr_rts;
154         MGPIO->IRQ_FALL.reg[EXTI_Line]  &= val_intr_fts;
155         MGPIO->INTR.reg[EXTI_Line] |= val_intr_en;
156     }
157     else if (EXTI_Trigger == EXTI_Trigger_Rising )
158     {
159         MGPIO->IRQ_LEVEL.reg[EXTI_Line]  &= val_intr_lts;
160         MGPIO->IRQ_RISE.reg[EXTI_Line]  |= val_intr_rts;
161         MGPIO->IRQ_FALL.reg[EXTI_Line]  &= val_intr_fts;
162         MGPIO->INTR.reg[EXTI_Line] |= val_intr_en;
163     }
164     else if (EXTI_Trigger == EXTI_Trigger_Falling )
165     {
166         MGPIO->IRQ_LEVEL.reg[EXTI_Line]  &= val_intr_lts;
167         MGPIO->IRQ_RISE.reg[EXTI_Line]  &= val_intr_rts;
168         MGPIO->IRQ_FALL.reg[EXTI_Line]  |= val_intr_fts;
169         MGPIO->INTR.reg[EXTI_Line] |= val_intr_en;
170     }
171     else if (EXTI_Trigger == EXTI_Trigger_Rising_Falling )
172     {
173         MGPIO->IRQ_LEVEL.reg[EXTI_Line]  &= val_intr_lts;
174         MGPIO->IRQ_RISE.reg[EXTI_Line]  |= val_intr_rts;
175         MGPIO->IRQ_FALL.reg[EXTI_Line]  |= val_intr_fts;
176         MGPIO->INTR.reg[EXTI_Line] |= val_intr_en;
177     }
178 }
179 
180 //extern void VBAT_IRQHandler(void);
181 //extern void EXTI0_IRQHandler(void);
182 //extern void EXTI1_IRQHandler(void);
183 //extern void EXTI2_IRQHandler(void);
184 //extern void EXTI3_IRQHandler(void);
185 //extern void EXTI4_IRQHandler(void);
186 
187 //void GPIO_IRQHandler()
188 //{
189 //    uint8_t Exti_irq_index;
190 
191 //    NVIC_DisableIRQ(GPIO_IRQn);
192 
193 //    if (MSYSCTRL->CHGR_EVENT_IRQ.bit.VBAT_OV & MSYSCTRL->CHGR_EVENT_ICTRL.bit.VBAT_OV_IE)
194 //    {
195 //        //VBAT_IRQHandler();
196 //    }
197 
198 //    Exti_irq_index = MGPIO->IRQ_NUM.reg;
199 //    if(MGPIO->INTR.reg[Exti_irq_index/EXIT_Pin_Num] &(1 << (Exti_irq_index%EXIT_Pin_Num)))
200 //    {
201 //        switch (Exti_irq_index/EXIT_Pin_Num)
202 //        {
203 //        case EXTI_Line_0:
204 //            EXTI0_IRQHandler();
205 //            break;
206 //        case EXTI_Line_1:
207 //            EXTI1_IRQHandler();
208 //            break;
209 //        case EXTI_Line_2:
210 //            EXTI2_IRQHandler();
211 //            break;
212 //        case EXTI_Line_3:
213 //            EXTI3_IRQHandler();
214 //            break;
215 
216 //        case EXTI_Line_4:
217 //            EXTI4_IRQHandler();
218 //            break;
219 //        default:
220 //            break;
221 //        }
222 //        EXTI_ClearITPendingBit((EXTI_LineTypeDef)(Exti_irq_index/EXIT_Pin_Num),(EXTI_PIN_TypeDef)(BIT(Exti_irq_index%EXIT_Pin_Num)));
223 //    }
224 //    NVIC_EnableIRQ(GPIO_IRQn);
225 //}
226 
227 /************************ (C) COPYRIGHT Yichip Microelectronics *****END OF FILE****/
228