NFLic

STM8uLoader

Где взять, как подключить, как пользоваться

Во первых нужна плата, содержащая требуемый микроконтроллер STM8. Здесь будем использовать самую массовую и дешевую плату с микроконтроллером STM8S103F3P6:

 

Далее нужен программатор ST-LINK V2 для прошивки начального кода загрузчика boot_uC в микроконтроллер. Без защиты выводов от статического электричесва:

С защитой выводов от статического электричества (несколько дороже и без корпуса):

Преобразователь USB-TTL(UART) с соответствующими драйверами. Напряжение на выводах RX, TX (3,3V или 5V) должно соответствовать напряжению питания микроконтроллера на выбранной плате. Есть преобразователи, позволяющие выбрать требуемое напряжение. Должна также соответствовать полярность сигнала и скорость не менее 128000.

 

 

Нужна программа от STMicroelectronics к описанным ранее программаторам [ST Visual Programmer STM32].

Скачиваем файлы прошивки [boot_OPTION_rev14], [boot_FLASH_rev14] для версии $14 загрузчика boot_uC или файлы прошивки [boot_OPTION_rev25] , [boot_FLASH_rev25] для версии $25 загрузчика boot_uC.

Версия $14 загрузчика boot_uC наиболее опробована, но занимает на 2 байта (адрес передачи управления прикладной программе) больше памяти FLASH. Версия $25 загрузчика boot_uC хранит адрес передачи управления прикладной программе в резервных ячейках блока памяти OPTION Bytes.

Программатором ST-Link-V2 и программой ST Visual Programmer необходимо сначала записать файл boot_OPTION выбранной версии во FLASH память микроконтроллера. После сброса микроконтроллера произойдет копирование образа кода начального загрузчика boot_OPTION в блок памяти OPTION Bytes. Непрерывное свечение светодиода означает, что код записан и соответствует исходному образу. Непрерывное моргание светодиода означает не соответствие записанного в блок памяти OPTION Bytes кода исходному образу.

Далее также программатором ST-Link-V2 и программой ST Visual Programmer необходимо записать файл boot_FLASH выбранной версии во FLASH память микроконтроллера. На данном этапе записывается только код начального копировщика boot_FLASH, остальные ячейки паяти FLASH стираются.

Теперь необходимо проверить целостность кода загрузчика boot_uC в памяти STM8. Программатор здесь бесполезен, так как не имеет доступ к резервным ячейкам блока памяти OPTION Bytes, где хранится образ кода начального загрузчика boot_OPTION. Здесь нужен выбранный/приобретенный вами преобразователь USB-TTL(UART) с установленными драйверами. Подключаем преобразователь USB-TTL(UART) к USB разъему компьютера и плате STM8. В моем случае схема подключения:

 

;                 5V        _ _ _ _ _ _ _ _ _ _ _ _  _ _ _ _ _ _ _ _ _ _ _ _
;USB-UART 5V  ->>-'      __|                       \/                       |__ 
;USB-UART VCC ->>-,     |__| PD4 (HS) TIM2_CH1            TIM2_CH2 (HS) PD3 |__|----------------,   /|
;USB-UART 3V3 ->>-'      1 |    UART1_CK  BEEP            AIN4   ADC_ETR    |20                 |  / | 
;USB-UART TXD ->>----,   __|                                                |__               ,---/  | 
;USB-UART RXD ->>----|--|__| PD5 (HS) AIN5                AIN3     (HS) PD2 |__|              |   |  | 
;USB-UART GND ->>-.  |   2 |    UART1_TX                  [TIM2_CH3]        |19               HCM1212A 
;                GND |   __|                                                |__               |   |  | 
;                    '--|__| PD6 (HS) AIN6                SWIM     (HS) PD1 |__|--- SWIM      |   |  | 
;                        3 |    UART1_RX                                    |18               '---\  | 
;                        __|                                                |__                 |  \ | 
;               NRST ---|__| NRST                         SPI_MISO (HS) PC7 |__|----------------'   \| 
;                        4 |                              [TIM1_CH2]        |17 
;                        __|                                                |__ 
;                       |__| PA1  OSCIN                   SPI_MOSI (HS) PC6 |__|           
;                        5 |                              [TIM1_CH1]        |16               3V3        3V3
;                        __|                                                |__                |          |
;                       |__| PA2  OSCOUT                   SPI_SCK (HS) PC5 |__|               |          |
;                        6 |                              [TIM2_CH1]        |15               ---        ---
;                        __|                                                |__              |   |      |   |
;                GND ---|__| Vss                     AIN2  CLK_CCO (HS) PC4 |__|             |   |      |   |
;                        7 |                        [TIM1_CH2N]  TIM1_CH4   |14              |   |      |   |
;                        __|                                                |__               ---        --- 
;                       |__| Vcap                         TIM1_CH3 (HS) PC3 |__|               |  RED     | BLUE
;                        8 |                              [TIM1_CH1N] [TLI] |13              -----LED   -----LED
;                        __|                                                |__              \   / ->   \   / ->  
;                3V3 ---|__| Vdd                  [ADC_ETR] I2C_SCL (T) PB4 |__|              \ /  ->    \ /  ->  
;                        9 |                                                |12              -----      -----
;                        __|    [SPI_NSS]                 [TIM1_BKN]        |__                |          |
;                       |__| PA3 (HS) TIM_CH3             I2C_SDA   (T) PB5 |__|---------------'         GND
;                        10|_ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _|11 
;                                             STM8S103F3P6   

 

Вот так у меня на рабочем столе :

 

Скачиваем специально написанную программу [STM8uLoaderTest.exe]. Запускаем программу, однократно нажимаем на плате STM8 кнопку сброса. Рядом с файлом STM8uLoaderTest.exe появляется файл [boot_uC_rev14_dump.txt] или файл [boot_uC_rev25_dump.txt] с содержимым выгруженного из памяти STM8 кода загрузчика boot_uC соответствующей версии. Также соответствующее содержимое появится в консольном окне программы STM8uLoaderTest.exe

 

 

 

При удачной проверке целостности кода загрузчика boot_uC в памяти микроконтроллера пропадает необходимость в программаторе. С этого момента нужен только преобразователь USB-TTL(UART), подключенный по описанной выше схеме и хост-программа boot_PC исполняемый файл которой называется [STM8uLoader.exe] :

 

 

Как пользоваться

Для работы с загрузчиком в одной папке должны быть расположены три файла [STM8uLoader.zip] :

- исполняемый файл STM8uLoader.exe (без аргументов командной строки работать не будет) ;

- пакетный файл STM8uLoader.bat для запуска исполняемого файла и передачи ему аргументов командной строки ;

- файл прошивки микроконтроллера, поддерживаются форматы IntelHEX (расширение файла ".hex") и MotorolaS19 (расширение файла ".s19").

Первый аргумент командной строки обязательный - название файла прошивки, содержимое которого будет записано в микроконтроллер.

Второй аргумент командной строки необязательный - адрес передачи управления прикладной программе при копировании прикладной программы в оперативную память, при этом время жизни такой программы до нажатии кнопки сброса на плате STM8. Этот аргумент командной строки имеет смысл использовать если необходимо частое изменение кода прикладной программы и запуск ею напрямую в памяти RAM. При этом не расходуются циклы перезаписи FLASH и EEPROM памяти (~10000 и ~300000 циклов соответственно, а для некоторых моделей STM8 ~100 и ~100000 циклов соответственно).

Пример содержимого пакетного файла STM8uLoader.bat (название пакетного файла может быть произвольным, обязательно только расширени файла):

 

STM8uLoader main_rev25.s19 0100
pause

 

Здесь в первой строке по порядку название исполняемого файла (можно без расширения ".exe"), далее первый аргумент командной строки - название файла прошивки с сответствующим расширением (".hex" или ".s19", в будущем планируется поддержка выходного файла линковщика с расширением ".cod") и необязательный аргумент командной строки - адрес передачи управления (четыре шестнадцатеричные цифры без пробелов).

Собираем все файлы в одну папку, запускаем пакетный файл, пакетный файл запускает исполняемый файл передает ему аргументы командной строки. После нажатия кнопки сброса на плате содержимое файла прошивки записывается в STM8 и передается управление прикладной программе записанной в память RAM (если ваш файл прошивки содержит код в области RAM и вы передали вторым аргументом командной строки адрес вызова этого кода). При повторном нажатии кнопки сброса на ~0,2 секунды управление передается загрузчику boot_uC который:

- передает управление программе во FLASH памяти по адресу расположенному в ячейках $9FFE:$9FFF (для версии загрузчика $14) или $4831:$4832 (для версии загрузчика $25) если этот адрес более $8000;

- если в указанных ячейках вы записали значение адреса менее $8000, то загрузчик копирует содержимое EEPROM памяти (адреса $4000...$427F) в оперативную память RAM (адреса $0000...$027F) и передает управление по адресу $0000 в памяти RAM.

 

Рассмотрим варианты подробнее.

 

Вам надо часто вносить исправления в код и быстро проверять результат. Вам жалко для этого расходовать ограниченные циклы перезаписи памяти EEPROM, а тем более FLASH. Вы для этого готовы мириться с тем, что время жизни вашей программы ограничено очередным нажатием кнопки сброса и выключением питания. Просто пишем код в оперативную память:

 

stm8/

    TITLE “yourFile.asm”
    MOTOROLA

    BYTES
    segment byte at 0000-003F 'ram0'
; здесь расположим переменные
    dc.b   $17, $31

    WORDS
    segment byte at 0040 'main_ram'
; хотим, чтобы программа начиналась с адреса $0040
main_ram_cycle:
; включаем светодиод	
    bset   PB_DDR,#5 
    bset   PB_CR1,#5 
; что-то делаем
; выключаем светодиод	
    bres   PB_DDR,#5
    bres   PB_CR1,#5
    jp     main_ram_cycle
    end
; “yourFile.asm”

 

И запускаем пакетный файл со следующим содержимым:

 

STM8uLoader yourFile.hex 0040

 

 

Ваша пограмма готова. Вы хотите поместить ее в память FLASH, чтобы она продолжала работать и после выключения/включения питания, нажатия кнопки сброса. Вообщем обычный классический вариант как у других микроконтроллеров. Здесь надо учитывать версию загрузчика.

 

Каркас исходного файла для версии загрузчика $14:

 

stm8/
; for boot_uC rev.14
    TITLE “yourFile.asm”
    MOTOROLA

; адреса $8000...$8003 заняты загрузчиком
; в распоряжении прикладной программы адреса $8004...$9FEF
    WORDS
    segment byte at 8004-807F 'int_vector'
; здесь расположим таблицу векторов
; вектор "Reset" перехвачен начальным загрузчиком 
	dc.l {$82000000+NonHandledInterrupt}	; trap
	dc.l {$82000000+NonHandledInterrupt}	; irq0
	dc.l {$82000000+NonHandledInterrupt}	; irq1
;
	dc.l {$82000000+NonHandledInterrupt}	; irq28
	dc.l {$82000000+NonHandledInterrupt}	; irq29


    WORDS
    segment byte at 8080-9FEF 'main_flash'
; хотим, чтобы программа начиналась с адреса $8080
main_ram_cycle:
; включаем светодиод	
    bset   PB_DDR,#5 
    bset   PB_CR1,#5 
	
; что-то делаем

; выключаем светодиод	
    bres   PB_DDR,#5
    bres   PB_CR1,#5
    jp     main_ram_cycle
	
	
	interrupt NonHandledInterrupt
NonHandledInterrupt.l
	iret
	
; адреса $9FF0...$9FFD заняты загрузчиком
	
; здесь мы должны положить адрес (в данном случае $8080)
; по которому передаст управление начальный загрузчик
   segment byte at 9FFE-9FFF 'start_address'
   dc.w    $8080
   
    end
; “yourFile.asm”

 

Каркас исходного файла для версии загрузчика $25:

 

stm8/
; for boot_uC rev.25
    TITLE “yourFile.asm”
    MOTOROLA
	
; здесь мы должны положить адрес (в данном случае $8080)
; по которому передаст управление начальный загрузчик
   segment byte at 4831-4832 'start_address'
   dc.w    $8080

; адреса $8000...$8003 заняты загрузчиком
; в распоряжении прикладной программы адреса $8004...$9FF1
    WORDS
    segment byte at 8004-807F 'int_vector'
; здесь расположим таблицу векторов
; вектор "Reset" перехвачен начальным загрузчиком 
	dc.l {$82000000+NonHandledInterrupt}	; trap
	dc.l {$82000000+NonHandledInterrupt}	; irq0
	dc.l {$82000000+NonHandledInterrupt}	; irq1
;
	dc.l {$82000000+NonHandledInterrupt}	; irq28
	dc.l {$82000000+NonHandledInterrupt}	; irq29


    WORDS
    segment byte at 8080-9FEF 'main_flash'
; хотим, чтобы программа начиналась с адреса $8080
main_ram_cycle:
; включаем светодиод	
    bset   PB_DDR,#5 
    bset   PB_CR1,#5 
	
; что-то делаем

; выключаем светодиод	
    bres   PB_DDR,#5
    bres   PB_CR1,#5
    jp     main_ram_cycle
	
	
	interrupt NonHandledInterrupt
NonHandledInterrupt.l
	iret
	
; адреса $9FF2...$9FFF заняты загрузчиком
	
    end
; “yourFile.asm”

 

Соответствующее содержимое пакетного файла (достаточно только названия файла прошивки):

 

STM8uLoader yourFile.s19

 

 

Ваша пограмма рсположена во FLASH памяти и вам не хватает места. Вы хотите чтобы она продолжала работать и после выключения/включения питания, нажатия кнопки сброса. Предлагаю вам "украсть" 640 байт (для STM8S103F3) у памяти EEPROM.

Достаточно в ячейки памяти $9FFE:$9FFF (для версии загрузчика $14) или $4831:$4832 (для версии загрузчика $25) положить содержимое менее $8000 (лучше $0000 для будущей совместимости). Тогда при каждом выключении/включении питания или нажатии кнопки сброса на плате STM8 начальный загрузчик скопирует все содержимое EEPROM памяти (адреса $4000...$427F для STM8103F3) в оперативную память RAM (адреса $0000...$027F) и передаcт управление в память RAM по адресу $0000 (что соответствует адресу $4000 исходного образа в памяти EEPROM. Необходимо только не забывать, что при выполнении кода из памяти RAM конвеер загружается через 8 разрядную шину, а при выполнении кода из памяти FLASH конвеер загружается через 32 разрядную шину. Поэтому "медленный" код располагайте в EEPROM памяти, а код критичный к скорости выполнения располагайте во FLASH памяти.

 

Каркас исходного файла для версии загрузчика $14:

 

stm8/
; for boot_uC rev.14
    TITLE “yourFile.asm”
    MOTOROLA

    WORDS
    segment byte at 4000-427F 'main_eeprom'
; хотим мы этого или не хотим, но
; программе придется начинаться с адреса $0000
main_ram_cycle:
; включаем светодиод	
    bset   PB_DDR,#5 
    bset   PB_CR1,#5 
	
; что-то делаем

; выключаем светодиод	
    bres   PB_DDR,#5
    bres   PB_CR1,#5
    jp     main_ram_cycle
	
	interrupt NonHandledInterrupt
NonHandledInterrupt.l
	iret
	

; адреса $8000...$8003 заняты загрузчиком
; в распоряжении прикладной программы адреса $8004...$9FEF
    WORDS
    segment byte at 8004-807F 'int_vector'
; здесь расположим таблицу векторов
; вектор "Reset" перехвачен начальным загрузчиком 
	dc.l {$82000000+NonHandledInterrupt}	; trap
	dc.l {$82000000+NonHandledInterrupt}	; irq0
	dc.l {$82000000+NonHandledInterrupt}	; irq1
;
	dc.l {$82000000+NonHandledInterrupt}	; irq28
	dc.l {$82000000+NonHandledInterrupt}	; irq29


	
; адреса $9FF0...$9FFD заняты загрузчиком
	
; здесь мы должны положить адрес (в данном случае $0000)
; по которому передаст управление начальный загрузчик
   segment byte at 9FFE-9FFF 'start_address'
   dc.w    $0000
   
    end
; “yourFile.asm”

 

Каркас исходного файла для версии загрузчика $25:

 

stm8/
; for boot_uC rev.25
    TITLE “yourFile.asm”
    MOTOROLA
	
	
    WORDS
    segment byte at 4000-427F 'main_eeprom'
; хотим мы этого или не хотим, но
; программе придется начинаться с адреса $0000
main_ram_cycle:
; включаем светодиод	
    bset   PB_DDR,#5 
    bset   PB_CR1,#5 
	
; что-то делаем

; выключаем светодиод	
    bres   PB_DDR,#5
    bres   PB_CR1,#5
    jp     main_ram_cycle
	
	interrupt NonHandledInterrupt
NonHandledInterrupt.l
	iret
	
	
; здесь мы должны положить адрес (в данном случае $0000)
; по которому передаст управление начальный загрузчик
   segment byte at 4831-4832 'start_address'
   dc.w    $0000

; адреса $8000...$8003 заняты загрузчиком
; в распоряжении прикладной программы адреса $8004...$9FF1
    WORDS
    segment byte at 8004-807F 'int_vector'
; здесь расположим таблицу векторов
; вектор "Reset" перехвачен начальным загрузчиком 
	dc.l {$82000000+NonHandledInterrupt}	; trap
	dc.l {$82000000+NonHandledInterrupt}	; irq0
	dc.l {$82000000+NonHandledInterrupt}	; irq1
;
	dc.l {$82000000+NonHandledInterrupt}	; irq28
	dc.l {$82000000+NonHandledInterrupt}	; irq29

; адреса $9FF2...$9FFF заняты загрузчиком
	
    end
; “yourFile.asm”

 

Соответствующее содержимое пакетного файла (достаточно только названия файла прошивки):

 

STM8uLoader yourFile.s19

 

 

Возможны также комбинированные варианты. Например в файле прошивке [STM8uLoader.exe] программа расположена и в памяти RAM и в памяти EEPROM и в памяти FLASH. Как только загрузчик перенесет код в STM8 начнет выполняться программа расположенная в памяти RAM. После сброса запускается программа во FLASH или программа в RAM замещается образом из EEPROM.

 

Еща раз ссылка на последнюю версию загрузчика [STM8uLoader.exe] .

 

Все вопросы, пожелания предложения в e-mail внизу страницы.

[Оглавление.] [Требования к загрузчику. (Статья 1)]