Ця сторінка виглядає краще якщо JavaScript працює

STM8

 ·   ·  ☕ 5 хв читати

Ще один 8 бітний вечір

Нині важко когось здивувати тим що ти вмієш поводитись з контролерами AVR. Курсів, що пропонують вивчити Arduino стільки що всі й не порахувати. Пропонуються різні модифікації плат. Але їх поєднує одне… ЇХ називають просто Arduino.

Вже навіть дітей вчать програмувати на цій платі…

А на ринку праці вимагають, щоб розробник знався з кристалами STM.

Сьогодні вечір дорослішання.

Підготовка

Для програмування нам потрібно: плата, комп’ютер, та копілятор.

Почну я з останнього. З копілятора… А згодом пошукаю у коробці “естемку”

SDCC

Заванатажуємо та встановлюємо

Для компіляції програм для цього камінця я буду(так в мережі рекомендують) використовувати компілятор sdcc (Small Device C Compiler). Це колекція компіляторів для мови ANSI C для великої кількості архітектур одна з яких восьмимітний STM. Є версії для різних ОСей. Я буду використовувати версію для linux. Тож завантажуємо архів з необхідною версією з http://sdcc.sourceforge.net/

Відкриваємо термінал вводимо наступні команди

1
2
3
mkdir  tmp 
cd tmp
tar xjf ../sdcc-4.4.0-rc2-amd64-unknown-linux2.5.tar.bz2

В результаті таких дій ми отримаємо розпаковані файли. В мене розпакований каталог з іменем sdcc-4.4.0-rc2, а у вас він може відрізнятися. Крокуємо далі…

1
2
cd sdcc-4.4.0-rc2
ls

Ми перейшли до каталогу з компіляторами які скачали

1
rm *.txt

Видаляємо зайві файли, які в системі не потрібні. Ви ж не забули проглянути вміст файлів які ми тільки що видалили? Ні. Пізно 😄…

Продовжуємо інсталяцію.

Важливо!!! Тепер нам знадобляться права суперкористувача. Якщо нам потрібно виконати команду від імені root:

1
sudo cp -r * /usr/local

І вводимо пароль

Перевіримо чи працює

Тепер перевіримо чи працює

1
/usr/local/bin/sdcc -v 

Програма відгукнулась мені

SDCC : mcs51/z80/z180/r2k/r2ka/r3ka/sm83/tlcs90/ez80_z80/z80n/r800/ds390/pic16/pic14/TININative/ds400/hc08/s08/stm8/pdk13/pdk14/pdk15/mos6502/mos65c02 TD- 4.4.0 #14579 (Linux)
published under GNU General Public License (GPL)

ми бачимо перелік всього що ми можемо запрограмувати цим компілятором

Ще один тест. Кличу прогу без повного шляху

1
sdcc -v

Програма успішно відгукується так само

Пограємось з компілятором

Хочу погратись з компілятором таким чином. Подразнити його. В якому форматі він мене матюкати буде?

Створюю порожній файл stm8.cpp і згодовою його компілятору

1
sdcc stm.cpp

Отримую перший матюк error 119: don't know what to do with file 'stm.cpp'. file extension unsupported. Ми не можемо програмувати мовю C++. (Мій наставник говорив: “Якщо знаєш С++, ти автоматично знаєш чистий Сі. Віримо і йдемо далі.)

Створємо c-файл і повторюємо. Посилаємо новий файл компілятору. Отримуємо нові повідомлення:

stm.c:1: warning 190: ISO C forbids an empty translation unit
stm.c:1: error 74: function 'main' undefined

Змінюю файл stm.c надаючи такого вигляду

1
void main(void){};

А ще карще почитаємо інструкцію

STM8FLASH

Завантажуємо та встановлюємо

Для завантаження програми на мікроконтроллер нам знадобиться окрім програматора утиліта stm8flash. Для операційних систем віндовс є готові виконувані файли цієї утиліти. А я на шастя не користутюсь операційною системою віндовс. Я буду збирати цю утиліту з джерельного коду, який доступний на GitHub за посиланням https://github.com/vdudouyt/stm8flash

Для збирання за моєю інструкцією потрібно виконати наступні дії

1
2
3
4
5
6
7
8
sudo apt-get update
sudo apt-get install -y pkg-config libusb-1.0-0-dev git make
mkdir ~/stm8_flash
cd ~/stm8_flash
git clone git@github.com:vdudouyt/stm8flash.git
cd stm8flash
make
sudo make install

Коротока перевірка

1
stm8flash -V

В мене програма відгукнулас так:

20170616-1.1

Знайомство з платою

STM8L-DISCOVERY

Я колись давно придбав собі плату STM8L-DISCOVERY з якої хотів почати своє самостійне знайомство з контролерами STM. Нарешті настав її час.

STM8L-DISCOVERY зібрана на базі мікроконтролера STM8L152C6T6 і має вбудований інтерфейс відлагодження ST-Link, рідкокристалічний дисплей, користувацьку кнопку та світлодіод.

Сам мікроконтролер наділений 32KB Flash, 2KB оперативної пам’яті та 1KB енергонезалежної пам’яті. Може працювати при напрузі джерала живлення від 1.8V до 3.6V працюючи на частоті 16MHz і маючи при цьому 5 варіантів роботи в режимі енергозбереження. Виробники запхнули в нього 12 бітний цифроан-алоговий перетворювач та 12 бітний 25 канальний аналогово-цифровий перетворювач з можливістю робити 1M замірів за секунду.

Про всі інші можливості можна дізнатися з даташиту на мікроконтреллери STM8L151x4, STM8L151x6,STM8L152x4, STM8L152x6

Ось ще корисна інформація про плату розробки

  1. STM8L ultralow power Discovery
  2. STM8L-DISCOVERY
  3. STM8L-DISCOVERY schematics
  4. StdPeriph_Driver
  5. st.com

Pin-control

Основана робота з портами введення виведння ведеться через п’ять регістрів на кожен порт. Ось вони

  • Px_ODR - Port x output data register. Регістр для виведення даних(аналог PORTx у AVRках). Якщо порт сконфігкрований на вихід, то запис в цей порт змінить електичний стан відповідної ніжки чіпа
  • Px_IDR - Port x input data register. Регістр читання даних (PINx у AVRках)
  • Px_DDR - Port x data direcrion register. Регістр визначає напрямок роботи порту. При низькому рівні в цьому регістрі, відповідний пін налаштований на вхід.
  • Px_CR1 - Port x control register 1. Електричні властивості порту. Якщо пін налаштований на вхід запис 1 в цей регіст вмикає pull_up резистор в середині чіпа інакше вивід отримує Z стан (плаваючий). Якщо пін налаштваний на вихід то 1 в цьому регістрі вмикає push-pull режим, інакше ніжка працює як відкритий колектор.
  • Px_CR2 - Port x control register 2. Якщо пін налаштовано на вхід 1 дозволяє генерацію зовнішнього переривання на піні, інакше таке заборонено. Якщо пін працює на виввід то запис 1 обмежує швидкість перемикання піна до 10 MHz, інакше - 2 MHz.

Дрик-Дрик ножкою

Спробуємо подригати ніжкою мікрокоторлеру.

В нас на платі є два користувацькі світлодіоди які через резистори піж’єднані до портів PE7 та PC7. Спробуємо увімкнути їх.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
// Для потру C
#define PC_ODR    (*(volatile unsigned char *)0x500A)
#define PC_DDR    (*(volatile unsigned char *)0x500C)
#define PC_CR1    (*(volatile unsigned char *)0x500D)

// Для порту E
#define PE_ODR    (*(volatile unsigned char *)0x5014)
#define PE_DDR    (*(volatile unsigned char *)0x5016)
#define PE_CR1    (*(volatile unsigned char *)0x5017)

void main(void){
    PC_DDR=0b10000000; // на вихід
    PC_CR1=0b10000000; // пуш-пул
    PC_ODR=0b10000000; // подаємо сигнал
    PE_DDR=0b10000000;
    PE_CR1=0b10000000;
    PE_ODR=0b10000000;
    for(;;);// Більше нічого не робимо
}

Компілюємо файл

1
sdcc -mstm8 --std-c23 ./stm8.c  

Запихаємо у нашу плату

1
stm8flash -c stlinkv2 -p stm8l152c6t6 -w stm8.ihx

Урра! Наші світлодіоди горять! Тобто світяться 😄

А як щодо помигати світлодіодами?

Препишемо трошки код

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#define PC_ODR    (*(volatile unsigned char *)0x500A)
#define PC_DDR    (*(volatile unsigned char *)0x500C)
#define PC_CR1    (*(volatile unsigned char *)0x500D)

#define PE_ODR    (*(volatile unsigned char *)0x5014)
#define PE_DDR    (*(volatile unsigned char *)0x5016)
#define PE_CR1    (*(volatile unsigned char *)0x5017)

const auto DELAY=0xFFFF;

void main(void){
    // конфігуруємо порти
    PC_DDR=0b10000000; 
    PC_CR1=0b10000000;

    PE_DDR=0b10000000;
    PE_CR1=0b10000000;
    // буде мигати без конкретного часу 
    // таймерів ще не знаємо тому через 
    // делай
    long delay;
    for(;;){
        delay=DELAY;
      PC_ODR=0b10000000;
      PE_ODR=0b00000000;
      while(--delay){}
      delay=DELAY;
      PC_ODR=0b00000000;
      PE_ODR=0b10000000;  
      while(--delay){}
    };
}
Поширити в
Підтримайте автора

Sam4uk
НАПИСАВ
Sam4uk
Embedded Software Engineare C/C++