1-7 GD32函数指针应用

前言:


本博客仅在应用函数指针与回调函数相关的知识,通过实践巩固所学知识,也是对相关知识点的回顾。

函数指针与回调函数:1-6 GD32函数指针与回调函数-CSDN博客


目录

前言:

1.0 程序架构思想

2.0 构建串口结构体

3.0 结构体数组

4.0 GPIO初始化

5.0 串口初始化

6.0 中断服务函数

7.0 打印输出重定向

8.0 函数指针变量

9.0 注册回调函数

 10.0 回调函数讲解

 11.0 灯的编号与状态

12.0 判断数据完整性

13.0 CRC校验

14.0 LED处理函数

15.0 Usb2Com任务处理函数

16.0 USART应用初始化

17.0 usb2com_drv.c

18.0 usb2com_app.c

19.0 main.c

后记:


1.0 程序架构思想



2.0 构建串口结构体


typedef struct
{
    uint32_t uartNo;            // 表示串口USART0
    rcu_periph_enum rcuUart;    // 串口时钟
    rcu_periph_enum rcuGpio;    // GPIO时钟
    uint32_t gpio;              // 对应的GPIO口
    uint32_t txPin;             // 串口发送端引脚
    uint32_t rxPin;             // 串口接收端引脚
    uint32_t irq;               // 串口中断
}UartLxInfo_t;

3.0 结构体数组


static UartLxInfo_t g_uartLxInfo =                   // 结构体数组,存放结构体参数值
{
    USART0, RCU_USART0, RCU_GPIOA, GPIOA, GPIO_PIN_9, GPIO_PIN_10, USART0_IRQn
};

参数具体含义参考定义


4.0 GPIO初始化

static void Usb2ComGpioInit(void)                    // GPIO时钟初始化
{
   rcu_periph_clock_enable(g_uartLxInfo.rcuGpio);
   gpio_init(g_uartLxInfo.gpio, GPIO_MODE_AF_PP, GPIO_OSPEED_10MHZ, g_uartLxInfo.txPin);
   gpio_init(g_uartLxInfo.gpio, GPIO_MODE_IPU, GPIO_OSPEED_10MHZ, g_uartLxInfo.rxPin);
}

5.0 串口初始化


static void Usb2ComUartInit(uint32_t baudRate)
{
    rcu_periph_clock_enable(g_uartLxInfo.rcuUart);                              // 使能串口时钟
    usart_deinit(g_uartLxInfo.uartNo);                                          // 复位串口
    usart_baudrate_set(g_uartLxInfo.uartNo, baudRate);                          // 设置波特率
    usart_transmit_config(g_uartLxInfo.uartNo, USART_TRANSMIT_ENABLE);          // 使能串口发送
    usart_receive_config(g_uartLxInfo.uartNo, USART_RECEIVE_ENABLE);            // 使能串口接收
    usart_interrupt_enable(g_uartLxInfo.uartNo, USART_INT_RBNE);                // 使能串口中断
    nvic_irq_enable(g_uartLxInfo.irq, 0, 0);                                    // 中断使能
    usart_enable(g_uartLxInfo.uartNo);                                          // 串口使能
}


6.0 中断服务函数


void USART0_IRQHandler(void)
{
    if (usart_interrupt_flag_get(g_uartLxInfo.uartNo, USART_INT_FLAG_RBNE) != RESET)
    {
        usart_interrupt_flag_clear(g_uartLxInfo.uartNo, USART_INT_FLAG_RBNE);
        uint8_t uData = (uint8_t)usart_data_receive(g_uartLxInfo.uartNo);
        pPrcoUartDataFunc(uData);
    }
}

7.0 打印输出重定向

int fputc(int ch, FILE *f)
{
    usart_data_transmit(g_uartLxInfo.uartNo, (uint8_t)ch);
    while(usart_flag_get(g_uartLxInfo.uartNo, USART_FLAG_TBE) == RESET);
    return ch;
}

8.0 函数指针变量



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值