前言
通过本次代码的学习,搞懂USART配置,DMA配置,数据校验,数据接收,进一步巩固串口发送和接收知识,了解指针和结构体的使用。
DMA 转运基础知识补充
串口接收中断的流程
配置串口接收使用DMA的方式
初始化各个驱动
声明结构体给结构体,创建结构体数字,初始化数据包格式
typedef struct
{
uint32_t uartNo;
rcu_periph_enum rcuUart;
rcu_periph_enum rcuGpio;
uint32_t gpio;
uint32_t txPin;
uint32_t rxPin;
uint8_t irq;
uint32_t dmaNo;
rcu_periph_enum rcuDma;
dma_channel_enum dmaCh;
} UartHwInfo_t;
static UartHwInfo_t g_uartHwInfo =
{
USART0,
RCU_USART0,
RCU_GPIOA,
GPIOA,
GPIO_PIN_9,
GPIO_PIN_10,
USART0_IRQn,
DMA0,
RCU_DMA0,
DMA_CH4
};
#define USART0_DATA_ADDR (USART0 + 0x04) //串口0的数据寄存器十六进制地址值
/**
***********************************************************************
包格式:帧头0 帧头1 数据长度 功能字 LED编号 亮/灭 异或校验数据
0x55 0xAA 0x03 0x06 0x00 0x01 0xFB
***********************************************************************
*/
#define FRAME_HEAD_0 0x55
#define FRAME_HEAD_1 0xAA
#define CTRL_DATA_LEN 3 //数据域长度
#define PACKET_DATA_LEN (CTRL_DATA_LEN + 4) //包长度
#define FUNC_DATA_IDX 3 //功能字数组下标
#define LED_CTRL_CODE 0x06 //功能字
#define MAX_BUF_SIZE 20
static uint8_t g_rcvDataBuf[MAX_BUF_SIZE];
static bool g_pktRcvd = false;
typedef struct
{
uint8_t ledNo;
uint8_t ledState;
} LedCtrlInfo_t;
gpio 初始化
创建一个函数用于调用,gpio,usart,dma的初始化函数,第二个函数传递进去一个波特率为115200.
/**
***********************************************************
* @brief USB转串口硬件初始化
* @param
* @return
***********************************************************
*/
void Usb2ComDrvInit(void)
{
Usb2ComGpioInit();
Usb2ComUartInit(115200);
Usb2ComDmaInit();
}
gpio 初始化代码
这是一个静态的函数只能在函数的内部进行调用对外部时隐藏的,