Перейти к содержанию
    

STM8 IAR ASM объявление переменных

Нигде не найду как на ассемблере объявить переменную в среде IAR.

А также где брать подключаемые хедер файлы для портов.

 

Может у кого есть простая рабочая программка на асме под stm8 в среде IAR?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я делал вот так:

            module  i2c

           section .near_func.text:CODE:NOROOT(0)

           extern  ?b0

           public  i2c_readbyte
           public  i2c_readword
           public  i2c_writebyte

PA_ODR      define  0x5000
PA_IDR      define  0x5001

set_sda     macro
           bset    PA_ODR, #2
           endm

clear_sda   macro
           bres    PA_ODR, #2
           endm

set_scl     macro
           bset    PA_ODR, #1
           endm

clear_scl   macro
           bres    PA_ODR, #1
           endm

write_bit   macro
           sll     A
           bccm    PA_ODR, #2
           set_scl
           nop
           nop
           nop
           clear_scl
           endm

read_bit    macro
           set_scl
           nop
           ld      A, #4
           and     A, L:PA_IDR
           clear_scl
           add     A, #255
           rlcw    X
           nop
           nop
           endm

start       macro
           clear_sda
           clear_scl
           endm

stop        macro
           clear_sda
           set_scl
           set_sda
           endm

write_byte:
           write_bit
           write_bit
           write_bit
           write_bit
           write_bit
           write_bit
           write_bit
           write_bit
           set_sda
           nop
           nop
           set_scl
           nop
           nop
           nop
           clear_scl
           ret

read_byte:
           set_sda
           read_bit
           read_bit
           read_bit
           read_bit
           read_bit
           read_bit
           read_bit
           read_bit
           clear_sda
           set_scl
           nop
           clear_scl
           ret

read_byte_nack:
           set_sda
           read_bit
           read_bit
           read_bit
           read_bit
           read_bit
           read_bit
           read_bit
           read_bit
           set_sda
           set_scl
           nop
           clear_scl
           ret

i2c_readbyte:
           push    A
           start
           ld      A, #0xC0
           call    write_byte
           pop     A
           call    write_byte
           stop
           nop
           nop
           nop
           start
           ld      A, #0xC1
           call    write_byte
           call    read_byte_nack
           stop
           rrwa    X, A
           ret

i2c_readword:
           push    A
           start
           ld      A, #0xC0
           call    write_byte
           pop     A
           call    write_byte
           stop
           nop
           nop
           nop
           start
           ld      A, #0xC1
           call    write_byte
           call    read_byte
           call    read_byte_nack
           stop
           ret

i2c_writebyte:
           push    A
           start
           ld      A, #0xC0
           call    write_byte
           pop     A
           call    write_byte
           ld      A, ?b0
           call    write_byte
           stop
           ret

           end

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я читал "IAR Assembler Reference Guide" пытался брать те куски кода которые там приводились но все никак не получается...

особенно непонятно как правильно пользоваться директивой SECTION.

Я так понимаю что нужно обьявить секцию для переменных сначала?

Так значение переменной не меняется:

 

#include "iostm8.h"
        MODULE  asmmain
        PUBLIC  __iar_program_start
        PUBLIC  main
        EXTERN  CSTACK$$Limit
    
        SECTION `.near_func.text`:CODE//начинается секция кода программ, что там в кавычках?

__iar_program_start:
a1      DC16 0 //двухбайтная переменная инициализируется значением 0
a2      DC16 9 //двухбайтная переменная инициализируется значением 9   
        LDW     X, #0x000600    ; Set stackpointer
        LDW     SP, X
main:  

        LD A,#5//загружаю в А число 5
        LD a1,A// загружаю в переменную a1 значение из А

      END

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я читал "IAR Assembler Reference Guide" пытался брать те куски кода которые там приводились но все никак не получается...

особенно непонятно как правильно пользоваться директивой SECTION.

Я так понимаю что нужно обьявить секцию для переменных сначала?

Так значение переменной не меняется:

 

#include "iostm8.h"
        MODULE  asmmain
        PUBLIC  __iar_program_start
        PUBLIC  main
        EXTERN  CSTACK$$Limit
    
        SECTION `.near_func.text`:CODE//начинается секция кода программ, что там в кавычках?

__iar_program_start:
a1      DC16 0 //двухбайтная переменная инициализируется значением 0
a2      DC16 9 //двухбайтная переменная инициализируется значением 9   
        LDW     X, #0x000600; Set stackpointer
        LDW     SP, X
main:  

        LD A,#5//загружаю в А число 5
        LD a1,A// загружаю в переменную a1 значение из А

      END

По моему у Вас всё перепутано.

Вот фрагмент кода, ассемблер редко приходится использовать:

//-------------------------------------------ПЕРЕМЕННЫЕ---------------------------------------------
SECTION `.noinit`:DATA:NOROOT(2)
DATA
D_NUM		DS16		1						; Серийный номер
D_DAT		DS16		1						; Дата выпуска
dummy		DS16		2

//-------------------------------------------КОНСТАНТЫ----------------------------------------------
SECTION `.rodata`:CONST:NOROOT(2)
DATA
;---------------------------------------------------------------------------------------------------
sys_param:
DC16	        0, 9999, 1234, 0x90 + T_DEC + F_EXT + F_WRT
DC8		' Регистр команд                 '

Синтаксис скорее определяется используемой средой, чем платформой.

В секции, предназначенной для размещения кода, невозможно разместить переменные.

А различия в объявлении должны быть понятны из примера.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так компилируется:

#include "iostm8.h"
        MODULE  asmmain
        PUBLIC  __iar_program_start
        PUBLIC  main
        EXTERN  CSTACK$$Limit
//-------------------------------------------ПЕРЕМЕННЫЕ---------------------------------------------
    SECTION `.noinit`:DATA:NOROOT(2)
    DATA//это зачем? работает и без нее.
D_NUM        DC8        1                    ; Серийный номер
D_DAT        DC8        1                    ; Дата выпуска
dummy        DC8        2
        SECTION `.near_func.text`:CODE//начинается секция кода программ, что там в кавычках?

__iar_program_start:

        LDW     X, #0x000600    ; Set stackpointer
        LDW     SP, X
main:  

        LD A,#5//загружаю в А число 5
        //LD D_NUM,A// загружаю в переменную a1 значение из А

      END

Но если раскомментировать "//LD D_NUM,A// загружаю в переменную a1 значение из А"

то пишет ошибку:

Error[Lc036]: no block or place matches the pattern "rw data section .noinit in asmmain.o"

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так компилируется:

    DATA//это зачем? работает и без нее.
D_NUM        DC8        1        ; Серийный номер
D_DAT        DC8        1        ; Дата выпуска
dummy        DC8        2

Это от единообразия IAR-a: у Кортексов-М, если не сказать заветное слово "DATA", то в заказанных константах младший бит будет установлен в единицу.

Изменено пользователем Obam

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Error[Lc036]: no block or place matches the pattern "rw data section .noinit in asmmain.o"

Это же был просто пример.

У меня в файле *.icf объявлена секция ".noinit", в которой и размещаются эти переменные. У Вас видимо этой секции нет.

Размещайте переменные в существующей секции.

По поводу ключевых слов DATA и CODE - я всегда явно указываю, что размещаю: данные (переменные или константы в зависимости от секции) или код программы.

Возможно где то это и не обязательно, но и вроде как не мешает.

Изменено пользователем amiller

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но если раскомментировать "//LD D_NUM,A// загружаю в переменную a1 значение из А"

то пишет ошибку:

Возьмите любой си-шный исходник, найдите в свойствах проекта галку "генерировать asm-файлы", скомпилите и изучите результат.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возьмите любой си-шный исходник, найдите в свойствах проекта галку "генерировать asm-файлы", скомпилите и изучите результат.

Я так делал себе "шаблон" для функции на ASM.

 

Как альтернатива - в каталоге, где установлен IAR, поискать файлы с расширением ASM (для конкретного процессора)

Там может быть каталог \tutor\ - приведены примеры проектов с ASM

а также исходники функций (на ASM), содержащихся в библиотеках C, например ldiv (по крайней мере для IAR/MSP430 ОНО есть).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как альтернатива - в каталоге, где установлен IAR, поискать файлы с расширением ASM (для конкретного процессора)

... и ничего не найти :biggrin:

так как файлы ассемблера в IAR по дефолту имеют расширение .s

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...