目录
1.3 API函数gpio_output_options_set设置输出参数
GD32F450最多有140个GPIO,GPIOA-GPIOI(GPIOI只有12个IO)。
1. GPIO复用
1.1 API函数gpio_af_set设置复用功能
void gpio_af_set(uint32_t gpio_periph, uint32_t alt_func_num, uint32_t pin)
其中第二个参数可以参考datasheet的Table 2-6到Table2-14,也可以参考注释:
GPIO_AF_0: SYSTEM
GPIO_AF_1: TIMER0, TIMER1
GPIO_AF_2: TIMER2, TIMER3, TIMER4
GPIO_AF_3: TIMER7, TIMER8, TIMER9, TIMER10
GPIO_AF_4: I2C0, I2C1, I2C2
GPIO_AF_5: SPI0, SPI1, SPI2, SPI3, SPI4, SPI5
GPIO_AF_6: SPI1, SPI2, SAI0
GPIO_AF_7: USART0, USART1, USART2
GPIO_AF_8: UART3, UART4, USART5, UART6, UART7
GPIO_AF_9: CAN0, CAN1, TLI, TIMER11, TIMER12, TIMER13
GPIO_AF_10: USB_FS, USB_HS
GPIO_AF_11: ENET
GPIO_AF_12: EXMC, SDIO, USB_HS
GPIO_AF_13: DCI
GPIO_AF_14: TLI
GPIO_AF_15: EVENTOUT
1.2 API函数gpio_mode_set设置模式
void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin)
第二个参数选择GPIO_MODE_AF。
1.3 API函数gpio_output_options_set设置输出参数
void gpio_output_options_set(uint32_t gpio_periph, uint8_t otype, uint32_t speed, uint32_t pin)
以USART0的GPIO设置为例:
//A9: TX
gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_9);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
//A10: RX
gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_10);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
2. GPIO输出
2.1 设置为输出
gpio_mode_set第二个参数mode为GPIO_MODE_OUTPUT, 第三个参数pull_up_down根据实际情况选择GPIO_PUPD_NONE、GPIO_PUPD_PULLUP和GPIO_PUPD_PULLDOWN
例如设置LED1的IO
#define IO_LED1 GPIOE
#define PIN_LED1 2
#define LED1SetOut() {\
gpio_mode_set(IO_LED1, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, ((uint32_t)1 << PIN_LED1)); \
gpio_output_options_set(IO_LED1, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, ((uint32_t)1 << PIN_LED1)); \
}
2.2 输出高
通过寄存器BOP设置高电平输出(这个寄存器的高16位可以设置为1使GPIO输出低)。
#define LED1On() GPIO_BOP(IO_LED1) = ((uint32_t)1 << PIN_LED1)
2.3 输出低
通过寄存器BC设置低电平输出
#define LED1Off() GPIO_BC(IO_LED1) = ((uint32_t)1 << PIN_LED1)
2.4 翻转输出
通过寄存器TG翻转输出
#define LED1Toggle() GPIO_TG(IO_LED1) = ((uint32_t)1 << PIN_LED1)
3. GPIO输入
3.1 配置为输入
gpio_mode_set第二个参数mode为GPIO_MODE_INPUT,第三个参数pull_up_down根据实际情况选择GPIO_PUPD_NONE、GPIO_PUPD_PULLUP和GPIO_PUPD_PULLDOWN。
3.2 读入IO状态
FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin)
高电平时返回SET,低电平返回RESET。
4 寄存器方式
4.1 AF模式选择
有2个寄存器用来设置一个Port的16个Pin(GPIO_AFSEL0和GPIO_AFSEL1)。以配置SDIO CK脚为例:
#if(PIN_SDIO_CK > 7)
GPIO_AFSEL1(IO_SDIO_CK) &= ~(uint32_t)((uint32_t)0xF << (PIN_SDIO_CK % 8) * 4);
GPIO_AFSEL1(IO_SDIO_CK) |= (((uint32_t)12 << (PIN_SDIO_CK % 8) * 4));
#else
GPIO_AFSEL0(IO_SDIO_CK) &= ~(uint32_t)((uint32_t)0xF << (PIN_SDIO_CK % 8) * 4);
GPIO_AFSEL0(IO_SDIO_CK) |= (((uint32_t)12 << (PIN_SDIO_CK % 8) * 4));
#endif
每4个位表示一个Pin,16种AF模式。
4.2 IO模式选择
通过设置寄存器GPIO_CTL选择IO模式,每2个位表示一个Pin,共4种模式:
#define GPIO_MODE_INPUT CTL_CLTR(0) /*!< input mode */
#define GPIO_MODE_OUTPUT CTL_CLTR(1) /*!< output mode */
#define GPIO_MODE_AF CTL_CLTR(2) /*!< alternate function mode */
#define GPIO_MODE_ANALOG CTL_CLTR(3) /*!< analog mode *
以设置为AF模式为例:
GPIO_CTL(IO_SDIO_CK) &= ~(uint32_t)(((uint32_t)0x3 << PIN_SDIO_CK * 2));
GPIO_CTL(IO_SDIO_CK) |= (uint32_t)(((uint32_t)0x2 << PIN_SDIO_CK * 2)); //GPIO_MODE_AF
4.3 上下拉方式选择
通过设置寄存器GPIO_PUD选择上下拉方式,每2个位表示一个Pin,共3种方式:
#define GPIO_PUPD_NONE PUD_PUPD(0) /*!< floating mode, no pull-up and pull-down resistors */
#define GPIO_PUPD_PULLUP PUD_PUPD(1) /*!< with pull-up resistor */
#define GPIO_PUPD_PULLDOWN PUD_PUPD(2) /*!< with pull-down resistor */
以设置为NONE的情况为例:
GPIO_PUD(IO_SDIO_CK) &= ~(uint32_t)(((uint32_t)0x3 << PIN_SDIO_CK * 2));
//GPIO_PUD(IO_SDIO_CK) |= (uint32_t)(((uint32_t)0x1 << PIN_SDIO_CK * 2)); //GPIO_PUPD_PULLUP
4.4 输出类型设置
通过设置寄存器GPIO_OMODE设置输出类型,每1个位表示一个Pin,共2种方式:
#define GPIO_OTYPE_PP ((uint8_t)(0x00U)) /*!< push pull mode */
#define GPIO_OTYPE_OD ((uint8_t)(0x01U)) /*!< open drain mode */
以设置为PP为例:
GPIO_OMODE(IO_SDIO_CK) &= ~(uint32_t)((uint32_t)0x1 << PIN_SDIO_CK); //GPIO_OTYPE_PP
4.5 设置IO速度
通过设置寄存器GPIO_OSPD设置速度,每2个位表示一个Pin,共4种速度:
#define GPIO_OSPEED_2MHZ GPIO_OSPEED_LEVEL0 /*!< output max speed 2MHz */
#define GPIO_OSPEED_25MHZ GPIO_OSPEED_LEVEL1 /*!< output max speed 25MHz */
#define GPIO_OSPEED_50MHZ GPIO_OSPEED_LEVEL2 /*!< output max speed 50MHz */
#define GPIO_OSPEED_200MHZ GPIO_OSPEED_LEVEL3 /*!< output max speed 200MHz */
以设置为25MHz为例:
GPIO_OSPD(IO_SDIO_CK) &= ~(uint32_t)((uint32_t)0x3 << PIN_SDIO_CK * 2);
GPIO_OSPD(IO_SDIO_CK) |= (uint32_t)(((uint32_t)0x1 << PIN_SDIO_CK * 2)); //GPIO_OSPEED_25MHZ
4.6 输入
对应寄存器GPIO_ISTAT,每个位对应一个Pin。