前言:
本博客仅在应用函数指针与回调函数相关的知识,通过实践巩固所学知识,也是对相关知识点的回顾。
函数指针与回调函数:1-6 GD32函数指针与回调函数-CSDN博客
目录
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;
}