Keil C51工程转VSCode Keil Assistant开发全过程

发布时间:2026/7/23 18:02:35

Keil C51工程转VSCode Keil Assistant开发全过程 Keil C51工程转VSCode Keil Assistant开发全过程✨这里以stc15W408AS为例。相关篇《【开源分享】自制STC15W408AS开发板》编译-烧录演示✨目前Keil Assistant插件已经停止更新但是还是可以继续使用。基本可以满足一般的需求。只不过使用VSCode加载新的MDKKeil工程项目需要手动指定Keil工程.现在有可替代的插件就是Keil Assistant Community Fork发布者candycium插件在Keil项目文件内使用VSCode打开后该插件可以自动识别 C51/ARM 项目类型无需再手动指定项目。该插件亮点功能 ✨智能项目搜索打开工作区后自动检测并加载 Keil 项目无需手动查找一键式编译体验全新的状态栏按钮设计编译、重编译、下载一键完成多核心并行编译自动检测 CPU 核心数充分利用系统性能显著提升编译速度智能项目类型识别自动识别 C51/ARM 项目类型优化编译配置跨模块优化支持支持 Cross-Module-Optimization提供更好的代码优化效果性能提升 编译速度提升高达 300%在 8 核心 CPU 上测试项目加载时间减少 50%内存占用优化降低 30%其它功能相似插件Keil uVision Assistant转VSCODE开发环境主要原因可能代码提示以及代码跳转功能或者其他。代码提示功能代码跳转功能✅Keil C51工程转VSCode准备实施条件电脑端已经实现了Keil C51开发。电脑端已经安装了VSCODE软件。电脑端已经安装了python。VSCode配置过程在VSCode里面安装Keil Assistant插件。给Keil Assistant插件配置Keil软件安装绝对路径。3. 依赖C\C插件stcgal烧录工具安装依赖python pippip install stcgalKeil工程转VSCODE在转入到VSCODE前先在Keil软件中将工程创建起来并勾选生成HEX选项。编译一遍让其生成HEX的路径creating hex file from .\Objects\STC_Printf...在工程文件夹内右键选择通过VSCODE打开。添加头文件路径。如果是第一次打开显示波浪线点击小灯泡选择编辑includePath设置。编译工程命令行烧录stcgal-p COM10-P stc15.\Objects\STC_Printf.hex 或者 stcgal-a-p COM10-P stc15.\Objects\STC_Printf.hex//-a 用来控制串口芯片DTR 引脚让目标芯片复位如果目标芯片启用了外部复位引脚P54时可以手动按复位按键后即可进入下载阶段。-p COM10:串口端口号-P stc15烧录目标芯片型号.\Objects\STC_Printf.hex烧录文件路径。烧录命令stcgal -p COM10 -P stc15 .\Objects\STC_Printf.hex⚡如果你的目标板没有实现UART DTR 流控制(不带免冷启动电路)看到Wait for mcu, please cycle power:之后这是在提示你请手动复位 mcu让单片机进入 isp 模式烧录命令stcgal -a -p COM10 -P stc15 .\Objects\STC_Printf.hex⚡如果你的目标板实现了UART DTR 流控制(带免冷启动电路)就不要添加带-a的参数不然还需要去复位一次单片机看到Waiting for MCU:之后这是在提示你请手动复位 mcu让单片机进入 isp 模式需要手动去复位或者重启目标板。(可参考前面的相关开源开发板电路了解STC免冷启动电路设计)stcgal命令行使用帮助C:\Users\Administratorstcgal-h usage:stcgal[-h][-a][-r RESETCMD][-P{stc89,stc12a,stc12b,stc12,stc15a,stc15,stc8,usb15,auto}][-p PORT][-b BAUD][-l HANDSHAKE][-o OPTION][-t TRIM][-D][-V][code_image][eeprom_image]stcgal1.6-an STC MCU ISP flashtool(C)2014-2018Grigori Goronzy and others https://github.com/grigorig/stcgalpositional arguments:code_image code segment file toflash(BIN/HEX)eeprom_image eeprom segment file toflash(BIN/HEX)options:-h,--help show this help message and exit-a,--autoreset cycle power automatically by asserting DTR-r RESETCMD,--resetcmd RESETCMD shell commandforboard power-cycling(instead of DTR assertion)-P{stc89,stc12a,stc12b,stc12,stc15a,stc15,stc8,usb15,auto},--protocol{stc89,stc12a,stc12b,stc12,stc15a,stc15,stc8,usb15,auto}protocolversion(default:auto)-p PORT,--port PORT serial port device-b BAUD,--baud BAUD transfer baudrate(default:19200)-l HANDSHAKE,--handshake HANDSHAKE handshake baudrate(default:2400)-o OPTION,--option OPTION setoption(can be used multiple times,see documentation)-t TRIM,--trim TRIM RC oscillator frequency inkHz(STC15series only)-D,--debug enable debug output-V,--version print version info and exit⛳注意事项在Keil工程中设置里面如果没有勾选生成HEX文件选项那么在VSCODE里面编译时也不会生成Hex文件的本质上在VSCODE里面编译还是调用的Keil软件本身。测试工程基于stc15w408as单片机。//STC15W408AS512字节的RAM8K FLASH//晶振频率11.0592MHz//波特率115200//stcgal -p COM10 -P stc15 .\Objects\STC_Printf.hex#includeSTC15F2K60S2.H#includeintrins.h#includestdio.hbit busy;//#define FOSC 11059200UL//#define BAUD 115200//sfr P_SW1 0xA2; //外设功能切换寄存器1#defineS1_S00x40//P_SW1.6#defineS1_S10x80//P_SW1.7voidDelay500ms();voidUartInit(void);//115200bps11.0592MHzvoidSendData(unsignedchardat);voidSendString(char*s);voidmain(){P1M00x00;P1M10x00;P3M00x00;P3M10x00;UartInit();Delay500ms();SendString(STC15F2K60S2\r\nUart Test !\r\n);while(1){P170x01;Delay500ms();printf(stcgal Tool Programmer \n\r);P170x00;Delay500ms();printf(Hello World \r\n);// SendString(STC15F2K60S2\r\nUart Test !\r\n);Delay500ms();printf(perseverance51 \n\r);}}voidUartInit(void)//115200bps11.0592MHz{SCON0x50;//8位数据,可变波特率AUXR|0x01;//串口1选择定时器2为波特率发生器AUXR0xFB;//定时器时钟12T模式T2L0xFE;//设置定时初始值T2H0xFF;//设置定时初始值AUXR|0x10;//定时器2开始计时}/*---------------------------- 发送串口数据 ----------------------------*/voidSendData(unsignedchardat){SBUFdat;while(!TI);//等待前一个数据发送完成TI0;//清除发送标志}charputchar(chardat){SendData(dat);returndat;}/*---------------------------- 发送字符串 ----------------------------*/voidSendString(char*s){while(*s)//检测字符串结束标志{SendData(*s);//发送当前字符}}voidDelay500ms()//11.0592MHz{unsignedchari,j,k;_nop_();_nop_();i22;j36;k227;do{do{while(--k);}while(--j);}while(--i);}

相关新闻