1 /********************************** (C) COPYRIGHT ******************************* 2 * File Name : ch32v10x_exti.c 3 * Author : WCH 4 * Version : V1.0.0 5 * Date : 2020/04/30 6 * Description : This file provides all the EXTI firmware functions. 7 * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. 8 * SPDX-License-Identifier: Apache-2.0 9 ***************************************************************************************/ 10 #include "ch32v10x_exti.h" 11 12 /* No interrupt selected */ 13 #define EXTI_LINENONE ((uint32_t)0x00000) 14 15 /********************************************************************* 16 * @fn EXTI_DeInit 17 * 18 * @brief Deinitializes the EXTI peripheral registers to their default 19 * reset values. 20 * 21 * @return none. 22 */ EXTI_DeInit(void)23void EXTI_DeInit(void) 24 { 25 EXTI->INTENR = 0x00000000; 26 EXTI->EVENR = 0x00000000; 27 EXTI->RTENR = 0x00000000; 28 EXTI->FTENR = 0x00000000; 29 EXTI->INTFR = 0x000FFFFF; 30 } 31 32 /********************************************************************* 33 * @fn EXTI_Init 34 * 35 * @brief Initializes the EXTI peripheral according to the specified 36 * parameters in the EXTI_InitStruct. 37 * 38 * @param EXTI_InitStruct: pointer to a EXTI_InitTypeDef structure 39 * 40 * @return none. 41 */ EXTI_Init(EXTI_InitTypeDef * EXTI_InitStruct)42void EXTI_Init(EXTI_InitTypeDef *EXTI_InitStruct) 43 { 44 uint32_t tmp = 0; 45 46 tmp = (uint32_t)EXTI_BASE; 47 if(EXTI_InitStruct->EXTI_LineCmd != DISABLE) 48 { 49 EXTI->INTENR &= ~EXTI_InitStruct->EXTI_Line; 50 EXTI->EVENR &= ~EXTI_InitStruct->EXTI_Line; 51 tmp += EXTI_InitStruct->EXTI_Mode; 52 *(__IO uint32_t *)tmp |= EXTI_InitStruct->EXTI_Line; 53 EXTI->RTENR &= ~EXTI_InitStruct->EXTI_Line; 54 EXTI->FTENR &= ~EXTI_InitStruct->EXTI_Line; 55 if(EXTI_InitStruct->EXTI_Trigger == EXTI_Trigger_Rising_Falling) 56 { 57 EXTI->RTENR |= EXTI_InitStruct->EXTI_Line; 58 EXTI->FTENR |= EXTI_InitStruct->EXTI_Line; 59 } 60 else 61 { 62 tmp = (uint32_t)EXTI_BASE; 63 tmp += EXTI_InitStruct->EXTI_Trigger; 64 *(__IO uint32_t *)tmp |= EXTI_InitStruct->EXTI_Line; 65 } 66 } 67 else 68 { 69 tmp += EXTI_InitStruct->EXTI_Mode; 70 *(__IO uint32_t *)tmp &= ~EXTI_InitStruct->EXTI_Line; 71 } 72 } 73 74 /********************************************************************* 75 * @fn EXTI_StructInit 76 * 77 * @brief Fills each EXTI_InitStruct member with its reset value. 78 * 79 * @param EXTI_InitStruct - pointer to a EXTI_InitTypeDef structure 80 * 81 * @return none. 82 */ EXTI_StructInit(EXTI_InitTypeDef * EXTI_InitStruct)83void EXTI_StructInit(EXTI_InitTypeDef *EXTI_InitStruct) 84 { 85 EXTI_InitStruct->EXTI_Line = EXTI_LINENONE; 86 EXTI_InitStruct->EXTI_Mode = EXTI_Mode_Interrupt; 87 EXTI_InitStruct->EXTI_Trigger = EXTI_Trigger_Falling; 88 EXTI_InitStruct->EXTI_LineCmd = DISABLE; 89 } 90 91 /********************************************************************* 92 * @fn EXTI_GenerateSWInterrupt 93 * 94 * @brief Generates a Software interrupt. 95 * 96 * @param EXTI_Line - specifies the EXTI lines to be enabled or disabled. 97 * 98 * @return none. 99 */ EXTI_GenerateSWInterrupt(uint32_t EXTI_Line)100void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line) 101 { 102 EXTI->SWIEVR |= EXTI_Line; 103 } 104 105 /********************************************************************* 106 * @fn EXTI_GetFlagStatus 107 * 108 * @brief Checks whether the specified EXTI line flag is set or not. 109 * 110 * @param EXTI_Line - specifies the EXTI lines to be enabled or disabled. 111 * 112 * @return The new state of EXTI_Line (SET or RESET). 113 */ EXTI_GetFlagStatus(uint32_t EXTI_Line)114FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line) 115 { 116 FlagStatus bitstatus = RESET; 117 if((EXTI->INTFR & EXTI_Line) != (uint32_t)RESET) 118 { 119 bitstatus = SET; 120 } 121 else 122 { 123 bitstatus = RESET; 124 } 125 return bitstatus; 126 } 127 128 /********************************************************************* 129 * @fn EXTI_ClearFlag 130 * 131 * @brief Clears the EXTI's line pending flags. 132 * 133 * @param EXTI_Line - specifies the EXTI lines to be enabled or disabled. 134 * 135 * @return None 136 */ EXTI_ClearFlag(uint32_t EXTI_Line)137void EXTI_ClearFlag(uint32_t EXTI_Line) 138 { 139 EXTI->INTFR = EXTI_Line; 140 } 141 142 /********************************************************************* 143 * @fn EXTI_GetITStatus 144 * 145 * @brief Checks whether the specified EXTI line is asserted or not. 146 * 147 * @param EXTI_Line - specifies the EXTI lines to be enabled or disabled. 148 * 149 * @return The new state of EXTI_Line (SET or RESET). 150 */ EXTI_GetITStatus(uint32_t EXTI_Line)151ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) 152 { 153 ITStatus bitstatus = RESET; 154 uint32_t enablestatus = 0; 155 156 enablestatus = EXTI->INTENR & EXTI_Line; 157 if(((EXTI->INTFR & EXTI_Line) != (uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) 158 { 159 bitstatus = SET; 160 } 161 else 162 { 163 bitstatus = RESET; 164 } 165 return bitstatus; 166 } 167 168 /********************************************************************* 169 * @fn EXTI_ClearITPendingBit 170 * 171 * @brief Clears the EXTI's line pending bits. 172 * 173 * @param EXTI_Line - specifies the EXTI lines to be enabled or disabled. 174 * 175 * @return none 176 */ EXTI_ClearITPendingBit(uint32_t EXTI_Line)177void EXTI_ClearITPendingBit(uint32_t EXTI_Line) 178 { 179 EXTI->INTFR = EXTI_Line; 180 } 181