Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопросы новичка по STM8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > STM8
evil_laugh
Здравствуйте!

Прошу помощи гуру, имеющих или имевшим дело с контроллерами STM8. Решил попробовать освоить их как предварительную "ступень" перед переходом на STM32. Заказал себе плату STM8 Discovery, жду, пока приедет. Пока решил почитать даташит и попробовать что-нибудь написать+отладить в симуляторе. Пусть этот топик будет сборником моих нубских вопросов sm.gif

Среда разработки - STVD, язык - ассемблер, компилятор встроенный в среду, другого не скачивал.

Почитал ту скудную информацию, которую удалось добыть в сети по началу работы с STM8 на ассемблере. Прочитал даташит. Решил попробовать по аналогии с найденным в интернете включением диода на ножке сделать переключение источника тактирования на внешний кварц.

Вот такой код. Вместо бесконечного цикла, сгенерированного программой, вставил кусочек кода, составленный прямо по даташиту.


Код
stm8/

    #include "mapping.inc"
    #include "STM8S105C6.inc"

    segment 'rom'
main.l
; initialize SP
    ldw X,#stack_end
    ldw SP,X

    #ifdef RAM0    
; clear RAM0
ram0_start.b EQU $ram0_segment_start
ram0_end.b EQU $ram0_segment_end
    ldw X,#ram0_start
clear_ram0.l
    clr (X)
    incw X
    cpw X,#ram0_end    
    jrule clear_ram0
    #endif

    #ifdef RAM1
; clear RAM1
ram1_start.w EQU $ram1_segment_start
ram1_end.w EQU $ram1_segment_end    
    ldw X,#ram1_start
clear_ram1.l
    clr (X)
    incw X
    cpw X,#ram1_end    
    jrule clear_ram1
    #endif

; clear stack
stack_start.w EQU $stack_segment_start
stack_end.w EQU $stack_segment_end
    ldw X,#stack_start
clear_stack.l
    clr (X)
    incw X
    cpw X,#stack_end    
    jrule clear_stack

;    Здесь начинается мой код.

start.l

    BSET    CLK_SWCR,#1        
    BRES    CLK_SWCR,#2    ;выкл. прерывание
    LD        A,#$B4            ;значение для внешнего кварца
    LD        CLK_SWR,A        ;загружаем
    
loop.l        ;бесконечный цикл

    jra    loop


    

    interrupt NonHandledInterrupt
NonHandledInterrupt.l
    iret

    segment 'vectit'
    dc.l {$82000000+main}                                ; reset
    dc.l {$82000000+NonHandledInterrupt}; trap
    dc.l {$82000000+NonHandledInterrupt}; irq0
    dc.l {$82000000+NonHandledInterrupt}; irq1
    dc.l {$82000000+NonHandledInterrupt}; irq2
    dc.l {$82000000+NonHandledInterrupt}; irq3
    dc.l {$82000000+NonHandledInterrupt}; irq4
    dc.l {$82000000+NonHandledInterrupt}; irq5
    dc.l {$82000000+NonHandledInterrupt}; irq6
    dc.l {$82000000+NonHandledInterrupt}; irq7
    dc.l {$82000000+NonHandledInterrupt}; irq8
    dc.l {$82000000+NonHandledInterrupt}; irq9
    dc.l {$82000000+NonHandledInterrupt}; irq10
    dc.l {$82000000+NonHandledInterrupt}; irq11
    dc.l {$82000000+NonHandledInterrupt}; irq12
    dc.l {$82000000+NonHandledInterrupt}; irq13
    dc.l {$82000000+NonHandledInterrupt}; irq14
    dc.l {$82000000+NonHandledInterrupt}; irq15
    dc.l {$82000000+NonHandledInterrupt}; irq16
    dc.l {$82000000+NonHandledInterrupt}; irq17
    dc.l {$82000000+NonHandledInterrupt}; irq18
    dc.l {$82000000+NonHandledInterrupt}; irq19
    dc.l {$82000000+NonHandledInterrupt}; irq20
    dc.l {$82000000+NonHandledInterrupt}; irq21
    dc.l {$82000000+NonHandledInterrupt}; irq22
    dc.l {$82000000+NonHandledInterrupt}; irq23
    dc.l {$82000000+NonHandledInterrupt}; irq24
    dc.l {$82000000+NonHandledInterrupt}; irq25
    dc.l {$82000000+NonHandledInterrupt}; irq26
    dc.l {$82000000+NonHandledInterrupt}; irq27
    dc.l {$82000000+NonHandledInterrupt}; irq28
    dc.l {$82000000+NonHandledInterrupt}; irq29

    end


Собственно, решил просмотреть всё это дело во встроенном симуляторе. Всё компилится, всё замечательно.

Первый вопрос: где можно посмотреть значения контроллерных спецрегистров? Наблюдать их в окне Memory, которое сплошняком показывает всю память контроллера, как-то не очень наглядно.

Второй вопрос: у многих регистров есть так называемое Reset Value. Почему в окне Memory все регистры, кроме очищенных в начале кода, равны 0xFF?

Третий вопрос: почему приведённый выше код, хоть и изменяет значения регистров (от 0xFF) согласно данным командам, ни к чему не приводит? Как вообще правильно инициализировать контроллер? В примерах из сети якобы всё прекрасно работает, хотя там всего одна строчка (выдача 1цы на ножку) добавляется вместо бесконечного цикла, который с самого начала в программе стоит.

И, наконец, четвёртый вопрос - есть ли что-то ... ну, поприличнее, что ли, этой среды разработки, где можно нормально писать на ассемблере под STM8? После MPLAB этот STVD поначалу кажется неудобным, да ещё и симулятор как-то странно работает.
evil_laugh
Пришла мне плата STM8L-Discovery. Подключил и решил попробовать разобраться. Всё хорошо, все регистры видны, замечательно.

Но первая же команда переключения тактирования "BSET CLK_SWCR,#0" (то есть поднимаем бит SWEN) вылетает с ошибкой "gdi-error Flash memory is not accessible while the core is running".

При этом если в IAR написать это же самое на Си, всё прекрасно заработает. А с ассемблером у IAR у меня не получилось разобраться - контроллер почему-то не выходит в точку входа, застревая где-то в Boot ROM в бесконечном цикле. там есть строчка "LD A, __iar_program_start", так вот при сличении её результата в IAR и STVD (там она имеет вид "LD A, 0x8000") этот самый результат разный и вызывает разное ветвление. Я не понимаю, почему так...

А в STVD вот такая проблема с ошибкой. Кто-нибудь может её объяснить? sad.gif
evil_laugh
Жаль, нельзя редактировать свои предыдущие посты...

Я поясню, что я имею в виду.

Вот два скриншота дизасма из AVR. Первый - это дизасм пустого проекта на ассемблере. Второй - дизасм пустого проекта на Си.



Они ничем не отличаются. Кроме одного: вместо __iar_program_start во втором листинге везде стоит INTVEC$$Base.

Эти команды ничем не отличаются по опкоду: что у одного, что у второго он равен C68000. То есть и в первом, и во втором случае в A грузится 0x8000.

Но почему-то результат выполнения команды разный! В случае ассемблерного проекта в регистре A оказывается какое-то непонятное число, и программа зацикливается. А во втором случае всё прекрасно - в А оказывается 0x82, программа переходит по первому же сравнению и оказывается в начале моего кода.

Объясните, кто-нибудь, как это понимать?..

Чем вообще определяется этот листинг, который я привёл? Кто его пишет и как?
evil_laugh
Всем ещё раз добрый день.

Забросил пока асм на IAR, пробую кодить на STVD.

Поделитесь, пожалуйста, как правильно переключить источник тактирования в stm8l152c6.

Написал всё, как в даташите, пытаюсь отладить на stm8l-discovery.

Вот картинка из даташита.



При попытке запустить процесс переключения (установка бита SWEN в CLK_SWCR + загрузка в CLK_SWR значения ) дебаггер выдаёт такое:



Если писать в IAR Workbench и на Си, то там этот баг выглядит так:



Кто знает, что означает эта ошибка и как её устранить?..

У кого есть стм8л-дискавери, может, попробуете код из даташита выполнить? А то, может, у меня сам дискавери глючный...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.