Stm8s discovery как программировать
Перейти к содержимому

Stm8s discovery как программировать

  • автор:

Stm8s discovery как программировать

Текущее время: Сб мар 09, 2024 17:52:48

Часовой пояс: UTC + 3 часа

Запрошенной темы не существует.

Часовой пояс: UTC + 3 часа

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y

Работоспособность сайта проверена в браузерах:
IE8.0, Opera 9.0, Netscape Navigator 7.0, Mozilla Firefox 5.0
Адаптирован для работы при разрешениях экрана от 1280х1024 и выше.
При меньших разрешениях возможно появление горизонтальной прокрутки.
По всем вопросам обращайтесь к Коту: kot@radiokot.ru
©2005-2024

STM8S-Discovery, первый опыт программирования.

Сразу скажу, что не претендую на спеца в области программирования, если честно, то уровень ниже плинтуса.
Но хочется сделать что-нибудь своими руками, мозгами, ну и восполнить пробел в области программирования.
Мозги уже не как в молодости, но ещё не заржавели).
Всю жизнь возился только с железом и мне проще понять как работает программа по примерам.
Очень просто и доходчиво пишет addelectronics, его статьи и сподвигли меня взяться за микроконтроллеры.
Выбор остановил на отладочной плате STM8S-Discovery и среды программирования IAR (IAR Embedded Workbench IDE).
Уроки по основам и т.п. найдёте у addelectronics
И так, «Hello светодиод» прошёл на ура, надо что то посложнее, вот тут то и выяснилось, что мне ещё «Учиться, учиться и учиться» как говаривал дедушка Ленин (кстати, слизал он лозунг у буддистов).
Чтобы совместить полезное с приятным было решено сделать устройство ШИМ регулятор вентилятора охлаждения с индикацией температуры по датчику.

Первый этап — это индикация, опыт мигания светодиодом есть уже)))

Принцип работы устройства на STM8S будет такой:
— Напряжение с датчика температуры прямо пропорционально меняет сигнал ШИМ от 0% до 100% и индикацию от 1 до, например, 8 светодиодов.
Вот таблица зависимости выходного напряжения от температуры с ДТ инжекторного авто ВАЗ-2109.

Исходя от эти данных и будем «плясать».
R1 = 2150 Ohms
R2 = 177 Ohms +100C
U in = 5 Volts
U out = 0,38 Volts
———————————-
R1 = 2150 Ohms
R2 = 241 Ohms +90C
U in = 5 Volts
U out = 0,50 Volts
———————————-
R1 = 2150 Ohms
R2 = 332 Ohms
U in = 5 Volts +80C
U out = 0,67 Volts
———————————-
R1 = 2150 Ohms
R2 = 467 Ohms +70C
U in = 5 Volts
U out = 0,89 Volts
———————————-
R1 = 2150 Ohms
R2 = 667 Ohms +60C
U in = 5 Volts
U out = 1,18 Volts
———————————-
R1 = 2150 Ohms
R2 = 973 Ohms +50C
U in = 5 Volts
U out = 1,56 Volts
———————————-
R1 = 2150 Ohms
R2 = 1188 Ohms +45C
U in = 5 Volts
U out = 1,78 Volts
———————————-
R1 = 2150 Ohms
R2 = 1459 Ohms +40C
U in = 5 Volts
U out = 2,02 Volts
———————————-
R1 = 2150 Ohms
R2 = 1802 Ohms +35C
U in = 5 Volts
U out = 2,28 Volts
———————————-
R1 = 2150 Ohms
R2 = 2238 Ohms
U in = 5 Volts
U out = 2,55 Volts
———————————-
R1 = 2150 Ohms
R2 = 2796 Ohms
2,83 Volts

Так как сигнал с датчика аналоговый, то используем возможности STM8S как АЦП.
Здесь описан принцип работы АЦП на четыре разряда
Displaying variable voltage on a bar of LEDs using STM8S-DISCOVERY (AN3280)

Пришлось повозить чтобы заставить работать не 4, а 8 индикаторов и загорания всех светодиодов не при максимальном вх. напряжении, а при уменьшении входного напряжения, ведь у нас с увеличением температуры, напряжение с ДТ уменьшается.
В результате получилась вот такаой кусок программы, можете сравнить с докой AN3280 с сайта ST:

#include «stm8s.h» // file needed only for registers mask
#include «parameter.h»
/**
* addtogroup ADC1_Example1
* @*/

#define ALL_LEDs ((u8)0xff) // LEDs mask

#define switch_all_LEDs_on < GPIOB->ODR|= ALL_LEDs; > //LEDs control : all on
#define switch_all_LEDs_off < GPIOB->ODR&=~ALL_LEDs; > //LEDs control : all off

/* Private variables ———————————————————*/
u8 temp_AD_H; // temporary registers for reading ADC result (MSB)
u8 temp_AD_L; // temporary registers for reading ADC result (LSB)
u8 ADInit; // flag for ADC initialized
u8 ADSampRdy; // flag for filed of samples ready
u8 AD_samp; // counter of stored samples
u16 AD_sample[NUMB_SAMP]; // store samples field
u16 AD_avg_value; // average of ADC result

u8 peak_memo; // variables for peak level detector
u8 peak_filt; // variables for peak level detector*/

/* Private function prototypes ————————————————*/
/**
* brief Count average of samples stored in the u16 field
* par Parameters:
* *p: pointer to the begin of the field
* smp: number of samples in the field
* retval Average u16 value
*/
u16 u16_average(u16 *p, u8 smp) u8 i;
u16 sum;

for(i=0, sum= 0; i < smp; ++i)
sum+= *p++;
return sum / smp;
>
/* ————————————————————————— */
/**
* brief Prepare data for four LED bar of signal and peak indicator
* par Parameters:
* val: Level of the mesured signal [0-5]
* retval 4 bits (low nibble) of the composite bar graph information
*/
u8 signal_and_peak_level(u8 val) u8 signal;
u8 peak;

case 0: peak= 0x80; signal= 255; break;
case 1: peak= 0x40; signal= 127; break;
case 2: peak= 0x20; signal= 63; break;
case 3: peak= 0x10; signal= 31; break;
case 4: peak= 8; signal= 15; break;
case 5: peak= 4; signal= 7; break;
case 6: peak= 2; signal= 3; break;
case 7: peak= 1; signal= 1; break;
case 8: peak= 0; signal= 0; break;
default: peak= signal= 255;

>;
if(peak_filt == 0) < // slow fall of peak level indicator
if(peak_memo) peak_memo>>= 1;
peak_filt= PEAK_FILTER;
>;
>
else
—peak_filt;
if(peak >= peak_memo) < // check the highest level value
peak_memo= peak; // and copy it to peak indicator
peak_filt= PEAK_FILTER; // with fall speed refresh
>;
return (signal | peak_memo); // return bar graph information
>

/* Public functions ———————————————————-*/
/**
* brief Validation firmware main entry point.
* par Parameters:
* None
* retval void None
*/
void main(void) u8 leds;
// *** GPIO INIT ***
GPIOB->ODR&=~ALL_LEDs; // LEDs — as push-pull outputs, all off
GPIOB->DDR|= ALL_LEDs; //
GPIOB->CR1|= ALL_LEDs;

GPIOC->DDR|= 0x02; // PC.1 as push-pull outputs
GPIOC->CR1|= 0x02;

GPIOE->CR1&=~0x40; // PE.6 as a floating input
GPIOE->DDR&=~0x40;

// *** ADC INITIALIZATION ***
TIM1->ARRH= (u8)(AUTORELOAD >> 8); // set autoreload register for trigger period
TIM1->ARRL= (u8)(AUTORELOAD); //
TIM1->CCR1H= (u8)((AUTORELOAD-AD_STAB) >> 8); // set compare register for trigger period
TIM1->CCR1L= (u8)(AUTORELOAD-AD_STAB);
TIM1->CR1|= TIM1_CR1_ARPE; // auto reload register is buferred

TIM1->CR2= (4<<4) & TIM1_CR2_MMS; // CC1REF is used as TRGO
TIM1->CCMR1= (6<<4) & TIM1_CCMR_OCM; // CC1REF in PWM 1 mode
TIM1->IER|= TIM1_IER_CC1IE; // CC1 interrupt enable
TIM1->CCER1|= TIM1_CCER1_CC1P; // CC1 negative polarity
TIM1->CCER1|= TIM1_CCER1_CC1E; // CC1 output enable
TIM1->BKR|= TIM1_BKR_MOE;

TIM1->SMCR|= TIM1_SMCR_MSM; // synchronization of TRGO with ADC

TIM1->CR1|= TIM1_CR1_CEN; // timer 1 enable

ADC1->CSR= ADC1_CSR_EOCIE | (9 & ADC1_CSR_CH); // ADC EOC interrupt enable, channel 9
ADC1->CR1= 4ADC1->CR2= ADC1_CR2_EXTTRIG; // external trigger on timer 1 TRGO, left alignment
ADC1->TDRH= 2; // disable Schmitt trigger on AD input 9
ADC1->TDRL= 0; //

// init ADC variables
AD_samp= 0; // number of stored samples 0
ADInit= TRUE; // ADC initialized
ADSampRdy= FALSE; // No sample

ADC1->CR1|= ADC1_CR1_ADON; // ADC on

enableInterrupts(); // enable all interrupts

// *** MAIN LOOP ***
while (1) if (ADSampRdy == TRUE) < // field of ADC samples is ready?
AD_avg_value= u16_average(&AD_sample[0], AD_samp); // average of samples

AD_samp= 0; // reinitalize ADC variables
ADSampRdy= FALSE;

leds= signal_and_peak_level((u8)((AD_avg_value + 64) / 128)); // setting LED status

Видео как бонус)

Пока всё, буду дополнять по мере продвижения…

Изучаем STM8S Медленный старт. Часть 0

МК семейства STM8S относительно STM8L/32 имеет меньший арсенал периферии, но позволяет без лишних усложнений разобраться с основами и получить необходимые навыки для работы с его старшими братьями.

0. На кого ориентирован материал, зачем и почему

При написании данной статьи, я предполагаю, что читающий умеет:

  • Внимательно читать (что редкость)
  • Немного работать с англоязычной технической литературой (ну или мотивацию научиться, т.к. первый язык программиста — английский)
  • Паять (хотя бы минимальные навыки)
  • Программировать на С (опять же, не все так сложно)
  • Гуглить (без этого никуда)
  • Пользоваться мультиметром и имеет прочие базовые навыки (по типу «не суй пальцы в розетку»)
  • Обзорно пробежать все этапы разработки системы на базе микроконтроллера
  • Дать необходимые вводные для человека практически не посвященного
  • По возможности формирование у читающего понимания того, где, что и как найти

(Не существенно)

Думаю имеет смысл сделать подробный курс программирования МК.

Мне послужит поводом изучить всю периферию более детально и попутно поможет другим.
Знаю, что уже существует огромное количество статей и даже обучающих курсов, но я имею слегка иной подход. (Возможно получу адекватную критику, изменю мнение и примкну к MX Cube ребятам).

Грустно видеть, как stm контроллеры превращают в arduino.

По поводу arduino:

Есть 3 (известных мне, мб я просто не дорос) подхода к разработке ПО на МК:

  1. Разработка на ассемблере
  2. Разработка под конкретную модель МК
  3. Разработка с использованием HAL и им подобных библиотек

2) Библиотеки HAL и т.п. для начинающего непрозрачна и слишком много моментов «просто пиши вот так». Потому — тоже в помойку.

3) Наиболее здоровым вариантом для начинающего считаю процесс создания ПО под конкретный МК, полученные навыки позволят разобраться и с 8L и 32 сериями (хоть это и больно делать единолично по документации).

Вы наверно заметили, что arduino в этом списке не фигурирует, потому что это образовательная платформа и для разработки на её базе компактных устройств не предназначена. Но подход к её программированию по какой-то (мне не известной) причине переносится и расползается по интернету. И даже применяется в реальных коммерческих проектах. (представляет собой, «скачал на форуме библиотеку, подключил, заработало, как работает не знаю»).

Я же предлагаю, с моей точки зрения, академически и методически более осмысленный подход.

1. Выбор микроконтроллера

У меня в наличии имеется несколько STM8S105K6 в корпусе LQFP32, он из этого семейства, потому выбираю его.

Вы можете выбрать любой МК в пределах серии.

Есть готовые Discovery платы от ST, можно купить у китайцев или заказать с других ресурсов. Есть готовые платы на STM8S103F3P6 и ей подобные от китайцев.

Но, следует учесть, что готовые платы предназначены для обучения.

На сайте производителя st.com, находим свой МК и скачиваем к нему документы:

Reference manual: RM0016 — общий документ для всех МК семейств STM8S и STM8AF. Далее RM.
Datasheet: У меня DS5855 — документ к моделям STM8S105C4/6, STM8S105K4/6 и STM8S105S4/6. Далее DS.

Из вкусного у него (поверхностно):

  • Поддержка 16 МГц
  • 32 Кб Flash памяти, 1 Кб EEPROM и 2Кб RAM
  • Питание 2.95-5.5В
  • 8-и 16-битные таймеры
  • UART, SPI, I2C
  • 10-битный АЦП
  • до 38 дискретных входов/выходов

2. Необходимое оборудование

Я вижу два варианта работы с МК:

Сборка макета из отдельных компонентов

Здорово, классно, мне нравится. Так делают многие люди.

В этом случае для МК нужна будет так называемая обвязка. План простой:

  1. Берем макетную плату, в моем случае TQFP(32-64PIN)0.8MM, запаиваем на неё МК
  2. Берем двухрядную гребенку PLS-2×40 припаиваем к отверстиям, которые ведут к выводам МК
  3. Берем печатную макетную плату (у меня 9х15 см) и припаиваем на нее прошлый бутерброд
  4. Смотрим RM пункт 7. Power supply, читаем. Написано нужен конденсатор соединяющий вывод VCAP и наши 0В источника питания. Еще написано, что подробней в смотреть нужно в DS к конкретному МК в секции electical characteristics. Для меня это пункт 10.3.1 VCAP external capasitor со ссылкой на Table 18 где и указан номинал 470 — 3300 нФ. Я взял 1 мФ (на схеме C3). (для чего он нужен, надеюсь, почитаете сами в RM)
  5. Там же в DS в пункте 10.3.8. Reset pin characteristics находим номинал конденсатора 0.1мФ(на схеме C4). Резистор R4 номиналом 10 КОм используют в отладочных платах и различных application note, хотя внутри МК уже есть подтягивающий резистор номиналом от 30 до 80 КОм (если верить тому же DS). Параллельно конденсатору C4 ставим нашу кнопку сброса. Такую схему сброса можно увидеть например в Desighn note DN0005.
  6. Также, ST любят добавлять на отладочные платы конденсаторы по питанию на 100нФ, в количестве N выводов подключенных к питанию +1. На схеме нарисовано всего C1, C2 и C5 3 шт, и на плату я их не паял, но смысл вы поняли. На столе работать будет и без них, а в реальной коммерческой разработке лучше этим делом озаботиться при разведении платы устройства.
  7. Распаять SWIM разъем программирования (я делаю из PLS-1×40)

Покупка готовой платы (что не избавляет от работы паяльником)

Здорово, классно, мне нравится. Так делают многие люди.

Стоит ознакомиться с конфигурацией платы, если это плата от ST, то она сразу с программатором и подключается USB type B кабелем. На сайте ST будет схема на странице продукта. На плате будут кнопки, светодиоды, пищалки, ёмкостные кнопки и прочие прелести с которыми можно поиграться.

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

Шелкографии названий выводов лучше не верить и перепроверить сравнив с DS.

Плюс нужен программатор, у меня китайский ST-Link V2. Умеет программировать и STM8 и STM32.

3. Выбор IDE

Для меня вопрос выбора пока не актуален, работаю в IAR для STM8, ибо в ней делали проект над которым я сейчас работаю, по той же причине старая версия.

Идем на сайт iar.com, в поиске набираем модель своего МК.
Скачиваем IAR Embedded Workbench for STM8, выбираем при установке size-limited evaluation и миримся с ограничением в 8 Кб кода. Или покупаем. Есть на запрещенных на территории РФ ресурсах взломанные версии, но для коммерческих проектов не годится.

Инструкция по установке есть в самом установщике либо в гугле.
Я использую версию 6.5.3.2581.
Устанавливаем среду, вместе с ней драйвера на программатор.

4. Создание проекта

Заходим в IDE, идем Project -> Create new project -> C++

Жмем OK, выбираем директорию (желательно не имеющую кириллицы и пробелов), выбираем имя (без пробелов и кириллицы).

Идем в корневую папку своей IDE и находим папку inc, для меня путь:

C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\stm8\inc

Находим среди заголовочных файлов iostm8 свою модель МК, для меня:

iostm8s105k6.h

Подключаем её в самом начале и добавляем бесконечный цикл.

Результат:

#include //Заголовочный файл int main() < while(1)< //Бесконечный цикл >return 0; > 

В меню Project -> Options -> General Options в графе Device выбираем свой МК.

В Project -> Options -> Debugger в графе Driver выбираем ST-LINK.

Находим на панели инструментов кнопку Download and Debug.
При первой компиляции среда попросит выбрать имя .eww файла. (Я называю так же как и проект.)

Внизу в окне Debug Log должны быть сообщения, что:

  • Preprocessor for STM8 — запустился препроцессор
  • Debugger for STM8 — запустился отладчик
  • Connected to STM8 SWIM Debugging system — произошло подключение к МК
  • Loaded debugee — произошла загрузка прошивки
  • Target reset — произошел сброс

Нажимаем Stop debugging, отладка прекращается, но МК питается от программатора и дальше выполняет программу, а именно крутит бесконечный цикл и делает ничего.

Итоги

Получился краткий обзор и вводная в программирование МК серии STM8S без самого программирования. Получилась только база для работы, с этого обычно все и начинается — со сборки макета.

Раскрывать тему подробней смысла не вижу.

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

Насколько выполнены цели судить можно будет по тому, получилось ли у начинающего что-то сделать самостоятельно, используя предложенную мной информацию. (индикатор окно Debug log)

Спасибо за внимание.

Embedder’s life

Для тех, кому лень читать целиком: В STM8S-DISCOVERY отлично заливается прошивка от ST-LINK/V2 и все работает.

Тех, кто хочет узнать, что довело меня до жизни такой, приглашаю под кат.

Несмотря на то, что я порядочный ретроград, прогресс таки докатился и до меня — в текущей разработке у меня будет стоять новый модный STM8S103F3P6 по причине выдающейся цены оного. А, кстати, о ретроградах…

Так вот, у меня возникла необходимость программировать STM8. Посему я достал с полки упомянутую в заголовке плату, сдул с нее пыль и попытался запрограммировать контроллер. Не вышло. Надо сказать, что у меня и до этого были проблемы с ST-LINK (V1), и тогда я даже нашел решение; тем не менее, сейчас не прокатило и это. Не знаю в чем дело, но факт — ST-LINK окончательно отказался работать на моей системе.

В общем, я задумался о том, как бы материализовать себе ST-LINK/V2. В принципе, такие программаторы у меня были на платах STM32-Discovery — но на отладках, как известно, стоит урезанная версия, которая может программировать только то семейство, для которого эта отладка предназначена. Купить — вариант понятный, но это надо еще из дома выходить, да и программатор мне был нужен вотпрямщас. Грустно блуждая по интернету, я в очередной раз наткнулся на человека, который сделал ST-LINK/V2 сам. Посмотрел я на это, посмотрел, и вдруг понял, что схема, приведенная в статье, совершенно не противоречит схеме программатора STM8S-DISCOVERY (стр. 16)! Собственно, в программаторе и там, и там канонично используется STM32F103C8T6, включение значимых ножек по схеме совпадает…

В общем, я запаял хедеры разъема JTAG’а программатора на STM8S-DISCOVERY и подключил к нему сигналы SWD (они находятся на тех же пинах, что и JTAG) от программатора с платы STM32-VLDISCOVERY, после чего с помощью STM32 ST-LINK Utility снял защиту, стер кристалл и залил бинарник прошивки, который взял из архива, скачанного по ссылке из той статьи, где человек самостоятельно собирал программатор. После подключения к компьютеру подопытный девайс определился как ST-LINK/V2. Далее я штатно обновил прошивку с помощью ST-LINK Upgrade Tool и в качестве теста попробовал подключиться к STM8S103F3P6 из STVP. Бинго! Все заработало!

Программировать STM32 через мой новый ST-LINK/V2 и использовать JTAG на нем я пока не пробовал, но, судя по схеме, это возможно через тот же самый выведенный порт JTAG’а.

Так что, если у кого-то есть STM8S-DISCOVERY с ST-LINK V1 и какая-нибудь из плат STM32-DISCOVERY, с помощью последней можно легко залить прошивку ST-LINK/V2 в первую и получить полноценный ST-LINK/V2.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *