.h文件
#ifndef __STRUCT_H
#define __STRUCT_H
#include "stm32f10x.h" // Device header
#define SIZE 12 //数组长度
typedef struct
{
uint16_t addr_wr; /* 写地址 */
uint16_t addr_rd; /* 读地址 */
uint16_t length; /* 数组长度*/
uint8_t fifo[SIZE];//循环数组
}fifo;
extern fifo fifo_Test;//定义后声明,可作为全局变量
void reset_Fifo();//结构体重置,读地址,写地址,数组全部置零
void write_Fifo(uint8_t *write_arr,uint16_t *write_Arr_Length,uint8_t *fifo,uint16_t *length,uint16_t *addr_wr,uint16_t *addr_rd);//向循环数组写数据
void read_Fifo(uint8_t *read_arr,uint16_t *read_Arr_Length,uint8_t *fifo,uint16_t *length,uint16_t *addr_wr,uint16_t *addr_rd);//读循环数组数据
#endif
.c文件
#include "STRUCT.H"
#include "main.h"
fifo fifo_Test;
void reset_Fifo()
{
fifo_Test.addr_rd = 0;//读地址置零
fifo_Test.addr_wr = 0;//写地址置零
fifo_Test.length = SIZE;//循环数组长度设置
for(int i = 0;i<SIZE;i++)//数组所有元素置零
{
fifo_Test.fifo[i] = 0;
}
}
void write_Fifo(uint8_t *write_arr,uint16_t *write_Arr_Length,uint8_t *fifo,uint16_t *length,uint16_t *addr_wr,uint16_t *addr_rd)//向循环数组写数据,其中write_arr为内容数组,write_Arr_Length为内容数组元素数,循环数组,循环数组长度,写地址,读地址
{
for(int i=0;i<(*write_Arr_Length);i++)
{
if(((*addr_wr+1)%(*length)) != *addr_rd)//写地址的下一位不等于读地址,表明数组不是满的,可以继续写
{
fifo[*addr_wr] = write_arr[i];
*addr_wr = ((*addr_wr+1)%(*length));//写地址+1,若写地址到循环数组长度了,就重新从1开始,但是不能超过读地址
}
}
}
void read_Fifo(uint8_t *read_arr,uint16_t *read_Arr_Length,uint8_t *fifo,uint16_t *length,uint16_t *addr_wr,uint16_t *addr_rd)
{
for(int i=0;i<(*read_Arr_Length);i++)
{
if((*addr_rd) != *addr_wr)//读地址不等于写地址,表明数组不是空的,可以读元素数据
{
read_arr[i] = fifo[*addr_rd];
*addr_rd = ((*addr_rd+1)%(*length));//读地址+1,
}
}
}
main.c文件
#include "stm32f10x.h" // Device header
#include "main.h"
#include "STRUCT.H"
uint8_t test_arr[10]={1,2,3,4,5,6,7,8,9,10};
uint16_t test_len = 10;
uint8_t test_arr_1[3]={8,9,10};
uint16_t test_len_1 = 3;
int main(void)
{
reset_Fifo();//重置结构体
write_Fifo(test_arr,&test_len,fifo_Test.fifo,&fifo_Test.length,&fifo_Test.addr_wr,&fifo_Test.addr_rd);//将test_arr10个元素写入循环数组中
read_Fifo(test_arr_1,&test_len_1,fifo_Test.fifo,&fifo_Test.length,&fifo_Test.addr_wr,&fifo_Test.addr_rd);//读取循环数组前三个元素,储存在test_arr_1
read_Fifo(test_arr_1,&test_len_1,fifo_Test.fifo,&fifo_Test.length,&fifo_Test.addr_wr,&fifo_Test.addr_rd);//再按顺序读取循环数组三个元素,储存在test_arr_1
while (1)
{
}
}
每行都注释了,大家看注释