Keil C51工程转VSCode Keil Assistant开发全过程
- ✨这里以stc15W408AS为例。
- 📌相关篇《【开源分享】自制STC15W408AS开发板》
- 📺编译-烧录演示:
- ✨目前
Keil Assistant插件已经停止更新,但是还是可以继续使用。基本可以满足一般的需求。只不过使用VSCode加载新的MDK(Keil)工程项目需要手动指定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 pip):
pip install stcgal
🌻Keil工程转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\Administrator>stcgal-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(STC15+series only)-D,--debug enable debug output-V,--version print version info and exit⛳注意事项
- 🍁在Keil工程中,设置里面如果没有勾选生成HEX文件选项,那么在VSCODE里面,编译时也不会生成Hex文件的,本质上,在VSCODE里面,编译还是调用的Keil软件本身。
🌼测试工程
- 🔖基于
stc15w408as单片机。
//STC15W408AS,512字节的RAM,8K FLASH//晶振频率:11.0592MHz//波特率:115200//stcgal -p COM10 -P stc15 .\Objects\STC_Printf.hex#include<STC15F2K60S2.H>#include"intrins.h"#include"stdio.h"bit busy;//#define FOSC 11059200UL//#define BAUD 115200//sfr P_SW1 = 0xA2; //外设功能切换寄存器1#defineS1_S00x40//P_SW1.6#defineS1_S10x80//P_SW1.7voidDelay500ms();voidUartInit(void);//115200bps@11.0592MHzvoidSendData(unsignedchardat);voidSendString(char*s);voidmain(){P1M0=0x00;P1M1=0x00;P3M0=0x00;P3M1=0x00;UartInit();Delay500ms();SendString("STC15F2K60S2\r\nUart Test !\r\n");while(1){P17=0x01;Delay500ms();printf("stcgal Tool Programmer \n\r");P17=0x00;Delay500ms();printf("Hello World \r\n");// SendString("STC15F2K60S2\r\nUart Test !\r\n");Delay500ms();printf("perseverance51 \n\r");}}voidUartInit(void)//115200bps@11.0592MHz{SCON=0x50;//8位数据,可变波特率AUXR|=0x01;//串口1选择定时器2为波特率发生器AUXR&=0xFB;//定时器时钟12T模式T2L=0xFE;//设置定时初始值T2H=0xFF;//设置定时初始值AUXR|=0x10;//定时器2开始计时}/*---------------------------- 发送串口数据 ----------------------------*/voidSendData(unsignedchardat){SBUF=dat;while(!TI);//等待前一个数据发送完成TI=0;//清除发送标志}charputchar(chardat){SendData(dat);returndat;}/*---------------------------- 发送字符串 ----------------------------*/voidSendString(char*s){while(*s)//检测字符串结束标志{SendData(*s++);//发送当前字符}}voidDelay500ms()//@11.0592MHz{unsignedchari,j,k;_nop_();_nop_();i=22;j=36;k=227;do{do{while(--k);}while(--j);}while(--i);}