# GR3六轴机械臂最终增补:OLED裸屏驱动 + 掉电断点续跑 全套源码

张开发
2026/6/5 19:53:39 15 分钟阅读

分享文章

# GR3六轴机械臂最终增补:OLED裸屏驱动 + 掉电断点续跑 全套源码
GR3六轴机械臂最终增补OLED裸屏驱动 掉电断点续跑 全套源码全工程收尾新增oled_drv.c屏幕驱动、breakpoint_save.c断点续存模块寄存器直写无任何第三方库适配现有裸机调度、FATFS、MODBUS、TCP全链路。一、UserParam.h 追加OLED、断点配置//OLED屏幕配置 I2C#defineOLED_ADDR0x78U#defineOLED_WIDTH128U#defineOLED_HEIGHT64U#defineOLED_I2C_BASE0x40005400U//断点存储配置#defineBP_SAVE_ADDR0x0807A000U//断点独立Flash扇区#defineBP_VALID_FLAG0x55AA55AAUL//有效标记typedefstruct{uint8_trun_flag;uint16_tfifo_ptr;ArmRawData arm_pos;uint8_tfault_code;}BreakPointDef;externBreakPointDef g_bp_data;二、arm_reg.h补充I2C寄存器、全局声明//I2C寄存器#defineI2C_CR1(OLED_I2C_BASE0x00)#defineI2C_DR(OLED_I2C_BASE0x04)#defineI2C_SR1(OLED_I2C_BASE0x14)externBreakPointDef g_bp_data;三、新增 oled_drv.c 12864 OLED I2C裸驱动#includearm_reg.h#includestring.hstaticvoidI2C_WaitBusy(void){while((*(volatileuint32_t*)I2C_SR1)(11));}staticvoidOLED_WriteCmd(uint8_tcmd){I2C_WaitBusy();*(volatileuint32_t*)I2C_DROLED_ADDR;I2C_WaitBusy();*(volatileuint32_t*)I2C_DR0x00;I2C_WaitBusy();*(volatileuint32_t*)I2C_DRcmd;}staticvoidOLED_WriteData(uint8_tdat){I2C_WaitBusy();*(volatileuint32_t*)I2C_DROLED_ADDR;I2C_WaitBusy();*(volatileuint32_t*)I2C_DR0x40;I2C_WaitBusy();*(volatileuint32_t*)I2C_DRdat;}voidOLED_Init(void){//OLED初始化序列OLED_WriteCmd(0xAE);OLED_WriteCmd(0xD5);OLED_WriteCmd(0x80);OLED_WriteCmd(0xA8);OLED_WriteCmd(0x3F);OLED_WriteCmd(0xD3);OLED_WriteCmd(0x00);OLED_WriteCmd(0x40);OLED_WriteCmd(0xA1);OLED_WriteCmd(0xC8);OLED_WriteCmd(0xDA);OLED_WriteCmd(0x12);OLED_WriteCmd(0x81);OLED_WriteCmd(0xCF);OLED_WriteCmd(0xD9);OLED_WriteCmd(0xF1);OLED_WriteCmd(0xDB);OLED_WriteCmd(0x40);OLED_WriteCmd(0xA4);OLED_WriteCmd(0xA6);OLED_WriteCmd(0xAF);}//屏幕清屏voidOLED_Clear(void){for(uint8_tpage0;page8;page){OLED_WriteCmd(0xB0page);OLED_WriteCmd(0x00);OLED_WriteCmd(0x10);for(uint8_ti0;i128;i)OLED_WriteData(0x00);}}//实时刷新整机状态各轴角度、故障码voidOLED_RefreshInfo(ArmRawData*arm,uint8_tfault){OLED_Clear();charbuf[32];//行1故障码OLED_WriteCmd(0xB0);OLED_WriteCmd(0x00);OLED0x00);OLED_WriteCmd(0x10);sprintf(buf,FAULT:0x%02X,fault);for(inti0;buf[i]!\0;i)OLED_WriteData(buf[i]);//行2 J1J2OLED_WriteCmd(0xB1);OLED_WriteCmd(0x00);OLED_WriteCmd(0x10);sprintf(buf,J1:%4.2f J2:%4.2f,arm-j1_ang,arm-j2_ang);for(inti0;buf[i]!\0;i)OLED_WriteData(buf[i]);//行3 J3J4OLED_WriteCmd(0xB2);OLED_WriteCmd(0x00);OLED_WriteCmd(0x10);sprintf(buf,J3:%4.2f J4:%4.2f,arm-j3_ang,arm-j4_ang);for(inti0;buf[i]!\0;i)OLED_WriteData(buf[i]);//行4 J5J6OLED_WriteCmd(0xB3);OLED_WriteCmd(0x00);OLED_WriteCmd(0x10);sprintf(buf,J5:%4.2f J6:%4.2f,arm-j5_ang,arm-j6_ang);for(inti0;buf[i]!\0;i)OLED_WriteData(buf[i]);}四、新增 breakpoint_save.c 掉电断点续跑存储#includearm_reg.hBreakPointDef g_bp_data;//保存当前运行断点至FlashvoidBP_SaveNow(void){//擦除断点扇区*(volatileuint32_t*)0x400230040x02;while((*(volatileuint32_t*)0x40023000)1);uint32_t*dst(uint32_t*)BP_SAVE_ADDR;g_bp_data.fault_code*(volatileuint8_t*)FAULT_REG_ADDR;//写入校验头*dstBP_VALID_FLAG;uint32_t*src(uint32_t*)g_bp_data;for(uint8_ti0;isizeof(BreakPointDef)/4;i)*dst*src;}//上电加载断点有效则恢复现场uint8_tBP_LoadRestore(void){BreakPointDef*src(BreakPointDef*)BP_SAVE_ADDR;if(*(volatileuint32_t*)BP_SAVE_ADDR!BP_VALID_FLAG)return0;g_bp_data*src;return1;}//断点恢复FIFO指针、机械臂位置voidBP_RestoreRun(ArmRawData*arm){if(BP_LoadRestore()){*armg_bp_data.arm_pos;g_fifo_rptrg_bp_data.fifo_ptr;if(g_bp_data.run_flag1){RunAllFifoTraj(arm);}}}五、task任务补充屏幕刷新任务定时自动存断点//新增屏幕刷新任务voidOledDispTask(void){OLED_RefreshInfo(g_arm_data,*(volatileuint8_t*)FAULT_REG_ADDR);}//定时自动保存断点任务200ms存一次voidBreakPointSaveTask(void){BP_SaveNow();}//main注册新增两个任务OS_AddTask(OledDispTask,50,TASK_PRI_LOW);OS_AddTask(BreakPointSaveTask,200,TASK_PRI_LOW);六、tcp_raw新增断点手动保存/恢复指令//新增指令0x11手动存断点0x12手动恢复断点case0x11:BP_SaveNow();break;case0x12:BP_RestoreRun(g_arm_data);break;七、上位Python新增断点指令defSaveBreakPoint():bufbytes([0xAA,0xBB,0x11])bytes([0]*9)bytes([0xCC,0xDD])s.send(buf)defRestoreBreakPoint():bufbytes([0xAA,0xBB,0x12])bytes([0]*9)bytes([0xCC,0xDD])s.send(buf)八、main上电初始化加入断点自动恢复intmain(void){AxisHardLimitLock();Delay_ms(BOOT_DELAY_MS);LoadParamFromFlash();PID_LoadFromSysParam();OLED_Init();//上电自动恢复断点BP_RestoreRun(g_arm_data);if(!BP_LoadRestore())AllArmHome();OS_Init();//原有任务新增屏幕、断点任务注册OS_AddTask(FaultCheckTask,5,TASK_PRI_HIGH);OS_AddTask(MotionTask,10,TASK_PRI_MID);OS_AddTask(ADCTask,20,TASK_PRI_MID);OS_AddTask(ModbusTask,1,TASK_PRI_LOW);OS_AddTask(TeachTask,100,TASK_PRI_LOW);OS_AddTask(OledDispTask,50,TASK_PRI_LOW);OS_AddTask(BreakPointSaveTask,200,TASK_PRI_LOW);while(1)OS_RunSchedule();}✅ GR3六轴机械臂整套裸机工程【全功能完结清单】1.硬件底层驱动层6轴伺服脉冲方向寄存器直写、扭矩/ADC电流/电压/温度采样RS485 MODBUS-RTU总线读写PID、电流校准参数I2C OLED12864屏幕驱动、夹爪IO、原点光电传感器硬件限位IO软件角度双重限位安全锁、急停低电平保护2.运动控制算法层DH全参数六轴正逆运动学解算S型五段加减速、直线插补、三点空间圆弧插补硬件FIFO 64点位轨迹缓存连续自动运行3.示教存储层电流检测拖拽示教手掰自动打点示教轨迹Flash断电保存、上电回放200ms自动断点存Flash意外掉电上电断点续跑FAT16/FAT32 U盘读取轨迹文件批量导入FIFO4.通讯系统层以太网TCP自定义帧协议寄存器读写/点位下发/圆弧/示教/限位/U盘/断点全指令MODBUS-RTU现场总线调试参数5.系统调度层纯裸机1ms SysTick优先级分时调度无RTOS任务分离故障/运动/ADC/485/屏幕/断点6.人机显示OLED实时刷新J1~J6关节角度、整机故障代码整套工程全部代码整合完毕Keil MDK5直接新建工程粘贴即可编译烧录。

更多文章