问题
在使用platformio进行STC8H1K08单片机开发,在烧录编译好的程序时失败了,烧录过程日志如下:
* 正在执行任务: C:\Users\23043036\.platformio\penv\Scripts\platformio.exe run --target upload
Processing STC8H1K08 (platform: intel_mcs51; board: STC8H1K08)
----------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/intel_mcs51/STC8H1K08.html
PLATFORM: Intel MCS-51 (8051) (2.2.0) > Generic STC8H1K08
HARDWARE: STC8H1K08 11MHz, 1.25KB RAM, 8KB Flash
PACKAGES:
- tool-stcgal @ 1.110.0 (1.10)
- tool-vnproch55x @ 1.0.220407
- toolchain-sdcc @ 1.40400.0 (4.4.0)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 0 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Checking size .pio\build\STC8H1K08\firmware.hex
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
Flash: [======== ] 76.3% (used 6251 bytes from 8192 bytes)
Configuring upload protocol...
AVAILABLE: stcgal
CURRENT: upload_protocol = stcgal
Looking for upload port...
Auto-detected: COM3
Uploading .pio\build\STC8H1K08\firmware.hex
Cycling power: done
Waiting for MCU: done
Target model:
Name: STC8H1K08
Magic: F734
Code flash: 8.0 KB
EEPROM flash: 4.0 KB
Target frequency: 11.058 MHz
Target BSL version: 7.3.12U
Target wakeup frequency: 35.825 KHz
Target ref. voltage: 1190 mV
Target mfg. date: 2021-03-18
Target options:
reset_pin_enabled=False
clock_gain=high
watchdog_por_enabled=False
watchdog_stop_idle=True
watchdog_prescale=256
low_voltage_reset=True
low_voltage_threshold=0
eeprom_erase_enabled=True
bsl_pindetect_enabled=False
por_reset_delay=long
rstout_por_state=high
uart1_remap=False
uart2_passthrough=True
uart2_pin_mode=push-pull
epwm_open_drain=True
program_eeprom_split=8192
Loading flash: 6251 bytes (Intel HEX)
Trimming frequency: 11.062 MHz
Switching to 19200 baud: done
Serial port error: read timeout
*** [upload] Error 1
====================================== [FAILED] Took 24.20 seconds ======================================
解决过程
使用串口进行程序烧写,platformio使用的是stcgal工具,日志显示的就是stcgal和单片机的串口交互过程,为了查看更详细的过程日志,我们将Debug模式打开(在C:\Users\23043036\.platformio\platforms\intel_mcs51\builder\main.py
中的UPLOADERFLAGS
下添加"-D"
参数),然后查看烧录过程日志:
* 正在执行任务: C:\Users\23043036\.platformio\penv\Scripts\platformio.exe run --target upload
Processing STC8H1K08 (platform: intel_mcs51; board: STC8H1K08)
----------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/intel_mcs51/STC8H1K08.html
PLATFORM: Intel MCS-51 (8051) (2.2.0) > Generic STC8H1K08
HARDWARE: STC8H1K08 11MHz, 1.25KB RAM, 8KB Flash
PACKAGES:
- tool-stcgal @ 1.110.0 (1.10)
- tool-vnproch55x @ 1.0.220407
- toolchain-sdcc @ 1.40400.0 (4.4.0)
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 0 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Checking size .pio\build\STC8H1K08\firmware.hex
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
Flash: [======== ] 77.3% (used 6330 bytes from 8192 bytes)
Configuring upload protocol...
AVAILABLE: stcgal
CURRENT: upload_protocol = stcgal
Looking for upload port...
Auto-detected: COM3
Uploading .pio\build\STC8H1K08\firmware.hex
Cycling power: done
<- Packet data: 46 B9 68 00 38 50 00 A8 F3 90 B4 00 02 FF FF BF BF FF 26 9C F7 20 73 55 00 F7 34 0C 8B F1 AF DC 0F 1F 20 FF 00 30 00 20 04 A6 21 03 18 32 FF 7B 2E 5A 8B A6 C4 F4 FF 17 CA 16
Waiting for MCU: done
Target model:
Name: STC8H1K08
Magic: F734
Code flash: 8.0 KB
EEPROM flash: 4.0 KB
-> Packet data: 46 B9 6A 00 20 00 0C 00 00 17 00 2E 00 45 00 5C 00 73 00 8A 00 A1 00 B8 00 CF 00 E6 00 FF 00 06 86 16
Target frequency: 11.072 MHz
Target BSL version: 7.3.12U
Target wakeup frequency: 35.825 KHz
Target ref. voltage: 1190 mV
Target mfg. date: 2021-03-18
Target options:
reset_pin_enabled=False
clock_gain=high
watchdog_por_enabled=False
watchdog_stop_idle=True
watchdog_prescale=256
low_voltage_reset=True
low_voltage_threshold=0
eeprom_erase_enabled=True
bsl_pindetect_enabled=False
por_reset_delay=long
rstout_por_state=high
uart1_remap=False
uart2_passthrough=True
uart2_pin_mode=push-pull
epwm_open_drain=True
program_eeprom_split=8192
Loading flash: 6330 bytes (Intel HEX)
<- Packet data: 46 B9 68 00 20 00 0C 17 72 19 31 1A CC 1C 64 1E 08 1F A9 21 08 22 A9 24 44 25 B2 27 4A 28 F7 07 7E 16
-> Packet data: 46 B9 6A 00 20 00 0C B3 00 B4 00 B5 00 B3 01 B4 01 B5 01 B3 02 B4 02 B5 02 B3 03 B4 03 B5 03 09 18 16
<- Packet data: 46 B9 68 00 20 00 0C 23 F0 24 08 24 17 23 F0 24 0E 24 1D 23 F3 24 0B 24 20 23 F9 24 0E 24 23 06 B2 16
Trimming frequency: 11.051 MHz
-> Packet data: 46 B9 6A 00 0E 01 00 00 FF CC 03 B3 80 03 7A 16
<- Packet data: 46 B9 68 00 07 01 00 70 16
-> Packet data: 46 B9 6A 00 0B 05 00 00 5A A5 01 79 16
Switching to 115200 baud: done
<- Packet data: 46 B9 68 00 07 05 00 74 16
-> Packet data: 46 B9 6A 00 0B 03 00 00 5A A5 01 77 16
Serial port error: read timeout
*** [upload] Error 1
====================================== [FAILED] Took 24.72 seconds ======================================
* 终端进程“C:\Users\23043036\.platformio\penv\Scripts\platformio.exe 'run', '--target', 'upload'”已终止,退出代码: 1。
* 终端将被任务重用,按任意键关闭。
可以看到在stcgal与单片机交互过程中,发送了报文后单片机没有响应,最终超时了,通过阅读stcgal的代码以及添加打印,可以知道是在擦除芯片时交互失败的,通过报文分析,发现stcgal发送的报文是没有问题的,那为什么单片机没有响应呢?????
在stcgal的github上,issues中有类似的打印,但是没有具体的解决办法,网上相关的资料也很少,查找了好久,最终是在platformio的github上找到了解决办法。
解决办法
对于stc8,烧录时需要将stcgal_protocol改为auto,其他系列怎么样不知道,但是STC8如此修改后确实是可以的。
修改C:\Users\23043036\.platformio\platforms\intel_mcs51\builder\main.py
文件,添加了一下内容:
if stcgal_protocol == 'stc8':
stcgal_protocol = 'auto'
详细内容为:
# Copyright 2014-present PlatformIO <contact@platformio.org>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import sys
from os.path import join
from SCons.Script import ARGUMENTS, AlwaysBuild, Default, DefaultEnvironment
def __getSize(size_type, env):
# FIXME: i don't really know how to do this right. see:
# https://community.platformio.org/t/missing-integers-in-board-extra-flags-in-board-json/821
return str(
env.BoardConfig().get(
"build",
{
# defaults
"size_heap": 1024,
"size_iram": 256,
"size_xram": 65536,
"size_code": 65536,
},
)[size_type]
)
def _parseSdccFlags(flags):
assert flags
if isinstance(flags, list):
flags = " ".join(flags)
flags = str(flags)
parsed_flags = []
unparsed_flags = []
prev_token = ""
for token in flags.split(" "):
if prev_token.startswith("--") and not token.startswith("-"):
parsed_flags.extend([prev_token, token])
prev_token = ""
continue
if prev_token:
unparsed_flags.append(prev_token)
prev_token = token
unparsed_flags.append(prev_token)
return (parsed_flags, unparsed_flags)
env = DefaultEnvironment()
platform = env.PioPlatform()
board_config = env.BoardConfig()
env.Replace(
AR="sdar",
AS="sdas8051",
CC="sdcc",
LD="sdld",
RANLIB="sdranlib",
OBJCOPY="sdobjcopy",
OBJSUFFIX=".rel",
LIBSUFFIX=".lib",
SIZETOOL=join(platform.get_dir(), "builder", "size.py"),
SIZECHECKCMD="$PYTHONEXE $SIZETOOL $SOURCES",
SIZEPRINTCMD='"$PYTHONEXE" $SIZETOOL $SOURCES',
SIZEPROGREGEXP=r"^ROM/EPROM/FLASH\s+[a-fx\d]+\s+[a-fx\d]+\s+(\d+).*",
PROGNAME="firmware",
PROGSUFFIX=".hex",
)
env.Append(
ASFLAGS=["-l", "-s"],
CFLAGS=["--std-sdcc11"],
CCFLAGS=[
"--opt-code-size", # optimize for size
"--peep-return", # peephole optimization for return instructions
"-m%s" % board_config.get("build.cpu"),
],
CPPDEFINES=["F_CPU=$BOARD_F_CPU", "HEAP_SIZE=" + __getSize("size_heap", env)],
LINKFLAGS=[
"-m%s" % board_config.get("build.cpu"),
"--iram-size",
__getSize("size_iram", env),
"--xram-size",
__getSize("size_xram", env),
"--code-size",
__getSize("size_code", env),
"--out-fmt-ihx",
],
)
if int(ARGUMENTS.get("PIOVERBOSE", 0)):
env.Prepend(UPLOADERFLAGS=["-v"])
# parse manually SDCC flags
if env.get("BUILD_FLAGS"):
_parsed, _unparsed = _parseSdccFlags(env.get("BUILD_FLAGS"))
env.Append(CCFLAGS=_parsed)
env["BUILD_FLAGS"] = _unparsed
project_sdcc_flags = None
if env.get("SRC_BUILD_FLAGS"):
project_sdcc_flags, _unparsed = _parseSdccFlags(env.get("SRC_BUILD_FLAGS"))
env["SRC_BUILD_FLAGS"] = _unparsed
#
# Target: Build executable and linkable firmware
#
target_firm = env.BuildProgram()
if project_sdcc_flags:
env.Import("projenv")
projenv.Append(CCFLAGS=project_sdcc_flags)
AlwaysBuild(env.Alias("nobuild", target_firm))
target_buildprog = env.Alias("buildprog", target_firm, target_firm)
#
# Target: Print binary size
#
target_size = env.Alias(
"size", target_firm, env.VerboseAction("$SIZEPRINTCMD", "Calculating size $SOURCE")
)
AlwaysBuild(target_size)
#
# Target: Upload firmware
#
upload_protocol = env.subst("$UPLOAD_PROTOCOL")
upload_actions = []
if upload_protocol == "stcgal":
f_cpu_khz = int(board_config.get("build.f_cpu").strip("L")) / 1000
stcgal_protocol = board_config.get("upload.stcgal_protocol")
if stcgal_protocol == 'stc8':
stcgal_protocol = 'auto'
env.Replace(
UPLOADER=join(platform.get_package_dir("tool-stcgal") or "", "stcgal.py"),
UPLOADERFLAGS=[
"-P",
stcgal_protocol,
"-p",
"$UPLOAD_PORT",
"-t",
int(f_cpu_khz),
"-a",
"-D"
],
UPLOADCMD='"$PYTHONEXE" "$UPLOADER" $UPLOADERFLAGS $SOURCE',
)
upload_actions = [
env.VerboseAction(env.AutodetectUploadPort, "Looking for upload port..."),
env.VerboseAction("$UPLOADCMD", "Uploading $SOURCE"),
]
# CH55x upload tool
elif upload_protocol == "ch55x":
env.Replace(
UPLOADER="vnproch55x",
UPLOADERFLAGS=["-f"],
UPLOADCMD="$UPLOADER $UPLOADERFLAGS $BUILD_DIR/${PROGNAME}.bin",
)
upload_actions = [
env.VerboseAction(
" ".join(
[
"$OBJCOPY",
"-I",
"ihex",
"-O",
"binary",
"$SOURCE",
"$BUILD_DIR/${PROGNAME}.bin",
]
),
"Creating binary",
),
env.VerboseAction("$UPLOADCMD", "Uploading ${PROGNAME}.bin"),
]
# custom upload tool
elif upload_protocol == "custom":
upload_actions = [env.VerboseAction("$UPLOADCMD", "Uploading $SOURCE")]
else:
sys.stderr.write("Warning! Unknown upload protocol %s\n" % upload_protocol)
AlwaysBuild(env.Alias("upload", target_firm, upload_actions))
#
# Setup default targets
#
Default([target_buildprog, target_size])