Keil C51工程转VSCode Keil Assistant开发全过程
- ✨这里以stc15W408AS为例。
- 📌相关篇《【开源分享】自制STC15W408AS开发板》
- 📺编译-烧录演示:
📋转VSCODE开发环境主要原因可能
代码提示
以及代码跳转功能
,或者其他。
- 🌿代码提示功能:
- 🌿代码跳转功能
✅Keil C51工程转VSCode准备实施条件
- 电脑端已经实现了Keil C51开发。
- 电脑端已经安装了VSCODE软件。
- 电脑端已经安装了python。
🚩VSCode配置过程
- 在VSCode里面安装Keil Assistant插件。
- 给Keil Assistant插件配置Keil软件安装绝对路径。
- 🔧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]
stcgal 1.6 - an STC MCU ISP flash tool
(C) 2014-2018 Grigori Goronzy and others
https://github.com/grigorig/stcgal
positional arguments:
code_image code segment file to flash (BIN/HEX)
eeprom_image eeprom segment file to flash (BIN/HEX)
options:
-h, --help show this help message and exit
-a, --autoreset cycle power automatically by asserting DTR
-r RESETCMD, --resetcmd RESETCMD
shell command for board 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}
protocol version (default: auto)
-p PORT, --port PORT serial port device
-b BAUD, --baud BAUD transfer baud rate (default: 19200)
-l HANDSHAKE, --handshake HANDSHAKE
handshake baud rate (default: 2400)
-o OPTION, --option OPTION
set option (can be used multiple times, see documentation)
-t TRIM, --trim TRIM RC oscillator frequency in kHz (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
#define S1_S0 0x40 //P_SW1.6
#define S1_S1 0x80 //P_SW1.7
void Delay500ms();
void UartInit(void); //115200bps@11.0592MHz
void SendData(unsigned char dat);
void SendString(char *s);
void main()
{
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");
}
}
void UartInit(void) //115200bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR &= 0xFB; //定时器时钟12T模式
T2L = 0xFE; //设置定时初始值
T2H = 0xFF; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
}
/*----------------------------
发送串口数据
----------------------------*/
void SendData(unsigned char dat)
{
SBUF = dat;
while (!TI); //等待前一个数据发送完成
TI = 0;//清除发送标志
}
char putchar(char dat)
{
SendData(dat);
return dat;
}
/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
while (*s) //检测字符串结束标志
{
SendData(*s++); //发送当前字符
}
}
void Delay500ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 36;
k = 227;
do
{
do
{
while (--k);
}
while (--j);
}
while (--i);
}