smile雷少 发表于 2016-5-15 14:04:55

我在主程序中调用了一段 DMA发送程序 ,然后就出问题了

我把程序 贴上了各位大神帮我看看怎么回事   现在的问题是dma无法正常发送,我没调用send函数时,led能正常显示 一旦调用了led都无法正确显示

#include "misc.h"
#include "stdio.h"
#include "math.h"
#include "stm32l1xx_adc.h"
#include "stm32l1xx_lcd.h"
#include "stm32l1xx_rcc.h"
#include "stm32l1xx_rtc.h"
#include "stm32l1xx_exti.h"
#include "stm32l1xx_pwr.h"
#include "stm32l1xx_syscfg.h"
#include "stm32l1xx_dbgmcu.h"
#include "stm32_tsl_api.h"
#include "stm32l15x_tsl_ct_acquisition.h"
#include "led.h"
#include "ClockConfig.h"
#include "IIC_Communication.h"
#include "afe4400.h"
#include "coef_filter.h"
#include "Usart.h"
#define N 50
#define sample_rate 250
#define Divided_Fre 2
#define High_pass_Orders 667
#define Low_pass_Orders 128
unsigned char Disp_Flag,readDataFlag;
int send(void);
long AFE44xx_SPO2_Data_buf,test,coef_IR,coef_Red,coef_low_IR,coef_low_Red;
float XRed,YIRed;
//uint32_t ;
//void delay_ms(uint32_t ms);
//******main*******//
int main(void)
{       
                        unsigned char i,k,Tmax,x,z,Win_Num,Str_Voltage={0},spo2_value={0};
      //unsigned int Fs;
                        unsigned int Freq_Dvider4;
      int T_data;
                        float Ynt=0.0,Ynt_Red,Fs,Lmax,Lmax_pre,Lmax_bac,Ynt_Disp,XRed_Sum,YIRed_Sum,XRed_Avg,YRed_Avg,R;//XRed,YIRed;
      double Lxy,Lxx,Lyy;
                        uint32_t j,T_pre,T_bac=1;
      uint16_t n;
      n=0;readDataFlag=0;
      Freq_Dvider4=1;
      x=0;k=0;z=0;
                        ClockConfig();
                        Led_Init();                          //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
                        I2C_Configuration();
                        OLED_Init();                       
                        OLED_CLS();//ÇåÆÁ
                        AFE44xx_PowerOn_Init();       
                        for(i=0;i<5;i++)
                        {
                        OLED_ShowCN_12x12(2+i*12,0,i);//??????
                        }
                        for(i=5;i<10;i++)
                        {
                        OLED_ShowCN_12x12(2+(i-5)*12,2,i);//??????
                        }       
                        while(1)
                        {                       
                                if(readDataFlag)
                       {
                                readDataFlag = 0;
                                AFE44xx_SPO2_Data_buf = AFE44xx_Reg_Read(0x2A);//read RED data
                                AFE44xx_SPO2_Data_buf = AFE44xx_Reg_Read(43);//read Ambient data
                                AFE44xx_SPO2_Data_buf = AFE44xx_Reg_Read(44);//read IR Data
                                AFE44xx_SPO2_Data_buf = AFE44xx_Reg_Read(45);//read Ambient Data
                                AFE44xx_SPO2_Data_buf = AFE44xx_Reg_Read(0x2E);//read RED - Ambient Data
                                AFE44xx_SPO2_Data_buf = AFE44xx_Reg_Read(47);//read IR - Ambient Data3       
        /**************************************high pass filter*****************************************/                                                               
                                coef_IR=AFE44xx_SPO2_Data_buf;
                                coef_Red=AFE44xx_SPO2_Data_buf;
                                for(j=0;j<High_pass_Orders;j++)
                               {
                                Ynt=Ynt+B*coef_IR;//IR
                                Ynt_Red=Ynt_Red+B*coef_Red;//Red
                               }
                                // AFE44xx_SPO2_Data_buf=Ynt;
                               for(j=0;j<High_pass_Orders-1;j++)
                               {
                               coef_IR=coef_IR;//IR High_pass_Orders-1=933-1
                               coef_Red=coef_Red;//Red
                               }
                                // Ynt_Disp=Ynt_Red+3000;
                               //Ynt_Disp=Ynt+200;
                               //Ynt_Disp=AFE44xx_SPO2_Data_buf;
                               Ynt_Disp=Ynt+3000;
                /**************************************low pass filter*****************************************/                                                       
                                        coef_low_IR=(long)Ynt;
                                  coef_low_Red=(long)Ynt_Red;
                                        for(j=0;j<Low_pass_Orders;j++)
                               {
                                        Ynt=Ynt+coef_low_IR*B_low;//IR
                                        Ynt_Red=Ynt_Red+coef_low_Red*B_low; //Red
                               }
                                        for(j=0;j<Low_pass_Orders-1;j++)       
         {                               
                                        coef_low_IR=coef_low_IR;       
                                        coef_low_Red=coef_low_Red;               
                                       }
                                       
//                                  Ynt=Ynt-3000;
//                                  Ynt_Red=Ynt_Red-3000;
        /**************************************compute Heart rate*****************************************/                                                                                       
                               if(k<N)
                               {       
                                       k++;
                                       if(Lmax<Ynt){Lmax=Ynt;Tmax=k;}//get the max value
                               }
                               else
                               {
                                       Win_Num++;
                                       if(Tmax>4&&Tmax<N-4)//¶Ô·åÖµ»®¶¨Çø¼ä
                                       {
            z++;
                                               if(z==1)
                                               { T_pre=Win_Num*N-N+Tmax;Lmax_pre=Lmax;}
                                               else if(z==2)
                                               { Lmax_bac=Lmax;
                                                        T_bac=Win_Num*N-N+Tmax;
                                                        T_data=T_bac-T_pre;
                                               if(T_data>125)
                                               {
                                                       z=0;
                                                       Win_Num=0;
                                                       if(fabs(Lmax_pre-Lmax_bac)<150)
                                                       {
                                                        Fs=((250.0/(T_bac-T_pre))*60.0);
          //******************ÏÔʾÐÄÂÊ**************/       
                                Hex_to_dex_to_string((uint16_t)Fs,Str_Voltage,2);                       
                                OLED_ShowStr(60,2,Str_Voltage,3);                                //²âÊÔ6*12×Ö·û       
                                                       }
                                               }
                                               else z=1;
             }
            }
          k=0;
                                        Lmax=0;       
         }
////********************************************computer the spo2%***************************************************/       
//                       


                               if(n<sample_rate)
                               {
                                       XRed=Ynt;
                                       YIRed=Ynt_Red;       
            n++;                                       
          XRed_Sum+=Ynt;
                                        YIRed_Sum+= Ynt_Red;
         }
                               else
                               {


                                n=0;
                                XRed_Avg=XRed_Sum/sample_rate*1.0;
                                YRed_Avg=YIRed_Sum/sample_rate*1.0;
                                for(j=0;j<sample_rate;j++)//
      {                                       
                                Lxy=(XRed-XRed_Avg)*(YIRed-YRed_Avg)*1.0+Lxy;
                                Lxx=(XRed-XRed_Avg)*(XRed-XRed_Avg)*1.0+Lxx;
                                Lyy=(YIRed-YRed_Avg)*(YIRed-YRed_Avg)*1.0+Lyy;                                       
      }
                                R=Lxy/sqrt(Lxx*Lyy)*100.0;
                                 send();//我在此处调用
   //**************ÏÔʾѪÑõÖµ%************/                                       
                                Hex_to_dex_to_string((uint16_t)R,spo2_value,5);
                                OLED_ShowStr(60,0,spo2_value,3);
                                Lxy=0.0;
                                Lxx=0.0;
                                Lyy=0.0;
                               XRed_Sum=0;
                               YIRed_Sum=0;                               
                                }
//                        if(n<sample_rate)
//                                {
//                                      XRed=Ynt;
//                                       YIRed=Ynt_Red;               
//                                }
//         else
//                               {
//                                       for(j=0;j<sample_rate;j++)
//                                       {
//      XRed_Sum=XRed+XRed_Sum;
//      YIRed_Sum=YIRed+YIRed_Sum;
//                                       }
//                                       n=0;
//                                XRed_Avg=XRed_Sum/sample_rate;
//                                YRed_Avg=YIRed_Sum/sample_rate;
//                                for(j=0;j<sample_rate;j++)//
//      {                                       
//                                Lxy=(XRed-XRed_Avg)*(YIRed-YRed_Avg)+Lxy;
//                                Lxx=(XRed-XRed_Avg)*(XRed-XRed_Avg)+Lxx;
//                                Lyy=(YIRed-YRed_Avg)*(YIRed-YRed_Avg)+Lyy;
//      }
//                                R=Lxy/sqrt(Lxx*Lyy)*100;
//      //**************ÏÔʾѪÑõÖµ%************/                                       
//                                Hex_to_dex_to_string((uint16_t)R,spo2_value,5);
//                                OLED_ShowStr(60,0,spo2_value,3);
//                               XRed_Sum=0;
//                               YIRed_Sum=0;                                       
//      }
                               
//*****************************PPG wave display***************************************************/                               
                               
                                if((Freq_Dvider4++)%Divided_Fre==0)
                                {
                                        Freq_Dvider4=1;
                                        if(Disp_Flag==1){OLED_SetPos_x(x);Disp_Flag=0;}


                                OLED_Disp(x++,Ynt_Disp);
                                if(x==128)
                                {
                                x=0;
                                OLED_CLS_Wave();
                                }
                                }
                               
                               Ynt_Red=0;
                               Ynt=0;
                       }
}
}
void EXTI0_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line0) != RESET)
        {
                        readDataFlag = 1;   
                        test++;               
                        if((test)%500==250)
                        GPIO_ResetBits(GPIOB,GPIO_Pin_12);
                        if((test)%500==0)
                        GPIO_SetBits(GPIOB,GPIO_Pin_12);
                        EXTI_ClearITPendingBit(EXTI_Line0);
        }
}


//************DMA通信*****************//
int send(void)
{
        float SendBuff;               //ÉèÖ÷¢ËÍ»º³åÇø
        float Fs=0.0, R=0.0;
        RS232_Init(9600);                //³õʼ»¯RS232
        MYDMA_Config(DMA1_Channel7,(uint32_t)&USART2->DR,(uint32_t)SendBuff,8);
        DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);
        AFE44xx_PowerOn_Init();       
        while(1)
        {       
                        SendBuff=Fs;
                        SendBuff=R;
                        USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);                      
                        MYDMA_Enable(DMA1_Channel7);                               


                       
                        while(DMA_GetITStatus(DMA1_FLAG_TC7)==RESET)
                        {


                        }
                        DMA_ClearITPendingBit(DMA1_FLAG_TC7);
               
        }
}



z258121131 发表于 2016-5-16 09:05:03

会不会引脚重复啦

zjg_lizhen 发表于 2016-5-16 09:18:46

同感

风子 发表于 2016-5-16 09:25:42

者主函数写的真是,,完全不想看

xueshawu1 发表于 2016-5-16 09:40:49

!!!!!!!!!!!!!!!

wtliu 发表于 2016-5-16 10:20:46

查查寄存器,变量或管脚的定义有没有重复的。

power568 发表于 2016-5-16 11:17:13

1. 你的Send函数中有个while(1),调用该函数后程序在此循环了循环执行,不会跳出函数,后面调用的显示函数肯定也不会执行...
2. 很久没有见过这么长的函数了,特别是主函数,建议你将程序分模块吧,看起来更清晰易懂...

荣丰宇 发表于 2016-5-16 11:18:53

完全看不懂程序要做什么啊~~~
还有 send里面while(1)是什么

ahuaahua 发表于 2016-5-16 12:04:39

1、按照你贴出来的代码,在send()里面的死循环是跳不出来的。
2、为什么要在send()里面初始化RS232_Init(9600)?,是引脚重复使用吗?引脚定义不清楚
3、调试一下,看看PC停在哪里就知道了。

欣辰天下 发表于 2016-5-16 15:35:35

调用send函数里面有个无限循环啊,当然不会正常了。
页: [1] 2
查看完整版本: 我在主程序中调用了一段 DMA发送程序 ,然后就出问题了