Во первых нужна плата, содержащая требуемый микроконтроллер 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 внизу страницы.