Прошу помощи гуру, имеющих или имевшим дело с контроллерами STM8. Решил попробовать освоить их как предварительную "ступень" перед переходом на STM32. Заказал себе плату STM8 Discovery, жду, пока приедет. Пока решил почитать даташит и попробовать что-нибудь написать+отладить в симуляторе. Пусть этот топик будет сборником моих нубских вопросов
Среда разработки - 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
#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 поначалу кажется неудобным, да ещё и симулятор как-то странно работает.