HC32L190 串口驱动
一、HC串口0 驱动
字节中断接收数据
!!!没有无校验的方式!!!
!!!串口工具不要勾选发送新行,接收数据会覆盖原有数据!!!
二、代码实现
hd_uart0.c
#include "hd_uart0.h"
#include "hd_gpio.h"
#include <stdio.h>extern uint8_t u8RxBuf[10];
extern uint8_t Rx_flag;
extern uint8_t inx;/*
普通模式下使用偶校验,波特率115200。
字节中断接收数据
!!!没有无校验的方式!!!
!!!串口工具不要勾选发送新行,接收数据会覆盖原有数据!!!
*/// 串口0中断处理函数
void Uart0_IRQHandler(void)
{if (Uart_GetStatus(M0P_UART0, UartRC)) {Uart_ClrStatus(M0P_UART0, UartRC);uint8_t data = Uart_ReceiveData(M0P_UART0);if (inx < 10) {u8RxBuf[inx++] = data; // 存入数据并递增索引}// 当接收满10字节后触发标志if (inx == 10) {Rx_flag = 1; // 通知主任务inx = 0; // 重置索引}}
}en_result_t Hd_uart0_init(void)//串口0初始化函数
{en_result_t Res;stc_uart_cfg_t stcCfg;stc_gpio_cfg_t stcGpioCfg;DDL_ZERO_STRUCT(stcCfg);DDL_ZERO_STRUCT(stcGpioCfg);Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0, TRUE);// TX 配置stcGpioCfg.enDir = GpioDirOut;Gpio_Init(UART0_TX_PORT, UART0_TX_PIN, &stcGpioCfg);Gpio_SetAfMode(UART0_TX_PORT, UART0_TX_PIN, UART0_TX_AF);// RX 配置stcGpioCfg.enDir = GpioDirIn;Gpio_Init(UART0_RX_PORT, UART0_RX_PIN, &stcGpioCfg);Gpio_SetAfMode(UART0_RX_PORT, UART0_RX_PIN, UART0_RX_AF);// UART 配置stcCfg.enRunMode = UartMskMode3;stcCfg.enStopBit = UartMsk1bit;stcCfg.enMmdorCk = UartMskEven;//普通模式使用偶校验stcCfg.stcBaud.u32Baud = BAUDRATE;stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div;stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq();Res = Uart_Init(M0P_UART0, &stcCfg);if (Res != Ok) {return Res;}///<UART中断使能Uart_ClrStatus(M0P_UART0,UartRC); ///<清接收请求Uart_EnableIrq(M0P_UART0,UartRxIrq); ///<使能串口接收中断EnableNvic(UART0_IRQ, IrqLevel3, TRUE); ///<系统中断使能return Ok;
}void Hd_uart0_send_byte(uint8_t data)//字节发送函数
{M0P_UART0->SBUF = data;while (Uart_GetStatus(M0P_UART0, UartTC) == FALSE);Uart_ClrStatus(M0P_UART0, UartTC);
}void Hd_uart0_send_string(const char* str)//字符串发送函数
{while (*str){Hd_uart0_send_byte((uint8_t)(*str));str++;}
}
hd_uart0.h
#ifndef HD_UART0_H
#define HD_UART0_H#include "ddl.h"
#include "uart.h"
#include "gpio.h"#define UART0_RX_PORT GpioPortA
#define UART0_RX_PIN GpioPin10
#define UART0_RX_AF GpioAf1#define UART0_TX_PORT GpioPortA
#define UART0_TX_PIN GpioPin9
#define UART0_TX_AF GpioAf1#define UART0_UNIT M0P_UART0
#define UART0_CLK_EN SysctrlPeripheralUart0
#define UART0_IRQ UART0_2_IRQn#define BAUDRATE 115200en_result_t Hd_uart0_init(void); //初始化函数
void Hd_uart0_send_byte(uint8_t data); //发送字节函数
void Hd_uart0_send_string(const char* str); //发送字符串函数#endif
task
/*********************** 串口任务框架 ************************/
static void vUartTask(void *pvParameters)
{Hd_uart0_init(); //串口初始化printf("\nSystem start...");while (1){if (Rx_flag) {Rx_flag = 0;printf("\n");// 打印完整10字节for (uint8_t i = 0; i < 10; i++) {printf("%c", u8RxBuf[i]); // }memset(u8RxBuf, 0, 10); // 清空缓冲区inx = 0; // 重置索引}vTaskDelay(pdMS_TO_TICKS(10)); // 适当增加延时减少竞争风险}
}
三、实现效果