Skip to content

dragonflyor/STM32-NC

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

STM32-NC

STM32 NC

###1.数据协议

#####1.1 接收到数据头 >>01+文件名字符串:文件开始传输,保存在默认 ">>01+filename"->收文件 >>02+文件名字符串:文件开始传输,传输完成后就执行 ">>02+filename"->收文件->执行文件 $$01:文件传输结束

#####1.2 发送给上位机的协议码:

>>10#X#Y#Z:信息头为>>10,坐标信息用#号隔开
>>11+当前行G代码:发送当前行G代码

//串口发送实时坐标数据
//协议码:>>10#X#Y#Z#T#F#S
//数据包以#号隔开

void printfPosition(int x,int y,int z,int t,int f,int s)
{
		char * msg = (char *)malloc(40);
		mymemset(msg,0,strlen(msg));
		sprintf(msg,">>10#%d#%d#%d#%d#%d#%d",x,y,z,t,f,s);
		//printf("position:%s \r\n",msg);
	
		printf("%s \r\n",msg);
		delay_ms(10);
		free(msg);
}

###2.串口状态条尾部状态信号

//状态条尾部蓝绿色闪烁:表示系统串口任务正在接收数据
LCD_Fill(lcddev.width-19,lcddev.height-39,lcddev.width,lcddev.height-21,lcd_discolor[10-rec_count%2]); //填充状态信号

//状态条尾部灰,橙色闪烁表示系统串口任务正在轮询工作
LCD_Fill(lcddev.width-19,lcddev.height-39,lcddev.width,lcddev.height-21,lcd_discolor[13-com_num%2]); //填充状态信号

###3.超时后,文件接受终止 本次接收的文件将丢弃 不会保存在本地

void m_creatFile(char * pathname ,int timeout,u16 cycletime)
{
	……
	while(1)
	{
		……
		//超时退出
		if(t == timeout){
			printf("文件接收超时 \r\n");
			return;
		}
		//串口轮询时间与等于200ms
		delay_ms(cycletime);		 			   
		LED0=!LED0;
	} 
}

###4.ucosIII中任务的删除 while(1) { task1_num++; //任务执1行次数加1 注意task1_num1加到255的时候会清零!! LED0= ~LED0; printf("任务1已经执行:%d次\r\n",task1_num); if(task1_num==5) { OSTaskDel((OS_TCB*)&Task2_TaskTCB,&err); //任务1执行5此后删除掉任务2 printf("任务1删除了任务2!\r\n"); } LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充区域 LCD_ShowxNum(86,111,task1_num,3,16,0x80); //显示任务执行次数 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s

}

###4.ucosIII中任务的挂起和恢复 while(1) { task1_num++; //任务1执行次数加1 注意task1_num1加到255的时候会清零!! LED0= ~LED0; printf("任务1已经执行:%d次\r\n",task1_num); if(task1_num==5) { OSTaskSuspend((OS_TCB*)&Task2_TaskTCB,&err);//任务1执行5次后挂起任务2 printf("任务1挂起了任务2!\r\n"); } if(task1_num==10) { OSTaskResume((OS_TCB*)&Task2_TaskTCB,&err); //任务1运行10次后恢复任务2 printf("任务1恢复了任务2!\r\n"); } LCD_Fill(6,131,114,313,lcd_discolor[task1_num%14]); //填充区域 LCD_ShowxNum(86,111,task1_num,3,16,0x80); //显示任务执行次数 OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s

}

5.进不了系统

在NCSupport.c中加

_ttywrch(int ch)
{
ch = ch;
}

use mcroLIb程序就无法进入ucos系统,mcrolib是不在操作系统下运行的库

解决的代码如下: 
//不使用半主机模式
#if 1 //如果没有这段,则需要在target选项中选择使用USE microLIB
#pragma import(__use_no_semihosting)    //注释本行, 方法1
struct __FILE {
int handle;
};
FILE __stdout;

_sys_exit(int x)
{
x = x;
}

//__use_no_semihosting was requested, but _ttywrch was referenced, 增加如下函数, 方法2
_ttywrch(int ch)
{
ch = ch;
}
#endif

####6.系统软件复位 #####6.1 F103 http://blog.csdn.net/huangtonggao/article/details/6446208

1)采用官方自带的软件库
 
  在官方软件库的stm32f10x_nvic.c 文件里 直接提供了 系统复位的函数
 
所以要系统复位 只要 调用这两个函数就OK了
NVIC_SETFAULTMASK();
GenerateSystemReset();

#####6.1 F407 软件复位 执行如下代码

#define AIRCR_VECTKEY_MASK    ((uint32_t)0x05FA0000)
#define SYSRESETREQ_MASK (2<<1)
SCB->AIRCR = AIRCR_VECTKEY_MASK | SYSRESETREQ_MASK;