stm32f103若使用普通的串口接收程序,波特率设为115200,由于读取时需要占用CPU资源,所以实际速率非常慢。但如果使用DMA来处理则速度非常快,实测在波特率115200时,并且使用队列,速率可以达到10k以上。当然实际情况可能有些差别,我是用来接收上位机发来的固件,然后当从FIFO读取出的数据长度计满1024字节时,还要去写入FLASH。当然此时如果FIFO大于1024字节的话,DMA还是会继续读取从串口接收到的数据,并存储至FIFO。
1.DMA队列
/*
* File : [fifo.h]
*/
#include "stm32f10x.h"
#define RINGQ_MAX 10000 //队列大小
typedef struct
{
u32 OldLen;
u32 NewLen;
u32 TotalLen; //数据长度
u8 *BaseAddr; //缓冲区基地址
u8 *EndAddr; //缓冲区尾地址
u8 *ReadAddr; //数据读取地址
}LinkQueue;
int InitQueue (LinkQueue *Q, u8 *bufbase, u32 size);
int GetLength (LinkQueue *Q);
int EnQueue (LinkQueue *Q);
int OutQueue (LinkQueue *Q, unsigned char *buf, int len);
/*
* File : [fifo.c]
*/
#include "fifo.h"
#include "usart.h"
/*
* 初始化队列
*/
int InitQueue (LinkQueue *Q, u8 *bufbase, u32 size)
{
Q->BaseAddr = bufbase;
Q->EndAddr = bufbase + RINGQ_MAX;
Q->ReadAddr = bufbase;
Q->NewLen = 0;
Q->OldLen = 0;
Q->TotalLen = 0;
return 0;
}
/*
* 获取DMA 已传输字节数
*/
int GetLength (LinkQueue *Q)
{
Q->NewLen = RINGQ_