关于STM32数组环形缓冲区

2019-07-20 21:04发布

关于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数值。。


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




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。