123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537 |
- /************************************************************************************************/
- /**
- * @file ciu32f003_std_gpio.h
- * @author MCU Ecosystem Development Team
- * @brief GPIO STD库驱动头文件。
- * 提供GPIO相关的STD库操作函数声明、数据类型以及常量的定义。
- *
- *
- **************************************************************************************************
- * @attention
- * Copyright (c) CEC Huada Electronic Design Co.,Ltd. All rights reserved.
- *
- **************************************************************************************************
- */
- /* 避免头文件重复引用 */
- #ifndef CIU32F003_STD_GPIO_H
- #define CIU32F003_STD_GPIO_H
- /************************************************************************************************/
- /**
- * @addtogroup CIU32F003_STD_Driver
- * @{
- */
- /**
- * @defgroup GPIO GPIO
- * @brief 通用输入/输出接口的STD库驱动
- * @{
- */
- /************************************************************************************************/
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*------------------------------------------includes--------------------------------------------*/
- #include "ciu32f003_std_common.h"
- /*-----------------------------------------type define------------------------------------------*/
- /************************************************************************************************/
- /**
- * @defgroup GPIO_Types GPIO Types
- * @brief GPIO数据类型定义
- * @{
- */
- /************************************************************************************************/
- /**
- * @brief GPIO初始化结构体定义
- */
- typedef struct
- {
- uint32_t pin; /**< 指定GPIO引脚,可以是GPIO引脚组合
- @arg GPIO_PIN_0 ... */
- uint32_t mode; /**< 指定GPIO引脚模式及输出类型配置
- @arg GPIO_MODE_INPUT
- @arg GPIO_MODE_ANALOG
- @arg GPIO_MODE_OUTPUT
- @arg GPIO_MODE_ALTERNATE */
- uint32_t pull; /**< 指定GPIO引脚上/下拉配置
- @arg GPIO_NOPULL ... */
- uint32_t output_type; /**< 指定GPIO输出类型
- @arg GPIO_OUTPUT_PUSHPULL
- @arg GPIO_OUTPUT_OPENDRAIN */
-
- uint32_t alternate; /**< 指定GPIO引脚复用功能配置
- @arg GPIO_AF0_SPI1 ... */
- } std_gpio_init_t;
- /**
- * @}
- */
- /*--------------------------------------------define--------------------------------------------*/
- /************************************************************************************************/
- /**
- * @defgroup GPIO_Constants GPIO Constants
- * @brief GPIO常量定义及宏定义
- * @{
- *
- */
- /************************************************************************************************/
- /* GPIO PIN常量 */
- #define GPIO_PIN_0 ((uint16_t)0x0001U) /**< 选定 PIN 0 */
- #define GPIO_PIN_1 ((uint16_t)0x0002U) /**< 选定 PIN 1 */
- #define GPIO_PIN_2 ((uint16_t)0x0004U) /**< 选定 PIN 2 */
- #define GPIO_PIN_3 ((uint16_t)0x0008U) /**< 选定 PIN 3 */
- #define GPIO_PIN_4 ((uint16_t)0x0010U) /**< 选定 PIN 4 */
- #define GPIO_PIN_5 ((uint16_t)0x0020U) /**< 选定 PIN 5 */
- #define GPIO_PIN_6 ((uint16_t)0x0040U) /**< 选定 PIN 6 */
- #define GPIO_PIN_7 ((uint16_t)0x0080U) /**< 选定 PIN 7 */
- #define GPIO_PIN_All ((uint16_t)0x00FFU) /**< 选定 全部 */
- /* GPIO 模式配置常量 */
- #define GPIO_MODE_INPUT (0x00000000U) /**< 输入浮空 */
- #define GPIO_MODE_OUTPUT (0x00000001U) /**< 输出功能 */
- #define GPIO_MODE_ALTERNATE (0x00000002U) /**< 复用功能 */
- #define GPIO_MODE_ANALOG (0x00000003U) /**< 模拟功能 */
- /* GPIO 上下拉配置参数 */
- #define GPIO_NOPULL (0x00000000U) /**< 无上、下拉 */
- #define GPIO_PULLUP (0x00000001U) /**< 上拉 */
- #define GPIO_PULLDOWN (0x00000002U) /**< 下拉 */
- /* GPIO 输出类型 */
- #define GPIO_OUTPUT_PUSHPULL (0x00000000U) /**< 推挽输出 */
- #define GPIO_OUTPUT_OPENDRAIN (0x00000001U) /**< 开漏输出 */
- /* 复用功能0 */
- #define GPIO_AF0_SPI1 ((uint8_t)0x00U) /**< SPI1 复用功能映射 */
- #define GPIO_AF0_SWCLK ((uint8_t)0x00U) /**< SWCLK 复用功能映射 */
- #define GPIO_AF0_SWDIO ((uint8_t)0x00U) /**< SWDIO 复用功能映射 */
- /* 复用功能1 */
- #define GPIO_AF1_UART1 ((uint8_t)0x01U) /**< UART1 复用功能映射 */
- /* 复用功能2 */
- #define GPIO_AF2_TIM1 ((uint8_t)0x02U) /**< TIM1 复用功能映射 */
- /* 复用功能3 */
- #define GPIO_AF3_TIM1 ((uint8_t)0x03U) /**< TIM1 复用功能映射 */
- #define GPIO_AF3_TIM3 ((uint8_t)0x03U) /**< TIM3 复用功能映射 */
- /* 复用功能4 */
- #define GPIO_AF4_TIM1 ((uint8_t)0x04U) /**< TIM1 复用功能映射 */
- #define GPIO_AF4_COMP1 ((uint8_t)0x04U) /**< COMP1 复用功能映射 */
- #define GPIO_AF4_SPI1 ((uint8_t)0x04U) /**< SPI1 复用功能映射 */
- /* 复用功能5 */
- #define GPIO_AF5_TIM1 ((uint8_t)0x05U) /**< TIM1 复用功能映射 */
- #define GPIO_AF5_UART1 ((uint8_t)0x05U) /**< UART1 复用功能映射 */
- #define GPIO_AF5_UART2 ((uint8_t)0x05U) /**< UART2 复用功能映射 */
- /* 复用功能6 */
- #define GPIO_AF6_I2C1 ((uint8_t)0x06U) /**< I2C1 复用功能映射 */
- #define GPIO_AF6_MCO ((uint8_t)0x06U) /**< MCO 复用功能映射 */
- /* 复用功能7 */
- #define GPIO_AF7_COMP2 ((uint8_t)0x07U) /**< COMP2 复用功能映射 */
- #define GPIO_AF7_IR_OUT ((uint8_t)0x07U) /**< IR_OUT 复用功能映射 */
- #define GPIO_AF7_MCO ((uint8_t)0x07U) /**< MCO 复用功能映射 */
- /* 复用功能寄存器GPIO源选择偏移位 */
- #define GPIO_AF_SELECT_OFFSET (0x0000000FU) /**< GPIO源选择偏移位 */
- /**
- * @}
- */
- /*-------------------------------------------functions------------------------------------------*/
- /************************************************************************************************/
- /**
- * @defgroup GPIO_External_Functions GPIO External Functions
- * @brief GPIO对外函数
- * @{
- *
- */
- /************************************************************************************************/
- /**
- * @brief 设置GPIO引脚模式
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @param pin GPIO引脚
- * @arg GPIO_PIN_0
- * @arg GPIO_PIN_1
- * @arg ...
- * @arg GPIO_PIN_7
- * @param mode GPIO引脚模式
- * @arg GPIO_MODE_INPUT 输入模式
- * @arg GPIO_MODE_OUTPUT 输出模式
- * @arg GPIO_MODE_ALTERNATE 复用模式
- * @arg GPIO_MODE_ANALOG 模拟模式
- * @note 仅支持单个引脚
- * @retval 无
- */
- __STATIC_INLINE void std_gpio_set_pin_mode(GPIO_t *gpiox, uint32_t pin, uint32_t mode)
- {
- MODIFY_REG(gpiox->MODE, ((pin * pin) * GPIO_MODE_MODE0), ((pin * pin) * mode));
- }
- /**
- * @brief 读取GPIO引脚模式
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @param pin GPIO引脚
- * @arg GPIO_PIN_0
- * @arg GPIO_PIN_1
- * @arg ...
- * @arg GPIO_PIN_7
- * @note 仅支持单个引脚
- * @retval uint32_t GPIO引脚模式
- * @arg GPIO_MODE_INPUT 输入模式
- * @arg GPIO_MODE_OUTPUT 输出模式
- * @arg GPIO_MODE_ALTERNATE 复用模式
- * @arg GPIO_MODE_ANALOG 模拟模式
- */
- __STATIC_INLINE uint32_t std_gpio_get_pin_mode(GPIO_t *gpiox, uint32_t pin)
- {
- return ((gpiox->MODE & ((pin * pin) * GPIO_MODE_MODE0)) / (pin * pin));
- }
- /**
- * @brief 设置GPIO引脚输出类型
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @param pin_mask GPIO引脚组合
- * @arg GPIO_PIN_0
- * @arg GPIO_PIN_1
- * @arg ...
- * @arg GPIO_PIN_7
- * @param output_type GPIO引脚输出类型
- * @arg GPIO_OUTPUT_PUSHPULL 推挽输出
- * @arg GPIO_OUTPUT_OPENDRAIN 开漏输出
- * @retval 无
- */
- __STATIC_INLINE void std_gpio_set_pin_output_type(GPIO_t *gpiox, uint32_t pin_mask, uint32_t output_type)
- {
- MODIFY_REG(gpiox->OTYPE, pin_mask, pin_mask * output_type);
- }
- /**
- * @brief 读取GPIO引脚输出类型
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @param pin GPIO引脚
- * @arg GPIO_PIN_0
- * @arg GPIO_PIN_1
- * @arg ...
- * @arg GPIO_PIN_7
- * @note 仅支持单个引脚
- * @retval uint32_t GPIO引脚输出类型
- * @arg GPIO_OUTPUT_PUSHPULL 推挽输出
- * @arg GPIO_OUTPUT_OPENDRAIN 开漏输出
- */
- __STATIC_INLINE uint32_t std_gpio_get_pin_output_type(GPIO_t *gpiox, uint32_t pin)
- {
- return ((gpiox->OTYPE & (pin)) != 0U ? GPIO_OUTPUT_OPENDRAIN : GPIO_OUTPUT_PUSHPULL);
- }
- /**
- * @brief 设置GPIO引脚上下拉配置
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @param pin GPIO引脚
- * @arg GPIO_PIN_0
- * @arg GPIO_PIN_1
- * @arg ...
- * @arg GPIO_PIN_7
- * @param pull GPIO引脚上下拉配置
- * @arg GPIO_NOPULL 无上、下拉
- * @arg GPIO_PULLUP 上拉
- * @arg GPIO_PULLDOWN 下拉
- * @note 仅支持单个引脚
- * @retval 无
- */
- __STATIC_INLINE void std_gpio_set_pin_pull(GPIO_t *gpiox, uint32_t pin, uint32_t pull)
- {
- MODIFY_REG(gpiox->PUPD, ((pin * pin) * GPIO_PUPD_PUPD0), ((pin * pin) * pull));
- }
- /**
- * @brief 读取GPIO引脚上下拉配置
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @param pin GPIO引脚
- * @arg GPIO_PIN_0
- * @arg GPIO_PIN_1
- * @arg ...
- * @arg GPIO_PIN_7
- * @note 仅支持单个引脚
- * @retval uint32_t GPIO引脚上下拉配置
- * @arg GPIO_NOPULL 无上、下拉
- * @arg GPIO_PULLUP 上拉
- * @arg GPIO_PULLDOWN 下拉
- */
- __STATIC_INLINE uint32_t std_gpio_get_pin_pull(GPIO_t *gpiox, uint32_t pin)
- {
- return ((gpiox->PUPD & ((pin * pin) * GPIO_PUPD_PUPD0)) / (pin * pin));
- }
- /**
- * @brief 设置GPIO引脚(0~7)复用功能
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @param pin GPIO引脚
- * @arg GPIO_PIN_0
- * @arg GPIO_PIN_1
- * @arg ...
- * @arg GPIO_PIN_7
- * @param alternate GPIO引脚(0~7)复用功能
- * @arg GPIO_AF0_SPI1
- * @arg GPIO_AF0_SWCLK
- * @arg GPIO_AF0_SWDIO
- * @arg GPIO_AF1_UART1
- * @arg GPIO_AF2_TIM1
- * @arg GPIO_AF3_TIM1
- * @arg GPIO_AF3_TIM3
- * @arg GPIO_AF4_TIM1
- * @arg GPIO_AF4_COMP1
- * @arg GPIO_AF4_SPI1
- * @arg GPIO_AF5_TIM1
- * @arg GPIO_AF5_UART1
- * @arg GPIO_AF5_UART2
- * @arg GPIO_AF6_I2C1
- * @arg GPIO_AF6_MCO
- * @arg GPIO_AF7_COMP2
- * @arg GPIO_AF7_IR_OUT
- * @arg GPIO_AF7_MCO
- * @note 仅支持单个引脚
- * @retval 无
- */
- __STATIC_INLINE void std_gpio_set_afpin_0_7(GPIO_t *gpiox, uint32_t pin, uint32_t alternate)
- {
- MODIFY_REG(gpiox->AFL, ((((pin * pin) * pin) * pin) * GPIO_AF_SELECT_OFFSET),
- ((((pin * pin) * pin) * pin) * alternate));
- }
- /**
- * @brief 读取GPIO引脚(0~7)复用功能
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @param pin GPIO引脚
- * @arg GPIO_PIN_0
- * @arg GPIO_PIN_1
- * @arg ...
- * @arg GPIO_PIN_7
- * @note 仅支持单个引脚
- * @retval uint32_t GPIO引脚(0~7)复用功能
- * @arg GPIO_AF0_SPI1
- * @arg GPIO_AF0_SWCLK
- * @arg GPIO_AF0_SWDIO
- * @arg GPIO_AF1_UART1
- * @arg GPIO_AF2_TIM1
- * @arg GPIO_AF3_TIM1
- * @arg GPIO_AF3_TIM3
- * @arg GPIO_AF4_TIM1
- * @arg GPIO_AF4_COMP1
- * @arg GPIO_AF4_SPI1
- * @arg GPIO_AF5_TIM1
- * @arg GPIO_AF5_UART1
- * @arg GPIO_AF5_UART2
- * @arg GPIO_AF6_I2C1
- * @arg GPIO_AF6_MCO
- * @arg GPIO_AF7_COMP2
- * @arg GPIO_AF7_IR_OUT
- * @arg GPIO_AF7_MCO
- */
- __STATIC_INLINE uint32_t std_gpio_get_afpin_0_7(GPIO_t *gpiox, uint32_t pin)
- {
- return ((gpiox->AFL & ((((pin * pin) * pin) * pin) * GPIO_AF_SELECT_OFFSET)) /
- (((pin * pin) * pin) * pin));
- }
- /**
- * @brief 读取GPIO引脚输入状态
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @param pin GPIO引脚
- * @arg GPIO_PIN_0
- * @arg GPIO_PIN_1
- * @arg ...
- * @arg GPIO_PIN_7
- * @note 仅支持单个引脚
- * @retval bool GPIO引脚输入状态
- * @arg true 表示高电平
- * @arg false 表示低电平
- */
- __STATIC_INLINE bool std_gpio_get_input_pin(GPIO_t* gpiox, uint32_t pin)
- {
- return ((gpiox->IDR & (pin)) == (pin));
- }
- /**
- * @brief 读取GPIO引脚输出状态
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @param pin GPIO引脚
- * @arg GPIO_PIN_0
- * @arg GPIO_PIN_1
- * @arg ...
- * @arg GPIO_PIN_7
- * @note 仅支持单个引脚
- * @retval bool GPIO引脚输出状态
- * @arg true 表示高电平
- * @arg false 表示低电平
- */
- __STATIC_INLINE bool std_gpio_get_output_pin(GPIO_t* gpiox, uint32_t pin)
- {
- return ((gpiox->ODR & (pin)) == (pin));
- }
- /**
- * @brief 读取GPIO端口输入数据
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @retval uint32_t GPIO端口输入数据
- */
- __STATIC_INLINE uint32_t std_gpio_read_input_port(GPIO_t* gpiox)
- {
- return (gpiox->IDR);
- }
- /**
- * @brief 读取GPIO端口输出数据
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @retval uint32_t GPIO端口输出数据
- */
- __STATIC_INLINE uint32_t std_gpio_read_output_port(GPIO_t* gpiox)
- {
- return (gpiox->ODR);
- }
- /**
- * @brief 写入GPIO端口输出数据
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @param value 输出数据
- * @retval 无
- */
- __STATIC_INLINE void std_gpio_write_output_port(GPIO_t* gpiox, uint32_t value)
- {
- gpiox->ODR = value;
- }
- /**
- * @brief 设置GPIO输出高电平
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @param pin_mask GPIO引脚组合
- * @arg GPIO_PIN_0
- * @arg GPIO_PIN_1
- * @arg ...
- * @arg GPIO_PIN_7
- * @retval 无
- */
- __STATIC_INLINE void std_gpio_set_pin(GPIO_t* gpiox, uint32_t pin_mask)
- {
- gpiox->BSR = pin_mask;
- }
- /**
- * @brief 设置GPIO输出低电平
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @param pin_mask GPIO引脚组合
- * @arg GPIO_PIN_0
- * @arg GPIO_PIN_1
- * @arg ...
- * @arg GPIO_PIN_7
- * @retval 无
- */
- __STATIC_INLINE void std_gpio_reset_pin(GPIO_t* gpiox, uint32_t pin_mask)
- {
- gpiox->BR = pin_mask;
- }
- /**
- * @brief 切换GPIO端口高/低电平
- * @param gpiox GPIO外设
- * @arg GPIOA
- * @arg GPIOB
- * @arg GPIOC
- * @param pin_mask GPIO引脚组合
- * @arg GPIO_PIN_0
- * @arg GPIO_PIN_1
- * @arg ...
- * @arg GPIO_PIN_7
- * @retval 无
- */
- __STATIC_INLINE void std_gpio_toggle_pin(GPIO_t* gpiox, uint32_t pin_mask)
- {
- gpiox->ODR ^= pin_mask;
- }
- void std_gpio_init(GPIO_t* gpiox, std_gpio_init_t* gpio_init_param);
- void std_gpio_deinit(GPIO_t* gpiox);
- void std_gpio_struct_init(std_gpio_init_t* gpio_init_struct);
- /**
- * @}
- */
- #ifdef __cplusplus
- }
- #endif
- /**
- * @}
- */
- /**
- * @}
- */
- #endif /* CIU32F003_STD_GPIO_H */
|