linux数组环形缓冲区,关于STM32数组环形缓冲区

关于STM32数组环形缓冲区NRF24L01无线接收实验

1,NRF24L01查询方式接收32个数据

2,定时器中断一次将接收到的数据输出一个数据。(也就是中断32次才能发送完NRF24L01接收到的一帧数据)

3,可以想像成NRF24L01为输入数据,定时器中断为输出数据。由于输入与输出速度不一样,所以必需加个环形数据缓冲区。

unsigned char FIFO_1[32];

unsigned char FIFO_2[32];

unsigned char FIFO_3[32];

unsigned char FIFO_4[32];

unsigned char FIFO_5[32];

unsigned char FIFO_6[32];

unsigned char FIFO_7[32];

unsigned char FIFO_8[32];

unsigned char FIFO_9[32];

unsigned char FIFO_10[32];

u8 tmp_buf[32];//NRF24接收数组

//FIFO缓冲区

void FIFO_mpt(unsigned int a,unsigned char *d)

{

switch(a)

{

case 1:          {*FOFI_1=*d;}        break;

case 2:          {*FOFI_2=*d;}        break;

case 3:          {*FOFI_3=*d;}        break;

case 4:          {*FOFI_4=*d;}        break;

case 5:          {*FOFI_5=*d;}        break;

case 6:          {*FOFI_6=*d;}        break;

case 7:          {*FOFI_7=*d;}        break;

case 8:          {*FOFI_8=*d;}        break;

case 9:          {*FOFI_9=*d;}        break;

case 10:  {*FOFI_10=*d;}break;

default:break;

}

}

/

unsigned char TIM3_dataNRF[32];

//定时器3中断服务程序

void TIM3_IRQHandler(void)

{

if(TIM3->SR&0X0001)//溢出中断

{

r++;

SPI_WR(TIM3_dataNRF[r]);

TIM3_dataNRF[r]=0;//清0

if(r>=32) r=0;

}

TIM3->SR&=~(1<<0);//清除中断标志位

}

int main(void)

{

unsigned int t=0,f=0,e=0,i=0,k=0,uuu=0,tt=0,r=0,n=0,fgt=10,G=0,OFF=1;

Stm32_Clock_Init(9);//系统时钟设置72MHZ

SPI2_Init();

TIM3_Int_Init(7,200);//

NRF24L01_Init();    //初始化NRF24L01

while(1)

{

if((r>5)&&OFF) {OFF=0;TIM3->CR1|=0x01;}//NRF24L01接收到5帧数据才开定时器

if(NRF24L01_RxPacket(tmp_buf)==0)//判断NRF24是否接收到一帧数据

// 存在FIFO缓冲区

r++;

FIFO_mpt(r,tmp_buf+1);        // 存在FIFO缓冲区

if(r>=10) {r=0;}

if(TIM3_dataNRF[1]==0)//检查定时器中的数据是否输出完了

{

//将FIFO中的数据复给中断输出

if(FOFI_1[10]) {*TIM3_dataNR=*FFOFI_1; for(i=0;i<32;i++) FFOFI_1[i]=0;}//清0

else if(FOFI_2[10]){ *TIM3_dataNR=*FFOFI_2;  for(i=0;i<32;i++) FFOFI_2[i]=0;}//清0

else if(FOFI_3[10]){ *TIM3_dataNR=*FFOFI_3;  for(i=0;i<32;i++) FFOFI_3[i]=0;}//清0

else if(FOFI_4[10]){ *TIM3_dataNR=*FFOFI_4;  for(i=0;i<32;i++) FFOFI_4[i]=0;}//清0

else if(FOFI_5[10]){ *TIM3_dataNR=*FFOFI_5;  for(i=0;i<32;i++) FFOFI_5[i]=0;}//清0

else if(FOFI_6[10]){ *TIM3_dataNR=*FFOFI_6;  for(i=0;i<32;i++) FFOFI_6[i]=0;}//清0

else if(FOFI_7[10]){ *TIM3_dataNR=*FFOFI_7;  for(i=0;i<32;i++) FFOFI_7[i]=0;}//清0

else if(FOFI_8[10]){ *TIM3_dataNR=*FFOFI_8;  for(i=0;i<32;i++) FFOFI_8[i]=0;}//清0

else if(FOFI_9[10]){ *TIM3_dataNR=*FFOFI_9;  for(i=0;i<32;i++) FFOFI_9[i]=0;}//清0

else if(FOFI_10[10]){ *TIM3_dataNR=*FFOFI_10; for(i=0;i<32;i++) FFOFI_10[i]=0;}//清0

}

if((FOFI_1[10]==0)||(FOFI_2[10]==0)||(FOFI_1[10]==0)||(FOFI_3[10]==0)||(FOFI_4[10]==0)||(FOFI_5[10]==0)||(FOFI_6[10]==0)||

(FOFI_7[10]==0)||(FOFI_8[10]==0)||(FOFI_9[10]==0)||(FOFI_10[10]==0))

{

LED=1;//LED灭         说明FIFO有数据

}

else {LED=0;}//LED亮 说明FIFO没数据

if(FOFI_1[10]&&FOFI_2[10]&&FOFI_3[10]&&FOFI_4[10]&&FOFI_5[10]&&FOFI_6[10]&&FOFI_7[10]&&FOFI_8[10]&&FOFI_9[10]&&FOFI_10[10])

{

LED_FIFO=0;//LED亮         说明FIFO滿

}

}

}

NRF24L01发送的是1到32,,接收也是1到32。但中断输出的数据却是乱的。。说明程序FIFO传递到中断里的数据不知道那里错了。。

中断里的SPI输出有时候为0,,我在NRF24接收中每个数据加1了。。什么会输出有0数据。程序那里跑乱了。

//注意定时时间与NRF24L01接收到的时间是一样的,,也就是说FIFO不可能满和空的。NRF24L01有可能丢包。但中断里的SPI输出不可能有O数值。。

程序那里跑乱了。谢谢高手指点

我来回答

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值