专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
加急,函数嵌套后程序运行不正常
2019-10-16 02:50
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
15411
13
1333
在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);
// }
}
}
}
加载中...
查看其它13个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
在主函数里调用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);
// }
}
}
}
一周热门 更多>