GD32450i-EVAL学习笔记 2 - GPIO

目录

1. GPIO复用

1.1 API函数gpio_af_set设置复用功能

1.2  API函数gpio_mode_set设置模式

1.3 API函数gpio_output_options_set设置输出参数

2. GPIO输出

2.1 设置为输出

2.2 输出高

2.3 输出低

2.4 翻转输出

3. GPIO输入

3.1 配置为输入

3.2 读入IO状态

4 寄存器方式

4.1 AF模式选择

4.2 IO模式选择

4.3 上下拉方式选择

4.4 输出类型设置

4.5 设置IO速度

4.6 输入


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。

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值