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), это также будет жизнеспособным решением.

0 ответов

Другие вопросы по тегам