加急,函数嵌套后程序运行不正常

2019-10-16 02:50发布

在main函数里直接调用函数comm2(),运行正常;在main函数里调用comm1(),在comm1()函数再调用comm2(),就运行不正常了,如果函数comm1()里代码很长也运行不正常,请问这是什么问题?好像是堆栈问题,但是堆栈已经设置很大了,堆栈设置:Stack_Size设置成0x0000A000,Heap_Size设置成0x00000500,还是运行不正常,求原子哥和大侠们指点!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
13条回答
sqsnlg
2019-10-17 09:57

在主函数里调用MOTOR_Run(1000,MOTOR_FALL,MOTOR_Forward),运行正常。

在通信函数里调用MOTOR_Run(1000,MOTOR_FALL,MOTOR_Forward),运行就不正常,就多了一次函数嵌套就不行了

void MOTOR_Run(u16 RUN_Len,MOTOR_TypeFlag MotorType,MOTOR_DirectFlag MorotDirect)
{
        float MOTOR_RUN_PwmNum;
       
        MOTOR_TYPE_CURRENT=MotorType;                 //保存电机运行方式
        MOTOR_DIRECT_CURRENT=MorotDirect;
       
        //MOTOR_TIM8_Channel(MotorType);
        //MOTOR_TIM8_PwmInit(17999,0,8999,MotorType);  //TIM8电机PWM初始化  每秒走5mm  丝杠导程=2mm
       
        CHECK_ReadMotorPlace();               
       
        if(MotorType==MOTOR_LEVEL)
        {               
                MOTOR_RUN_PwmNum=(float)((RUN_Len/100)/0.00375);   //0.12mm/32细分=0.00375
               
                MOTOR_PWM_Num=MOTOR_RUN_PwmNum;
               
                MOTOR_RUN_PwmNum-=MOTOR_PWM_Num;
               
                if(MOTOR_RUN_PwmNum>=0.5)
                        MOTOR_PWM_Num++;
               
               
                MOTOR_TIM8_PwmInit(11249,0,5624,MotorType);  //TIM8电机PWM初始化  每秒走12mm  丝杠导程=12mm
        }
        else
        {
                MOTOR_PWM_Num=RUN_Len*8;        //本次运行总脉冲数  0.01mm对应8个PWM脉冲                       
                MOTOR_TIM8_PwmInit(17999,0,8999,MotorType);  //TIM8电机PWM初始化  每秒走5mm  丝杠导程=2mm
        }
               
        delay_ms(10);
       
        MOTOR_PWM_Count=0;                                //脉冲计数清零
               
       
        if(MorotDirect==MOTOR_Forward)        //正向
        {
                if(MotorType==MOTOR_RISE)
                        TIM5->CNT=0;
                if(MotorType==MOTOR_LEVEL)
                        TIM1->CNT=0;
                if(MotorType==MOTOR_DROP)
                        TIM4->CNT=0;
                if(MotorType==MOTOR_FALL)
                        TIM3->CNT=0;
        }
        else                                                                                                                //反向
        {
                if(MotorType==MOTOR_RISE)
                        TIM5->CNT=64000;
                if(MotorType==MOTOR_LEVEL)
                        TIM1->CNT=64000;
                if(MotorType==MOTOR_DROP)
                        TIM4->CNT=64000;
                if(MotorType==MOTOR_FALL)
                        TIM3->CNT=64000;               
        }                       
       
        MOTOR_PSC_Config();
        MOTOR_ChipEnable(MotorType,DISABLE);        //电机不使能
        MOTOR_UpDown(MotorType,MorotDirect);        //电机运行方向                       
        MOTOR_ChipEnable(MotorType,ENABLE);   //电机使能                               
        TIM_Cmd(TIM8,ENABLE);                //运行电机               
}


int main(void)
{
  u8  i;
        u16 t;
        u16 len;
        /**************************延时初始化*******************************/
        delay_init();                 
        delay_ms(3000);       
        /******************************中断优先级设置******************************/
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2                                  
        /******************************定时************************************/       
        TIMER_TIM6_Init(10000,72);  //72分频  定时10MS  
        /**********************************************************************/
        uart3_init(9600);                                                                //CCD通信
        uart4_init(9600);                                                                //采样器通信
        uart5_init(9600);                                                                //主机通信                 
        /******************************传感器初始化*****************************/       
        SENSER_Init();
        /******************************编码器************************************/       

        ENCODER_RISE_TIM5_Init();   //CLK3上升电机编码器初始化
        ENCODER_LEVEL_TIM1_Init();   //CLK1水平电机编码器初始化
        ENCODER_DROP_TIM4_Init();   //CLK2点样电机编码器初始化
  ENCODER_FALL_TIM3_Init();   //CLK4下落电机编码器初始化       
        /********************************电机***********************************/         
       
        MOTOR_Rise_ControlInit();
        MOTOR_LEVEL_ControlInit();
  MOTOR_DROP_ControlInit();
  MOTOR_FALL_ControlInit();
        MOTOR_PSC_Config();
        MOTOR_TIM8_NVIC_CHX_Init();
        MOTOR_Run(0,MOTOR_DROP,MOTOR_Forward);
        //MOTOR_TIM8_Channel(MOTOR_LEVEL);
       
        //MOTOR_TIM8_PwmInit(17999,0,8999,MOTOR_RISE);  //TIM8电机PWM初始化  每秒走5mm  丝杠导程=2mm          
       
                /*******************************自检复位**********************************************/       
        //CHECK_SelfInspect();
        /****************************自检完成后蜂鸣器响*************************************************/
        BEEP_TIM2_Init(400,72,200);   //72分频 72MHz/72=1M   2500Hz=1MHz/400                
        TIM_Cmd(TIM2,ENABLE);      //开启蜂鸣器
        delay_ms(200);
        TIM_Cmd(TIM2,DISABLE);     //关闭蜂鸣器
        delay_ms(200);
        TIM_Cmd(TIM2,ENABLE);      //开启蜂鸣器
        delay_ms(800);
        TIM_Cmd(TIM2,DISABLE);     //关闭蜂鸣器       
       
         
        while(1)         
        {                                                       
                if(USART5_RX_STA&0x8000)//主机通信
                {                       
                                COMM_UART5_MostComm();  //通信运行电机
                }
               
                if(COMM_CheckStart==0xaa)//启动检测
                {
                        COMM_CheckStart=0x00;
                        CHEAK_Start(CHECK_MODE);
                }                                                                       

                if(SENSER_RisePlace==1)                //传感器
                {                                               
                                               
                        MOTOR_Run(1000,MOTOR_FALL,MOTOR_Forward);         //电机运行 10.00mm

                        delay_ms(500);
                }
               
                delay_ms(1);                 
        }
}

void COMM_UART5_MostComm(void)
{
        u8        ReturnLen;
        u16        Run_Len;
        u32        Card_NUM;
        //u8        ReturnData[12]={0x5a,0xa5,0x00,0x00,0x00,0x35,0x53,0x00,0x00,0x00,0x35,0x53};
        u8        ReturnData_7BY[7]={0x5a,0xa5,0x81,0x11,0x11,0x35,0x53};
       
        USART5_RX_STA=0;

        if(USART5_RX_BUF[0]==0x5A&&USART5_RX_BUF[1]==0xA5)
        {
                if(USART5_RX_BUF[2]==0x51)
                {
                        if(USART5_RX_BUF[3]==0xA0&&USART5_RX_BUF[4]==0x0A) //蜂鸣器响
                        {
                                BEEP_TIME=40;                                                        //报警计时  响400Ms  定时器5定时10MS
                                TIM_Cmd(TIM2,ENABLE);     //开启蜂鸣器
                                TIM_Cmd(TIM6,ENABLE);                 //开启蜂鸣器计时                                                                               
                        }                       
                        else if(USART5_RX_BUF[3]==0xA1&&USART5_RX_BUF[4]==0x1A)//自动模式
                        {       
                                COMM_CheckStart=0xaa;
                                CHECK_MODE=MOTOR_AUTO_MODE;
                        }
                        else if(USART5_RX_BUF[3]==0xA2&&USART5_RX_BUF[4]==0x2A)//手动模式
                        {
                                COMM_CheckStart=0xaa;
                                CHECK_MODE=MOTOR_MANU_MODE;
                        }
                        else if(USART5_RX_BUF[3]==0xA3&&USART5_RX_BUF[4]==0x3A)//检测器复位
                        {                               
                                ///////////////////////////////////////////////////////////////
                                if(SENSER_LevelStart==1)
                                {
                                        MOTOR_Run(40000,MOTOR_LEVEL,MOTOR_Reversal);        //水平电机反转400mm
                                        while(SENSER_LevelStart==1);
                                        TIM_Cmd(TIM8,DISABLE);
                                        MOTOR_ChipEnable(MOTOR_LEVEL,DISABLE);         //至复位位置关闭水平电机               

                                        STMFLASH_DataTemp[STMFLASH_LevelPlace_BYTE3]=0;
                                        STMFLASH_DataTemp[STMFLASH_LevelPlace_BYTE2]=0;
                                        STMFLASH_DataTemp[STMFLASH_LevelPlace_BYTE1]=0;
                                        STMFLASH_DataTemp[STMFLASH_LevelPlace_BYTE0]=0;
                                        STMFLASH_Write(STMFLASH_FLASH_SAVE_ADDR,(u16*)STMFLASH_DataTemp,STMFLASH_DataTemp_SIZE); //  保存水平电机复位位置
                                }                               
                                /////////////////////////////////////////////////////////////////
                                if(SENSER_RisePlace==0)
                                {
                                        while(SENSER_RisePlace==0&&SENSER_RiseTop!=0) //卡没送进槽,托盘没运行到顶部
                                        {                       
                                                MOTOR_Run(800,MOTOR_RISE,MOTOR_Reversal);        //反转上升电机8mm向上推盘
                                                while((TIM8->CR1&0x0001)==1);                        //等待电机停               
                                        }                                                                                                                               
                                }
                               
                                if(SENSER_RisePlace==1)
                                {
                                        MOTOR_Run(800,MOTOR_RISE,MOTOR_Forward);        //正转上升电机8mm向下推盘
                                        while((TIM8->CR1&0x0001)==1);                        //等待电机停               
                                }                               
                                ///////////////////////////////////////////////////////////////
                                if(SENSER_FallPlace==0)
                                {
                                        while(SENSER_FallPlace==0&&SENSER_FallTop!=0) //卡没送存卡槽,托盘没运行到顶部
                                        {                       
                                                MOTOR_Run(800,MOTOR_FALL,MOTOR_Reversal);        //反转存盘电机8mm向上推盘
                                                while((TIM8->CR1&0x0001)==1);                        //等待电机停               
                                        }                                                                                                                               
                                }
                               
                                if(SENSER_FallPlace==1)
                                {
                                        MOTOR_Run(800,MOTOR_RISE,MOTOR_Forward);        //正转存盘电机8mm向下推盘
                                        while((TIM8->CR1&0x0001)==1);                        //等待电机停               
                                }                                               
                                ///////////////////////////////////////////////////////
                        }                                               
                        else if(USART5_RX_BUF[3]==0xA4&&USART5_RX_BUF[4]==0x4A)//加盘
                        {                               
                                if(SENSER_RiseBottom==1)
                                {
                                        MOTOR_Run(20000,MOTOR_RISE,MOTOR_Forward);        //推盘电机正转到复位位置               
                                        while(SENSER_RiseBottom==1);                                        //等待到达推盘电机复位传感器
                                        TIM_Cmd(TIM8,DISABLE);
                                        MOTOR_ChipEnable(MOTOR_RISE,DISABLE);                
                                       
                                        STMFLASH_DataTemp[STMFLASH_RisePlace_BYTE3]=0;
                                        STMFLASH_DataTemp[STMFLASH_RisePlace_BYTE2]=0;
                                        STMFLASH_DataTemp[STMFLASH_RisePlace_BYTE1]=0;
                                        STMFLASH_DataTemp[STMFLASH_RisePlace_BYTE0]=0;
                                        STMFLASH_Write(STMFLASH_FLASH_SAVE_ADDR,(u16*)STMFLASH_DataTemp,STMFLASH_DataTemp_SIZE); //  保存推盘电机复位位置                                                                       
                                }
                        }
                        else if(USART5_RX_BUF[3]==0xA5&&USART5_RX_BUF[4]==0x5A)//取盘
                        {                               
                                if(SENSER_FallBottom==1)
                                {
                                        MOTOR_Run(20000,MOTOR_FALL,MOTOR_Forward);        //推存盘电机正转到复位位置               
                                        while(SENSER_FallBottom==1);
                                        TIM_Cmd(TIM8,DISABLE);
                                        MOTOR_ChipEnable(MOTOR_FALL,DISABLE);         //至复位位置关闭水平电机       
                                       
                                        STMFLASH_DataTemp[STMFLASH_FallPlace_BYTE3]=0;
                                        STMFLASH_DataTemp[STMFLASH_FallPlace_BYTE2]=0;
                                        STMFLASH_DataTemp[STMFLASH_FallPlace_BYTE1]=0;
                                        STMFLASH_DataTemp[STMFLASH_FallPlace_BYTE0]=0;
                                        STMFLASH_Write(STMFLASH_FLASH_SAVE_ADDR,(u16*)STMFLASH_DataTemp,STMFLASH_DataTemp_SIZE); //  保存存盘电机复位位置                                               
                                }                               
                        }                       
                       
                        for(ReturnLen=0;ReturnLen<7;ReturnLen++)
                        {
                                USART_SendData(UART5,ReturnData_7BY[ReturnLen]);//向串口5发送数据                 
                                while(USART_GetFlagStatus(UART5,USART_FLAG_TC)!=SET);//等待发送结束
                                delay_us(10);
                        }       
                               
                }       
                else if(USART5_RX_BUF[2]==0x59)        //读取待检测盘数
                {
                        CHECK_ReadMotorPlace();
                       
                        Card_NUM=CHEAK_RiseMotorCurPlase/800;
                       
                        if(CHEAK_RiseMotorCurPlase%800>=790)
                                Card_NUM++;
                       
                        ReturnData_7BY[2]=0x89; //命令
                       
                        ReturnData_7BY[3]=Card_NUM%0x100;  //盘数
                       
                        ReturnData_7BY[4]=Card_NUM%0x100;  //盘数
                       
                        for(ReturnLen=0;ReturnLen<7;ReturnLen++)
                        {
                                USART_SendData(UART5,ReturnData_7BY[ReturnLen]);//向串口5发送数据                 
                                while(USART_GetFlagStatus(UART5,USART_FLAG_TC)!=SET);//等待发送结束
                                delay_us(10);
                        }       
                }
                else if(USART5_RX_BUF[2]==0x5B)        //读取已检测盘数
                {
                        CHECK_ReadMotorPlace();
                       
                        Card_NUM=CHEAK_FallMotorCurPlase/800;
                       
                        if(CHEAK_FallMotorCurPlase%800>=790)
                                Card_NUM++;
                       
                        ReturnData_7BY[2]=0x8B; //命令
                       
                        ReturnData_7BY[3]=Card_NUM%0x100;  //盘数
                       
                        ReturnData_7BY[4]=Card_NUM%0x100;  //盘数
                       
                        for(ReturnLen=0;ReturnLen<7;ReturnLen++)
                        {
                                USART_SendData(UART5,ReturnData_7BY[ReturnLen]);//向串口5发送数据                 
                                while(USART_GetFlagStatus(UART5,USART_FLAG_TC)!=SET);//等待发送结束
                                delay_us(10);
                        }       
                }
                else if(USART5_RX_BUF[2]==0x5C)        //读取自检结果
                {
                       
                        ReturnData_7BY[2]=0x8B; //命令
                       
                        for(ReturnLen=0;ReturnLen<3;ReturnLen++)
                        {
                                USART_SendData(UART5,ReturnData_7BY[ReturnLen]);//向串口5发送数据                 //5A A5 8B
                                while(USART_GetFlagStatus(UART5,USART_FLAG_TC)!=SET);//等待发送结束  
                                delay_us(10);
                        }
                       
                        for(ReturnLen=0;ReturnLen<16;ReturnLen++)
                        {
                                USART_SendData(UART5,CHECK_SelfInspectData[ReturnLen]);//向串口5发送数据                 //自检16个字节数据
                                while(USART_GetFlagStatus(UART5,USART_FLAG_TC)!=SET);//等待发送结束
                                delay_us(10);
                        }
                       
                        for(ReturnLen=5;ReturnLen<7;ReturnLen++)
                        {
                                USART_SendData(UART5,ReturnData_7BY[ReturnLen]);//向串口5发送数据                 //0D 0A
                                while(USART_GetFlagStatus(UART5,USART_FLAG_TC)!=SET);//等待发送结束
                                delay_us(10);
                        }               
                }
                else if(USART5_RX_BUF[2]==0x5D)        //电机运行
                {
                        MOTOR_Run(1000,MOTOR_FALL,MOTOR_Forward);         //电机运行 10.00mm
                       
//                        Run_Len=USART5_RX_BUF[5]*256+USART5_RX_BUF[6];
//                        MOTOR_Run(Run_Len,(MOTOR_TypeFlag)USART5_RX_BUF[3],(MOTOR_DirectFlag)USART5_RX_BUF[4]);
//                       
//                        for(ReturnLen=0;ReturnLen<7;ReturnLen++)
//                        {
//                                USART_SendData(UART5,ReturnData_7BY[ReturnLen]);//向串口5发送数据                 
//                                while(USART_GetFlagStatus(UART5,USART_FLAG_TC)!=SET);//等待发送结束
//                                delay_us(10);
//                        }       

                }
        }                       
}               

一周热门 更多>