gd32f4xx中gpio_af_set
时间: 2024-04-24 12:17:05 浏览: 24
`gpio_af_set`是一个函数,用于将特定GPIO引脚的复用功能设置为特定的复用功能。在GD32F4xx系列芯片中,每个GPIO引脚都可以配置为多个不同的复用功能,例如UART、SPI、I2C等。使用`gpio_af_set`函数可以将GPIO引脚的复用功能设置为所需的功能。
以下是`gpio_af_set`函数的语法和参数说明:
```c
void gpio_af_set(uint32_t gpio_periph, uint8_t gpio_pin, uint8_t gpio_af);
```
- `gpio_periph`:要配置的GPIO端口,取值范围为`GPIOA`到`GPIOI`。
- `gpio_pin`:要配置的GPIO引脚编号,取值范围为0到15。
- `gpio_af`:要设置的复用功能编号,取值范围为0到15。
例如,将GPIOA的第0个引脚配置为USART2的TX引脚,可以使用以下代码:
```c
gpio_af_set(GPIOA, GPIO_PIN_0, GPIO_AF_7);
```
相关问题
gd32f4xx 具体rte 1.0.3 标准库 串口5收发驱动程序
以下是基于RTE 1.0.3标准库的串口5收发驱动程序的示例代码:
```c
#include "gd32f4xx.h"
/* 定义串口5的接收缓冲区 */
#define RX_BUF_SIZE 128
uint8_t rx_buf[RX_BUF_SIZE];
uint8_t rx_read = 0;
uint8_t rx_write = 0;
/* 定义串口5的发送缓冲区 */
#define TX_BUF_SIZE 128
uint8_t tx_buf[TX_BUF_SIZE];
uint8_t tx_read = 0;
uint8_t tx_write = 0;
/* 初始化串口5 */
void uart5_init(uint32_t baud_rate)
{
/* 使能USART5和GPIOC时钟 */
rcu_periph_clock_enable(RCU_USART5);
rcu_periph_clock_enable(RCU_GPIOC);
/* 配置PC12为USART5_TX,PC2为USART5_RX */
gpio_af_set(GPIOC, GPIO_AF_8, GPIO_PIN_12 | GPIO_PIN_2);
gpio_mode_set(GPIOC, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_12 | GPIO_PIN_2);
gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
gpio_input_options_set(GPIOC, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
/* 配置USART5工作模式:8位数据位,1位停止位,无校验位 */
usart_word_length_set(UART5, USART_WL_8BIT);
usart_stop_bit_set(UART5, USART_STB_1BIT);
usart_parity_config(UART5, USART_PM_NONE);
/* 配置USART5波特率 */
usart_baudrate_set(UART5, baud_rate);
/* 使能USART5接收中断 */
usart_interrupt_enable(UART5, USART_INT_RBNE);
/* 使能USART5 */
usart_enable(UART5);
}
/* USART5中断处理函数 */
void USART5_IRQHandler(void)
{
if (usart_interrupt_flag_get(UART5, USART_INT_FLAG_RBNE) != RESET) {
/* 读取接收数据 */
uint8_t data = usart_data_receive(UART5);
/* 将接收数据存入接收缓冲区 */
uint8_t next_write = (rx_write + 1) % RX_BUF_SIZE;
if (next_write != rx_read) {
rx_buf[rx_write] = data;
rx_write = next_write;
}
}
if (usart_interrupt_flag_get(UART5, USART_INT_FLAG_TC) != RESET) {
/* 清除发送完成中断标志 */
usart_interrupt_flag_clear(UART5, USART_INT_FLAG_TC);
/* 如果发送缓冲区中还有数据,继续发送 */
if (tx_read != tx_write) {
usart_data_transmit(UART5, tx_buf[tx_read]);
tx_read = (tx_read + 1) % TX_BUF_SIZE;
}
}
}
/* 从串口5接收数据 */
uint16_t uart5_recv(uint8_t *buf, uint16_t len)
{
uint16_t i;
for (i = 0; i < len; i++) {
/* 如果接收缓冲区中没有数据,返回已经接收的数据个数 */
if (rx_read == rx_write) {
break;
}
/* 从接收缓冲区取出一字节数据 */
buf[i] = rx_buf[rx_read];
rx_read = (rx_read + 1) % RX_BUF_SIZE;
}
return i;
}
/* 向串口5发送数据 */
void uart5_send(uint8_t *buf, uint16_t len)
{
uint16_t i;
for (i = 0; i < len; i++) {
/* 将数据存入发送缓冲区 */
uint8_t next_write = (tx_write + 1) % TX_BUF_SIZE;
if (next_write != tx_read) {
tx_buf[tx_write] = buf[i];
tx_write = next_write;
}
}
/* 如果USART5发送寄存器为空,直接发送第一个字节 */
if (usart_flag_get(UART5, USART_FLAG_TBE) != RESET) {
usart_data_transmit(UART5, tx_buf[tx_read]);
tx_read = (tx_read + 1) % TX_BUF_SIZE;
}
}
```
该程序初始化了USART5作为串口,并实现了从串口接收数据和向串口发送数据的函数。在程序中使用了两个缓冲区rx_buf和tx_buf来分别存储串口接收和发送的数据。当接收到数据时,将数据存入rx_buf中;当要发送数据时,将数据存入tx_buf中,并调用USART5的发送函数。USART5的中断处理函数USART5_IRQHandler()会在接收完成和发送完成时被调用,分别处理接收和发送的数据。
GD32F470IIH6的SPI驱动程序
GD32F470IIH6是一款基于ARM Cortex-M4内核的微控制器,其SPI外设是一种全双工同步串行通信接口,可以实现与其他外设的高速数据传输。下面是一个简单的SPI驱动程序示例,仅供参考:
```c
#include "gd32f4xx.h"
void spi_gpio_init(void)
{
/* 使能GPIO时钟 */
rcu_periph_clock_enable(RCU_GPIOB);
/* 配置PB12为CS引脚 */
gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_12);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
gpio_bit_set(GPIOB, GPIO_PIN_12);
/* 配置PB13、PB14、PB15为SPI引脚 */
gpio_af_set(GPIOB, GPIO_AF_5, GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);
}
void spi_config(void)
{
/* 使能SPI时钟 */
rcu_periph_clock_enable(RCU_SPI1);
/* 配置SPI参数 */
spi_parameter_struct spi_init_struct;
spi_init_struct.device_mode = SPI_MASTER;
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;
spi_init_struct.nss = SPI_NSS_SOFT;
spi_init_struct.prescale = SPI_PSC_4;
spi_init_struct.endian = SPI_ENDIAN_MSB;
spi_init_struct.clock_polaraity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
spi_init(SPI1, &spi_init_struct);
}
void spi_write_byte(uint8_t data)
{
/* 使能CS引脚,选中从设备 */
gpio_bit_reset(GPIOB, GPIO_PIN_12);
/* 等待发送缓冲区为空 */
while(spi_i2s_flag_get(SPI1, SPI_FLAG_TBE) == RESET);
/* 发送数据 */
spi_i2s_data_transmit(SPI1, data);
/* 等待接收缓冲区不为空 */
while(spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE) == RESET);
/* 读取接收数据,清除RXNE标志位 */
spi_i2s_data_receive(SPI1);
}
void spi_disable(void)
{
/* 禁用SPI外设 */
spi_disable(SPI1);
/* 禁用SPI时钟 */
rcu_periph_clock_disable(RCU_SPI1);
}
int main(void)
{
spi_gpio_init();
spi_config();
/* 发送数据 */
spi_write_byte(0x55);
spi_disable();
}
```