ciu32f003_std_exti(3).h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. /************************************************************************************************/
  2. /**
  3. * @file ciu32f003_std_exti.h
  4. * @author MCU Ecosystem Development Team
  5. * @brief EXTI STD库驱动头文件。
  6. * 提供EXTI相关的STD库操作函数声明、数据类型以及常量的定义。
  7. *
  8. *
  9. **************************************************************************************************
  10. * @attention
  11. * Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
  12. *
  13. **************************************************************************************************
  14. */
  15. /* 避免头文件重复引用 */
  16. #ifndef CIU32F003_STD_EXTI_H
  17. #define CIU32F003_STD_EXTI_H
  18. /************************************************************************************************/
  19. /**
  20. * @addtogroup CIU32F003_STD_Driver
  21. * @{
  22. */
  23. /**
  24. * @defgroup EXTI EXTI
  25. * @brief 扩展中断和事件控制器的STD库驱动
  26. * @{
  27. */
  28. /************************************************************************************************/
  29. #ifdef __cplusplus
  30. extern "C" {
  31. #endif
  32. /*------------------------------------------includes--------------------------------------------*/
  33. #include "ciu32f003_std_common.h"
  34. /*-----------------------------------------type define------------------------------------------*/
  35. /************************************************************************************************/
  36. /**
  37. * @defgroup EXTI_Types EXTI Types
  38. * @brief EXTI数据类型定义
  39. * @{
  40. */
  41. /************************************************************************************************/
  42. /**
  43. * @brief EXTI参数配置结构体定义
  44. */
  45. typedef struct
  46. {
  47. uint32_t line_id; /**< EXTI通道ID
  48. @arg EXTI_LINE_GPIO_PIN0 ... */
  49. uint32_t mode; /**< EXTI通道模式
  50. @arg EXTI_MODE_INTERRUPT ... */
  51. uint32_t trigger; /**< EXTI通道触发类型
  52. @arg EXTI_TRIGGER_RISING ... */
  53. uint32_t gpio_id; /**< GPIO端口ID
  54. @arg EXTI_GPIOA ... */
  55. } std_exti_init_t;
  56. /**
  57. * @}
  58. */
  59. /*--------------------------------------------define--------------------------------------------*/
  60. /************************************************************************************************/
  61. /**
  62. * @defgroup EXTI_Constants EXTI Constants
  63. * @brief EXTI常量定义及宏定义
  64. * @{
  65. *
  66. */
  67. /************************************************************************************************/
  68. /* EXTI LINE ID定义 */
  69. #define EXTI_LINE_GPIO_PIN0 (EXTI_GPIO | 0x00U) /**< EXTI_LINE0 */
  70. #define EXTI_LINE_GPIO_PIN1 (EXTI_GPIO | 0x01U) /**< EXTI_LINE1 */
  71. #define EXTI_LINE_GPIO_PIN2 (EXTI_GPIO | 0x02U) /**< EXTI_LINE2 */
  72. #define EXTI_LINE_GPIO_PIN3 (EXTI_GPIO | 0x03U) /**< EXTI_LINE3 */
  73. #define EXTI_LINE_GPIO_PIN4 (EXTI_GPIO | 0x04U) /**< EXTI_LINE4 */
  74. #define EXTI_LINE_GPIO_PIN5 (EXTI_GPIO | 0x05U) /**< EXTI_LINE5 */
  75. #define EXTI_LINE_GPIO_PIN6 (EXTI_GPIO | 0x06U) /**< EXTI_LINE6 */
  76. #define EXTI_LINE_GPIO_PIN7 (EXTI_GPIO | 0x07U) /**< EXTI_LINE7 */
  77. #define EXTI_LINE_COMP1 (EXTI_CONFIG | 0x10U) /**< EXTI_LINE16 */
  78. #define EXTI_LINE_COMP2 (EXTI_CONFIG | 0x11U) /**< EXTI_LINE17 */
  79. #define EXTI_LINE_LPTIM1 (EXTI_DIRECT | 0x1EU) /**< EXTI_LINE30 */
  80. /* EXTI LINE 分组 */
  81. #define EXTI_DIRECT (0x01000000) /**< 直接通道 */
  82. #define EXTI_CONFIG (0x02000000) /**< 其它可配置通道(COMP1/COMP2) */
  83. #define EXTI_GPIO (0x06000000) /**< GPIO可配置通道 */
  84. #define EXTI_PROPERTY_MASK (EXTI_DIRECT | EXTI_CONFIG | EXTI_GPIO) /**< 通道屏蔽掩码 */
  85. /* EXTI LINE屏蔽掩码,用于筛选EXTI LINE ID */
  86. #define EXTI_LINE_MASK (0x0000001FU) /**< EXTI LINE屏蔽掩码 */
  87. /* EXTI LINE模式:中断、事件 */
  88. #define EXTI_MODE_NONE (0x00000000U) /**< 无中断/事件唤醒 */
  89. #define EXTI_MODE_INTERRUPT (0x00000001U) /**< 中断唤醒 */
  90. #define EXTI_MODE_EVENT (0x00000002U) /**< 事件唤醒 */
  91. #define EXTI_MODE_INTERRUPT_EVENT (EXTI_MODE_EVENT | EXTI_MODE_INTERRUPT) /**< 中断/事件唤醒 */
  92. /* EXTI LINE 触发类型定义,用于可配置通道,信号触发类型配置 */
  93. #define EXTI_TRIGGER_NONE (0x00000000U) /**< 不触发 */
  94. #define EXTI_TRIGGER_RISING (0x00000001U) /**< 上降沿触发 */
  95. #define EXTI_TRIGGER_FALLING (0x00000002U) /**< 下降沿触发 */
  96. #define EXTI_TRIGGER_RISING_FALLING (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) /**< 上升沿/下降沿触发 */
  97. /* EXTI LINE 触发类型屏蔽掩码,用于筛选EXTI 可配置通道触发类型 */
  98. #define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) /**< 触发类型屏蔽掩码 */
  99. /* GPIO端口ID定义 */
  100. #define EXTI_GPIOA (0x00000000UL) /**< GPIOA ID */
  101. #define EXTI_GPIOB (0x00000001UL) /**< GPIOB ID */
  102. #define EXTI_GPIOC (0x00000002UL) /**< GPIOC ID */
  103. /**
  104. * @}
  105. */
  106. /*-------------------------------------------functions------------------------------------------*/
  107. /************************************************************************************************/
  108. /**
  109. * @defgroup EXTI_External_Functions EXTI External Functions
  110. * @brief EXTI对外函数
  111. * @{
  112. *
  113. */
  114. /************************************************************************************************/
  115. /**
  116. * @brief 读取EXTI通道中断挂起状态
  117. * @param exti_line EXTI通道ID
  118. * @arg EXTI_LINE_GPIO_PIN0
  119. * @arg EXTI_LINE_GPIO_PIN1
  120. * @arg ...
  121. * @arg EXTI_LINE_COMP1
  122. * @arg EXTI_LINE_COMP2
  123. * @retval uint32_t 上升沿中断挂起状态
  124. * @arg 非0 表示已挂起
  125. * @arg 0 表示未挂起
  126. */
  127. __STATIC_INLINE uint32_t std_exti_get_pending_status(uint32_t exti_line)
  128. {
  129. return (EXTI->PIR & (0x01U << (exti_line & EXTI_LINE_MASK)));
  130. }
  131. /**
  132. * @brief 清除EXTI通道中断挂起状态
  133. * @param exti_line EXTI通道ID
  134. * @arg EXTI_LINE_GPIO_PIN0
  135. * @arg EXTI_LINE_GPIO_PIN1
  136. * @arg ...
  137. * @arg EXTI_LINE_COMP1
  138. * @arg EXTI_LINE_COMP2
  139. * @retval 无
  140. */
  141. __STATIC_INLINE void std_exti_clear_pending(uint32_t exti_line)
  142. {
  143. EXTI->PIR = (0x01U << (exti_line & EXTI_LINE_MASK));
  144. }
  145. /**
  146. * @brief 使能EXTI通道上升沿触发
  147. * @param exti_line EXTI通道ID
  148. * @arg EXTI_LINE_GPIO_PIN0
  149. * @arg EXTI_LINE_GPIO_PIN1
  150. * @arg ...
  151. * @arg EXTI_LINE_COMP1
  152. * @arg EXTI_LINE_COMP2
  153. * @retval 无
  154. */
  155. __STATIC_INLINE void std_exti_rising_trigger_enable(uint32_t exti_line)
  156. {
  157. EXTI->RTSR |= (0x01U << (exti_line & EXTI_LINE_MASK));
  158. }
  159. /**
  160. * @brief 禁止EXTI通道上升沿触发
  161. * @param exti_line EXTI通道ID
  162. * @arg EXTI_LINE_GPIO_PIN0
  163. * @arg EXTI_LINE_GPIO_PIN1
  164. * @arg ...
  165. * @arg EXTI_LINE_COMP1
  166. * @arg EXTI_LINE_COMP2
  167. * @retval 无
  168. */
  169. __STATIC_INLINE void std_exti_rising_trigger_disable(uint32_t exti_line)
  170. {
  171. EXTI->RTSR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
  172. }
  173. /**
  174. * @brief 使能EXTI通道下降沿触发
  175. * @param exti_line EXTI通道ID
  176. * @arg EXTI_LINE_GPIO_PIN0
  177. * @arg EXTI_LINE_GPIO_PIN1
  178. * @arg ...
  179. * @arg EXTI_LINE_COMP1
  180. * @arg EXTI_LINE_COMP2
  181. * @retval 无
  182. */
  183. __STATIC_INLINE void std_exti_falling_trigger_enable(uint32_t exti_line)
  184. {
  185. EXTI->FTSR |= (0x01U << (exti_line & EXTI_LINE_MASK));
  186. }
  187. /**
  188. * @brief 禁止EXTI通道下降沿触发
  189. * @param exti_line EXTI通道ID
  190. * @arg EXTI_LINE_GPIO_PIN0
  191. * @arg EXTI_LINE_GPIO_PIN1
  192. * @arg ...
  193. * @arg EXTI_LINE_COMP1
  194. * @arg EXTI_LINE_COMP2
  195. * @retval 无
  196. */
  197. __STATIC_INLINE void std_exti_falling_trigger_disable(uint32_t exti_line)
  198. {
  199. EXTI->FTSR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
  200. }
  201. /**
  202. * @brief 读取EXTI通道上升沿触发状态
  203. * @param exti_line EXTI通道ID
  204. * @arg EXTI_LINE_GPIO_PIN0
  205. * @arg EXTI_LINE_GPIO_PIN1
  206. * @arg ...
  207. * @arg EXTI_LINE_COMP1
  208. * @arg EXTI_LINE_COMP2
  209. * @retval uint32_t 上升沿触发状态
  210. * @arg 非0 表示已使能
  211. * @arg 0 表示已禁止
  212. */
  213. __STATIC_INLINE uint32_t std_exti_get_rising_trigger_enable(uint32_t exti_line)
  214. {
  215. return (EXTI->RTSR & (0x01U << (exti_line & EXTI_LINE_MASK)));
  216. }
  217. /**
  218. * @brief 读取EXTI通道下降沿触发状态
  219. * @param exti_line EXTI通道ID
  220. * @arg EXTI_LINE_GPIO_PIN0
  221. * @arg EXTI_LINE_GPIO_PIN1
  222. * @arg ...
  223. * @arg EXTI_LINE_COMP1
  224. * @arg EXTI_LINE_COMP2
  225. * @retval uint32_t 下降沿触发状态
  226. * @arg 非0 表示已使能
  227. * @arg 0 表示已禁止
  228. */
  229. __STATIC_INLINE uint32_t std_exti_get_falling_trigger_enable(uint32_t exti_line)
  230. {
  231. return (EXTI->FTSR & (0x01U << (exti_line & EXTI_LINE_MASK)));
  232. }
  233. /**
  234. * @brief 使能EXTI通道唤醒中断
  235. * @param exti_line EXTI通道ID
  236. * @arg EXTI_LINE_GPIO_PIN0
  237. * @arg EXTI_LINE_GPIO_PIN1
  238. * @arg ...
  239. * @arg EXTI_LINE_COMP1
  240. * @arg EXTI_LINE_COMP2
  241. * @arg EXTI_LINE_LPTIM1
  242. * @retval 无
  243. */
  244. __STATIC_INLINE void std_exti_interrupt_enable(uint32_t exti_line)
  245. {
  246. EXTI->IMR |= (0x01U << (exti_line & EXTI_LINE_MASK));
  247. }
  248. /**
  249. * @brief 禁止EXTI通道唤醒中断
  250. * @param exti_line EXTI通道ID
  251. * @arg EXTI_LINE_GPIO_PIN0
  252. * @arg EXTI_LINE_GPIO_PIN1
  253. * @arg ...
  254. * @arg EXTI_LINE_COMP1
  255. * @arg EXTI_LINE_COMP2
  256. * @arg EXTI_LINE_LPTIM1
  257. * @retval 无
  258. */
  259. __STATIC_INLINE void std_exti_interrupt_disable(uint32_t exti_line)
  260. {
  261. EXTI->IMR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
  262. }
  263. /**
  264. * @brief 使能EXTI通道唤醒事件
  265. * @param exti_line EXTI通道ID
  266. * @arg EXTI_LINE_GPIO_PIN0
  267. * @arg EXTI_LINE_GPIO_PIN1
  268. * @arg ...
  269. * @arg EXTI_LINE_COMP1
  270. * @arg EXTI_LINE_COMP2
  271. * @arg EXTI_LINE_LPTIM1
  272. * @retval 无
  273. */
  274. __STATIC_INLINE void std_exti_event_enable(uint32_t exti_line)
  275. {
  276. EXTI->EMR |= (0x01U << (exti_line & EXTI_LINE_MASK));
  277. }
  278. /**
  279. * @brief 禁止EXTI通道唤醒事件
  280. * @param exti_line EXTI通道ID
  281. * @arg EXTI_LINE_GPIO_PIN0
  282. * @arg EXTI_LINE_GPIO_PIN1
  283. * @arg ...
  284. * @arg EXTI_LINE_COMP1
  285. * @arg EXTI_LINE_COMP2
  286. * @arg EXTI_LINE_LPTIM1
  287. * @retval 无
  288. */
  289. __STATIC_INLINE void std_exti_event_disable(uint32_t exti_line)
  290. {
  291. EXTI->EMR &= (~(0x01U << (exti_line & EXTI_LINE_MASK)));
  292. }
  293. /**
  294. * @brief 设置EXTI通道所对应GPIO端口
  295. * @param gpio_id GPIO端口ID
  296. * @arg EXTI_GPIOA
  297. * @arg EXTI_GPIOB
  298. * @arg EXTI_GPIOC
  299. * @param exti_line EXTI通道ID
  300. * @arg EXTI_LINE_GPIO_PIN0
  301. * @arg EXTI_LINE_GPIO_PIN1
  302. * @arg ...
  303. * @arg EXTI_LINE_GPIO_PIN7
  304. * @retval 无
  305. */
  306. __STATIC_INLINE void std_exti_set_gpio(uint32_t gpio_id, uint32_t exti_line)
  307. {
  308. exti_line &= EXTI_LINE_MASK;
  309. MODIFY_REG(EXTI->EXTICR1,
  310. (EXTI_EXTICR1_EXTI0_MASK << (EXTI_EXTICR1_EXTI1_POS * exti_line)),
  311. (gpio_id << (EXTI_EXTICR1_EXTI1_POS * exti_line)));
  312. }
  313. void std_exti_init(std_exti_init_t* exti_init_param);
  314. void std_exti_deinit(void);
  315. void std_exti_struct_init(std_exti_init_t* exti_init_struct);
  316. /**
  317. * @}
  318. */
  319. #ifdef __cplusplus
  320. }
  321. #endif
  322. /**
  323. * @}
  324. */
  325. /**
  326. * @}
  327. */
  328. #endif /* CIU32F003_STD_EXTI_H */