使用结构体对GD32的外设进行库的打包

1.使用结构体进行参数的初始化

void uart_init(u32 bound)
{
    //GPIO端口配置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    //使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);

    //USART1_TX   GPIOA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //USART1_RX   GPIOA.10初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;      //子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

    USART_InitStructure.USART_BaudRate = bound;                     //波特率
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;     //8位字长
    USART_InitStructure.USART_StopBits = USART_StopBits_1;          //停止位
    USART_InitStructure.USART_Parity = USART_Parity_No;             //校验位
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式

    USART_Init(USART1, &USART_InitStructure);                       //初始化串口1
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                  //开启串口接收中断
    USART_Cmd(USART1, ENABLE);                                      //使能串口1
}


2.再封装一层或者叫重新封装一层

struct {
    Flag标志位
    bound
    返回工作模式(ok,busy,error)
    发送回调函数
    接收回调函数
}

举个例子

当使用transmit函数进行发送时,传入参数transmit(char *buf, int size),在transmit函数内部需要完成发送,并且需要返回一个结构体,即一个句柄,句柄里包含发送之后的状态以及发送消息的长度。

下面为一段伪代码

#include <stdio.h>

typedef struct {
    int status;  // 发送状态,0 表示成功,其他值表示错误状态
    int length;  // 发送的数据长度
} TransmitHandle;

// 假设我们有一个 UART 发送函数,实际的发送代码会依据硬件来实现
int uart_send(char *buf, int size) {
    // 在此处实际发送数据的代码,可以是通过 UART 外设发送数据的过程
    // 假设我们在这里模拟发送过程
    for (int i = 0; i < size; i++) {
        // 模拟发送一个字符 (你可以替换成具体的硬件发送代码)
        putchar(buf[i]);  
    }
    return 0;  // 0 表示成功,非零表示失败
}

// transmit 函数,发送数据并返回一个结构体
TransmitHandle transmit(char *buf, int size) {
    TransmitHandle handle;

    // 调用 uart_send 函数发送数据
    int send_status = uart_send(buf, size);

    // 根据发送状态更新句柄
    if (send_status == 0) {
        handle.status = 0; // 发送成功
    } else {
        handle.status = -1; // 发送失败
    }

    // 更新发送的字节数
    handle.length = size;

    return handle;
}

int main() {
    char message[] = "Hello, Keil!";
    int message_size = sizeof(message) - 1;  // 计算消息的长度,不包括 '\0'

    // 调用 transmit 函数发送数据
    TransmitHandle result = transmit(message, message_size);

    // 输出结果
    if (result.status == 0) {
        printf("\nMessage sent successfully! Length: %d bytes.\n", result.length);
    } else {
        printf("\nMessage sending failed! Error code: %d\n", result.status);
    }

    return 0;
}

滚动至顶部