STM8L001J3 SDCC и проблемы с прошивкой файла s19 с помощью набора инструментов STM
Я только начал использовать STM8 (STM8L001J3, к сожалению, худший из поддерживаемых Open Source Toolchains) вместе с SDCC. Поскольку ST Visual Programmer поддерживает только s19, мне нужно выбрать его в качестве формата вывода. Глядя на файл карты, кажется, что все в порядке, и компоновщик помещает основную функцию немного позади начала кодового пространства 0x8028 (сразу за векторами прерывания).
ASxxxx Linker V03.00 + NoICE + sdld, page 1.
Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
. .ABS. 00000000 00000000 = 0. bytes (ABS,CON)
Value Global Global Defined In Module
----- -------------------------------- ------------------------
00000000 .__.ABS. main
00000000 l_CABS
00000000 l_CONST
00000000 l_DABS
00000000 l_DATA
00000000 l_INITIALIZED
00000000 l_INITIALIZER
00000000 l__CODE
00000000 s_CABS
00000000 s_DABS
00000000 s__CODE
00000001 l_SSEG
00000001 s_DATA
00000001 s_INITIALIZED
00000001 s_SSEG
00000003 l_GSFINAL
0000000B l_HOME
0000001A l_GSINIT
0000003A l_CODE
00008000 s_HOME
0000800B s_GSINIT
00008025 s_GSFINAL
00008028 s_CODE
00008028 s_CONST
00008028 s_INITIALIZER
ASxxxx Linker V03.00 + NoICE + sdld, page 2.
Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
SSEG 00000001 00000001 = 1. bytes (REL,CON)
Value Global Global Defined In Module
----- -------------------------------- ------------------------
ASxxxx Linker V03.00 + NoICE + sdld, page 3.
Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
HOME 00008000 0000000B = 11. bytes (REL,CON)
Value Global Global Defined In Module
----- -------------------------------- ------------------------
ASxxxx Linker V03.00 + NoICE + sdld, page 4.
Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
GSINIT 0000800B 0000001A = 26. bytes (REL,CON)
Value Global Global Defined In Module
----- -------------------------------- ------------------------
ASxxxx Linker V03.00 + NoICE + sdld, page 5.
Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
GSFINAL 00008025 00000003 = 3. bytes (REL,CON)
Value Global Global Defined In Module
----- -------------------------------- ------------------------
ASxxxx Linker V03.00 + NoICE + sdld, page 6.
Hexadecimal [32-Bits]
Area Addr Size Decimal Bytes (Attributes)
-------------------------------- ---- ---- ------- ----- ------------
CODE 00008028 0000003A = 58. bytes (REL,CON)
Value Global Global Defined In Module
----- -------------------------------- ------------------------
00008028 _main main
0000805D _handler main
ASxxxx Linker V03.00 + NoICE + sdld, page 7.
Files Linked [ module(s) ]
.\build\Debug\src\main.rel [ main ]
ASxxxx Linker V03.00 + NoICE + sdld, page 8.
User Base Address Definitions
HOME = 0x8000
DATA = 0x0001
Сам код выглядит следующим образом:
#include <stdint.h>
#define PB_ODR (*(volatile uint8_t *)0x5005)
#define PB_IDR (*(volatile uint8_t *)0x5006)
#define PB_DDR (*(volatile uint8_t *)0x5007)
#define PB_CR1 (*(volatile uint8_t *)0x5008)
#define PB_CR2 (*(volatile uint8_t *)0x5009)
#define CLK_DIVR (*(volatile uint8_t *)0x50c0)
#define CLK_PCKENR2 (*(volatile uint8_t *)0x50c4)
void main(void)
{
CLK_DIVR = 0x01; // Set the frequency to 8 MHz
// Configure pins
PB_DDR |= (1 << 6); // Set PB6 to output
PB_CR1 &= ~(1 << 6); // Set PB6 to Open-Drain mode
PB_CR2 &= ~(1 << 6); // Set PB6 to slow mode
while(1)
{
for(int j = 0; j < 1000; j++) {
for(int i = 0; i < 1000; i++) {
__asm__("nop");
}
}
PB_ODR |= (1 << 6); // Toggle PB6
}
}
void handler (void) __trap
{
while (1)
{
__asm__("nop");
}
}
Я даже установил
--code-loc 0x8000
вариант для компоновщика, чтобы разместить его правильно, и когда я спрашиваю VSCode (с расширением EIDE) о командной строке, он сообщает мне следующее:
unify_builder v2.8.0.1
C command line (sdcc): --std-c99 -c -mstm8 --opt-code-size --model-medium -I.\src
CPP command line (sdcc): -c -mstm8 --opt-code-size --model-medium -I.\src
ASM command line (sdasstm8): -l -o -s -I.\src
Linker command line (sdcc): --out-fmt-s19 -mstm8 --code-loc 0x8000
И когда я теперь открываю файл в ST Visual Programmer, он говорит:
> Loading file C:\GIT\Hardware\STM8-HowTo\STM8-SDCC-VSCode-Test\STM8-SDCC-Minimal\build\Debug\STM8-SDCC-Minimal.s19 in PROGRAM MEMORY area ...
FILE : line 1: Address 0x0 is out of range and is ignored!
FILE : line 2: Address 0x0 is out of range and is ignored!
...
И в представлении кода также отображается только 0x00:
Если я создам какой-нибудь файл Intel HEX и помещу его в онлайн-программу просмотра по адресу http://www.dlwrr.com/electronics/tools/hexview/hexview.html, он также будет выглядеть нормально.
Поскольку я плохо говорю на Motorola s19, может быть, кто-нибудь мне подскажет.
Если кто-то может одобрить, шестнадцатеричный код в порядке и свяжите меня с инструментом программирования, поддерживающим этот вариант в Windows (10), это также будет жизнеспособным решением.