ciu32f003_std_gpio(2).h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. /************************************************************************************************/
  2. /**
  3. * @file ciu32f003_std_gpio.h
  4. * @author MCU Ecosystem Development Team
  5. * @brief GPIO STD库驱动头文件。
  6. * 提供GPIO相关的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_GPIO_H
  17. #define CIU32F003_STD_GPIO_H
  18. /************************************************************************************************/
  19. /**
  20. * @addtogroup CIU32F003_STD_Driver
  21. * @{
  22. */
  23. /**
  24. * @defgroup GPIO GPIO
  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 GPIO_Types GPIO Types
  38. * @brief GPIO数据类型定义
  39. * @{
  40. */
  41. /************************************************************************************************/
  42. /**
  43. * @brief GPIO初始化结构体定义
  44. */
  45. typedef struct
  46. {
  47. uint32_t pin; /**< 指定GPIO引脚,可以是GPIO引脚组合
  48. @arg GPIO_PIN_0 ... */
  49. uint32_t mode; /**< 指定GPIO引脚模式及输出类型配置
  50. @arg GPIO_MODE_INPUT
  51. @arg GPIO_MODE_ANALOG
  52. @arg GPIO_MODE_OUTPUT
  53. @arg GPIO_MODE_ALTERNATE */
  54. uint32_t pull; /**< 指定GPIO引脚上/下拉配置
  55. @arg GPIO_NOPULL ... */
  56. uint32_t output_type; /**< 指定GPIO输出类型
  57. @arg GPIO_OUTPUT_PUSHPULL
  58. @arg GPIO_OUTPUT_OPENDRAIN */
  59. uint32_t alternate; /**< 指定GPIO引脚复用功能配置
  60. @arg GPIO_AF0_SPI1 ... */
  61. } std_gpio_init_t;
  62. /**
  63. * @}
  64. */
  65. /*--------------------------------------------define--------------------------------------------*/
  66. /************************************************************************************************/
  67. /**
  68. * @defgroup GPIO_Constants GPIO Constants
  69. * @brief GPIO常量定义及宏定义
  70. * @{
  71. *
  72. */
  73. /************************************************************************************************/
  74. /* GPIO PIN常量 */
  75. #define GPIO_PIN_0 ((uint16_t)0x0001U) /**< 选定 PIN 0 */
  76. #define GPIO_PIN_1 ((uint16_t)0x0002U) /**< 选定 PIN 1 */
  77. #define GPIO_PIN_2 ((uint16_t)0x0004U) /**< 选定 PIN 2 */
  78. #define GPIO_PIN_3 ((uint16_t)0x0008U) /**< 选定 PIN 3 */
  79. #define GPIO_PIN_4 ((uint16_t)0x0010U) /**< 选定 PIN 4 */
  80. #define GPIO_PIN_5 ((uint16_t)0x0020U) /**< 选定 PIN 5 */
  81. #define GPIO_PIN_6 ((uint16_t)0x0040U) /**< 选定 PIN 6 */
  82. #define GPIO_PIN_7 ((uint16_t)0x0080U) /**< 选定 PIN 7 */
  83. #define GPIO_PIN_All ((uint16_t)0x00FFU) /**< 选定 全部 */
  84. /* GPIO 模式配置常量 */
  85. #define GPIO_MODE_INPUT (0x00000000U) /**< 输入浮空 */
  86. #define GPIO_MODE_OUTPUT (0x00000001U) /**< 输出功能 */
  87. #define GPIO_MODE_ALTERNATE (0x00000002U) /**< 复用功能 */
  88. #define GPIO_MODE_ANALOG (0x00000003U) /**< 模拟功能 */
  89. /* GPIO 上下拉配置参数 */
  90. #define GPIO_NOPULL (0x00000000U) /**< 无上、下拉 */
  91. #define GPIO_PULLUP (0x00000001U) /**< 上拉 */
  92. #define GPIO_PULLDOWN (0x00000002U) /**< 下拉 */
  93. /* GPIO 输出类型 */
  94. #define GPIO_OUTPUT_PUSHPULL (0x00000000U) /**< 推挽输出 */
  95. #define GPIO_OUTPUT_OPENDRAIN (0x00000001U) /**< 开漏输出 */
  96. /* 复用功能0 */
  97. #define GPIO_AF0_SPI1 ((uint8_t)0x00U) /**< SPI1 复用功能映射 */
  98. #define GPIO_AF0_SWCLK ((uint8_t)0x00U) /**< SWCLK 复用功能映射 */
  99. #define GPIO_AF0_SWDIO ((uint8_t)0x00U) /**< SWDIO 复用功能映射 */
  100. /* 复用功能1 */
  101. #define GPIO_AF1_UART1 ((uint8_t)0x01U) /**< UART1 复用功能映射 */
  102. /* 复用功能2 */
  103. #define GPIO_AF2_TIM1 ((uint8_t)0x02U) /**< TIM1 复用功能映射 */
  104. /* 复用功能3 */
  105. #define GPIO_AF3_TIM1 ((uint8_t)0x03U) /**< TIM1 复用功能映射 */
  106. #define GPIO_AF3_TIM3 ((uint8_t)0x03U) /**< TIM3 复用功能映射 */
  107. /* 复用功能4 */
  108. #define GPIO_AF4_TIM1 ((uint8_t)0x04U) /**< TIM1 复用功能映射 */
  109. #define GPIO_AF4_COMP1 ((uint8_t)0x04U) /**< COMP1 复用功能映射 */
  110. #define GPIO_AF4_SPI1 ((uint8_t)0x04U) /**< SPI1 复用功能映射 */
  111. /* 复用功能5 */
  112. #define GPIO_AF5_TIM1 ((uint8_t)0x05U) /**< TIM1 复用功能映射 */
  113. #define GPIO_AF5_UART1 ((uint8_t)0x05U) /**< UART1 复用功能映射 */
  114. #define GPIO_AF5_UART2 ((uint8_t)0x05U) /**< UART2 复用功能映射 */
  115. /* 复用功能6 */
  116. #define GPIO_AF6_I2C1 ((uint8_t)0x06U) /**< I2C1 复用功能映射 */
  117. #define GPIO_AF6_MCO ((uint8_t)0x06U) /**< MCO 复用功能映射 */
  118. /* 复用功能7 */
  119. #define GPIO_AF7_COMP2 ((uint8_t)0x07U) /**< COMP2 复用功能映射 */
  120. #define GPIO_AF7_IR_OUT ((uint8_t)0x07U) /**< IR_OUT 复用功能映射 */
  121. #define GPIO_AF7_MCO ((uint8_t)0x07U) /**< MCO 复用功能映射 */
  122. /* 复用功能寄存器GPIO源选择偏移位 */
  123. #define GPIO_AF_SELECT_OFFSET (0x0000000FU) /**< GPIO源选择偏移位 */
  124. /**
  125. * @}
  126. */
  127. /*-------------------------------------------functions------------------------------------------*/
  128. /************************************************************************************************/
  129. /**
  130. * @defgroup GPIO_External_Functions GPIO External Functions
  131. * @brief GPIO对外函数
  132. * @{
  133. *
  134. */
  135. /************************************************************************************************/
  136. /**
  137. * @brief 设置GPIO引脚模式
  138. * @param gpiox GPIO外设
  139. * @arg GPIOA
  140. * @arg GPIOB
  141. * @arg GPIOC
  142. * @param pin GPIO引脚
  143. * @arg GPIO_PIN_0
  144. * @arg GPIO_PIN_1
  145. * @arg ...
  146. * @arg GPIO_PIN_7
  147. * @param mode GPIO引脚模式
  148. * @arg GPIO_MODE_INPUT 输入模式
  149. * @arg GPIO_MODE_OUTPUT 输出模式
  150. * @arg GPIO_MODE_ALTERNATE 复用模式
  151. * @arg GPIO_MODE_ANALOG 模拟模式
  152. * @note 仅支持单个引脚
  153. * @retval 无
  154. */
  155. __STATIC_INLINE void std_gpio_set_pin_mode(GPIO_t *gpiox, uint32_t pin, uint32_t mode)
  156. {
  157. MODIFY_REG(gpiox->MODE, ((pin * pin) * GPIO_MODE_MODE0), ((pin * pin) * mode));
  158. }
  159. /**
  160. * @brief 读取GPIO引脚模式
  161. * @param gpiox GPIO外设
  162. * @arg GPIOA
  163. * @arg GPIOB
  164. * @arg GPIOC
  165. * @param pin GPIO引脚
  166. * @arg GPIO_PIN_0
  167. * @arg GPIO_PIN_1
  168. * @arg ...
  169. * @arg GPIO_PIN_7
  170. * @note 仅支持单个引脚
  171. * @retval uint32_t GPIO引脚模式
  172. * @arg GPIO_MODE_INPUT 输入模式
  173. * @arg GPIO_MODE_OUTPUT 输出模式
  174. * @arg GPIO_MODE_ALTERNATE 复用模式
  175. * @arg GPIO_MODE_ANALOG 模拟模式
  176. */
  177. __STATIC_INLINE uint32_t std_gpio_get_pin_mode(GPIO_t *gpiox, uint32_t pin)
  178. {
  179. return ((gpiox->MODE & ((pin * pin) * GPIO_MODE_MODE0)) / (pin * pin));
  180. }
  181. /**
  182. * @brief 设置GPIO引脚输出类型
  183. * @param gpiox GPIO外设
  184. * @arg GPIOA
  185. * @arg GPIOB
  186. * @arg GPIOC
  187. * @param pin_mask GPIO引脚组合
  188. * @arg GPIO_PIN_0
  189. * @arg GPIO_PIN_1
  190. * @arg ...
  191. * @arg GPIO_PIN_7
  192. * @param output_type GPIO引脚输出类型
  193. * @arg GPIO_OUTPUT_PUSHPULL 推挽输出
  194. * @arg GPIO_OUTPUT_OPENDRAIN 开漏输出
  195. * @retval 无
  196. */
  197. __STATIC_INLINE void std_gpio_set_pin_output_type(GPIO_t *gpiox, uint32_t pin_mask, uint32_t output_type)
  198. {
  199. MODIFY_REG(gpiox->OTYPE, pin_mask, pin_mask * output_type);
  200. }
  201. /**
  202. * @brief 读取GPIO引脚输出类型
  203. * @param gpiox GPIO外设
  204. * @arg GPIOA
  205. * @arg GPIOB
  206. * @arg GPIOC
  207. * @param pin GPIO引脚
  208. * @arg GPIO_PIN_0
  209. * @arg GPIO_PIN_1
  210. * @arg ...
  211. * @arg GPIO_PIN_7
  212. * @note 仅支持单个引脚
  213. * @retval uint32_t GPIO引脚输出类型
  214. * @arg GPIO_OUTPUT_PUSHPULL 推挽输出
  215. * @arg GPIO_OUTPUT_OPENDRAIN 开漏输出
  216. */
  217. __STATIC_INLINE uint32_t std_gpio_get_pin_output_type(GPIO_t *gpiox, uint32_t pin)
  218. {
  219. return ((gpiox->OTYPE & (pin)) != 0U ? GPIO_OUTPUT_OPENDRAIN : GPIO_OUTPUT_PUSHPULL);
  220. }
  221. /**
  222. * @brief 设置GPIO引脚上下拉配置
  223. * @param gpiox GPIO外设
  224. * @arg GPIOA
  225. * @arg GPIOB
  226. * @arg GPIOC
  227. * @param pin GPIO引脚
  228. * @arg GPIO_PIN_0
  229. * @arg GPIO_PIN_1
  230. * @arg ...
  231. * @arg GPIO_PIN_7
  232. * @param pull GPIO引脚上下拉配置
  233. * @arg GPIO_NOPULL 无上、下拉
  234. * @arg GPIO_PULLUP 上拉
  235. * @arg GPIO_PULLDOWN 下拉
  236. * @note 仅支持单个引脚
  237. * @retval 无
  238. */
  239. __STATIC_INLINE void std_gpio_set_pin_pull(GPIO_t *gpiox, uint32_t pin, uint32_t pull)
  240. {
  241. MODIFY_REG(gpiox->PUPD, ((pin * pin) * GPIO_PUPD_PUPD0), ((pin * pin) * pull));
  242. }
  243. /**
  244. * @brief 读取GPIO引脚上下拉配置
  245. * @param gpiox GPIO外设
  246. * @arg GPIOA
  247. * @arg GPIOB
  248. * @arg GPIOC
  249. * @param pin GPIO引脚
  250. * @arg GPIO_PIN_0
  251. * @arg GPIO_PIN_1
  252. * @arg ...
  253. * @arg GPIO_PIN_7
  254. * @note 仅支持单个引脚
  255. * @retval uint32_t GPIO引脚上下拉配置
  256. * @arg GPIO_NOPULL 无上、下拉
  257. * @arg GPIO_PULLUP 上拉
  258. * @arg GPIO_PULLDOWN 下拉
  259. */
  260. __STATIC_INLINE uint32_t std_gpio_get_pin_pull(GPIO_t *gpiox, uint32_t pin)
  261. {
  262. return ((gpiox->PUPD & ((pin * pin) * GPIO_PUPD_PUPD0)) / (pin * pin));
  263. }
  264. /**
  265. * @brief 设置GPIO引脚(0~7)复用功能
  266. * @param gpiox GPIO外设
  267. * @arg GPIOA
  268. * @arg GPIOB
  269. * @arg GPIOC
  270. * @param pin GPIO引脚
  271. * @arg GPIO_PIN_0
  272. * @arg GPIO_PIN_1
  273. * @arg ...
  274. * @arg GPIO_PIN_7
  275. * @param alternate GPIO引脚(0~7)复用功能
  276. * @arg GPIO_AF0_SPI1
  277. * @arg GPIO_AF0_SWCLK
  278. * @arg GPIO_AF0_SWDIO
  279. * @arg GPIO_AF1_UART1
  280. * @arg GPIO_AF2_TIM1
  281. * @arg GPIO_AF3_TIM1
  282. * @arg GPIO_AF3_TIM3
  283. * @arg GPIO_AF4_TIM1
  284. * @arg GPIO_AF4_COMP1
  285. * @arg GPIO_AF4_SPI1
  286. * @arg GPIO_AF5_TIM1
  287. * @arg GPIO_AF5_UART1
  288. * @arg GPIO_AF5_UART2
  289. * @arg GPIO_AF6_I2C1
  290. * @arg GPIO_AF6_MCO
  291. * @arg GPIO_AF7_COMP2
  292. * @arg GPIO_AF7_IR_OUT
  293. * @arg GPIO_AF7_MCO
  294. * @note 仅支持单个引脚
  295. * @retval 无
  296. */
  297. __STATIC_INLINE void std_gpio_set_afpin_0_7(GPIO_t *gpiox, uint32_t pin, uint32_t alternate)
  298. {
  299. MODIFY_REG(gpiox->AFL, ((((pin * pin) * pin) * pin) * GPIO_AF_SELECT_OFFSET),
  300. ((((pin * pin) * pin) * pin) * alternate));
  301. }
  302. /**
  303. * @brief 读取GPIO引脚(0~7)复用功能
  304. * @param gpiox GPIO外设
  305. * @arg GPIOA
  306. * @arg GPIOB
  307. * @arg GPIOC
  308. * @param pin GPIO引脚
  309. * @arg GPIO_PIN_0
  310. * @arg GPIO_PIN_1
  311. * @arg ...
  312. * @arg GPIO_PIN_7
  313. * @note 仅支持单个引脚
  314. * @retval uint32_t GPIO引脚(0~7)复用功能
  315. * @arg GPIO_AF0_SPI1
  316. * @arg GPIO_AF0_SWCLK
  317. * @arg GPIO_AF0_SWDIO
  318. * @arg GPIO_AF1_UART1
  319. * @arg GPIO_AF2_TIM1
  320. * @arg GPIO_AF3_TIM1
  321. * @arg GPIO_AF3_TIM3
  322. * @arg GPIO_AF4_TIM1
  323. * @arg GPIO_AF4_COMP1
  324. * @arg GPIO_AF4_SPI1
  325. * @arg GPIO_AF5_TIM1
  326. * @arg GPIO_AF5_UART1
  327. * @arg GPIO_AF5_UART2
  328. * @arg GPIO_AF6_I2C1
  329. * @arg GPIO_AF6_MCO
  330. * @arg GPIO_AF7_COMP2
  331. * @arg GPIO_AF7_IR_OUT
  332. * @arg GPIO_AF7_MCO
  333. */
  334. __STATIC_INLINE uint32_t std_gpio_get_afpin_0_7(GPIO_t *gpiox, uint32_t pin)
  335. {
  336. return ((gpiox->AFL & ((((pin * pin) * pin) * pin) * GPIO_AF_SELECT_OFFSET)) /
  337. (((pin * pin) * pin) * pin));
  338. }
  339. /**
  340. * @brief 读取GPIO引脚输入状态
  341. * @param gpiox GPIO外设
  342. * @arg GPIOA
  343. * @arg GPIOB
  344. * @arg GPIOC
  345. * @param pin GPIO引脚
  346. * @arg GPIO_PIN_0
  347. * @arg GPIO_PIN_1
  348. * @arg ...
  349. * @arg GPIO_PIN_7
  350. * @note 仅支持单个引脚
  351. * @retval bool GPIO引脚输入状态
  352. * @arg true 表示高电平
  353. * @arg false 表示低电平
  354. */
  355. __STATIC_INLINE bool std_gpio_get_input_pin(GPIO_t* gpiox, uint32_t pin)
  356. {
  357. return ((gpiox->IDR & (pin)) == (pin));
  358. }
  359. /**
  360. * @brief 读取GPIO引脚输出状态
  361. * @param gpiox GPIO外设
  362. * @arg GPIOA
  363. * @arg GPIOB
  364. * @arg GPIOC
  365. * @param pin GPIO引脚
  366. * @arg GPIO_PIN_0
  367. * @arg GPIO_PIN_1
  368. * @arg ...
  369. * @arg GPIO_PIN_7
  370. * @note 仅支持单个引脚
  371. * @retval bool GPIO引脚输出状态
  372. * @arg true 表示高电平
  373. * @arg false 表示低电平
  374. */
  375. __STATIC_INLINE bool std_gpio_get_output_pin(GPIO_t* gpiox, uint32_t pin)
  376. {
  377. return ((gpiox->ODR & (pin)) == (pin));
  378. }
  379. /**
  380. * @brief 读取GPIO端口输入数据
  381. * @param gpiox GPIO外设
  382. * @arg GPIOA
  383. * @arg GPIOB
  384. * @arg GPIOC
  385. * @retval uint32_t GPIO端口输入数据
  386. */
  387. __STATIC_INLINE uint32_t std_gpio_read_input_port(GPIO_t* gpiox)
  388. {
  389. return (gpiox->IDR);
  390. }
  391. /**
  392. * @brief 读取GPIO端口输出数据
  393. * @param gpiox GPIO外设
  394. * @arg GPIOA
  395. * @arg GPIOB
  396. * @arg GPIOC
  397. * @retval uint32_t GPIO端口输出数据
  398. */
  399. __STATIC_INLINE uint32_t std_gpio_read_output_port(GPIO_t* gpiox)
  400. {
  401. return (gpiox->ODR);
  402. }
  403. /**
  404. * @brief 写入GPIO端口输出数据
  405. * @param gpiox GPIO外设
  406. * @arg GPIOA
  407. * @arg GPIOB
  408. * @arg GPIOC
  409. * @param value 输出数据
  410. * @retval 无
  411. */
  412. __STATIC_INLINE void std_gpio_write_output_port(GPIO_t* gpiox, uint32_t value)
  413. {
  414. gpiox->ODR = value;
  415. }
  416. /**
  417. * @brief 设置GPIO输出高电平
  418. * @param gpiox GPIO外设
  419. * @arg GPIOA
  420. * @arg GPIOB
  421. * @arg GPIOC
  422. * @param pin_mask GPIO引脚组合
  423. * @arg GPIO_PIN_0
  424. * @arg GPIO_PIN_1
  425. * @arg ...
  426. * @arg GPIO_PIN_7
  427. * @retval 无
  428. */
  429. __STATIC_INLINE void std_gpio_set_pin(GPIO_t* gpiox, uint32_t pin_mask)
  430. {
  431. gpiox->BSR = pin_mask;
  432. }
  433. /**
  434. * @brief 设置GPIO输出低电平
  435. * @param gpiox GPIO外设
  436. * @arg GPIOA
  437. * @arg GPIOB
  438. * @arg GPIOC
  439. * @param pin_mask GPIO引脚组合
  440. * @arg GPIO_PIN_0
  441. * @arg GPIO_PIN_1
  442. * @arg ...
  443. * @arg GPIO_PIN_7
  444. * @retval 无
  445. */
  446. __STATIC_INLINE void std_gpio_reset_pin(GPIO_t* gpiox, uint32_t pin_mask)
  447. {
  448. gpiox->BR = pin_mask;
  449. }
  450. /**
  451. * @brief 切换GPIO端口高/低电平
  452. * @param gpiox GPIO外设
  453. * @arg GPIOA
  454. * @arg GPIOB
  455. * @arg GPIOC
  456. * @param pin_mask GPIO引脚组合
  457. * @arg GPIO_PIN_0
  458. * @arg GPIO_PIN_1
  459. * @arg ...
  460. * @arg GPIO_PIN_7
  461. * @retval 无
  462. */
  463. __STATIC_INLINE void std_gpio_toggle_pin(GPIO_t* gpiox, uint32_t pin_mask)
  464. {
  465. gpiox->ODR ^= pin_mask;
  466. }
  467. void std_gpio_init(GPIO_t* gpiox, std_gpio_init_t* gpio_init_param);
  468. void std_gpio_deinit(GPIO_t* gpiox);
  469. void std_gpio_struct_init(std_gpio_init_t* gpio_init_struct);
  470. /**
  471. * @}
  472. */
  473. #ifdef __cplusplus
  474. }
  475. #endif
  476. /**
  477. * @}
  478. */
  479. /**
  480. * @}
  481. */
  482. #endif /* CIU32F003_STD_GPIO_H */