Термометр на stm8l-discovery

Термометр на STM8L-Discovery

С полгода назад я приобрел платку STM8L-Discovery. К сожалению, на нашем сайте я не нашел простых схем для новичков. Сейчас я сам уже подразобрался во всём и хочу предложить вам интересную, на мой взгляд, поделку.

Хочу сказать сразу, что схема может быть перенесена и на другой контроллер (плата ведь у нас отладочная, не охота ее под один только девайс использовать). Для этой цели мы можем использовать отладачик нашей платы, далее я опишу процесс переноса прошивки.

Для тех, кто только начинает работать с STM, хочу сказать – все довольно просто. Для работы использую среду IAR embedded workbench.

Для начала разберемся с датчиком температуры. LM35 – аналоговый датчик, напряжение на выходе которого при 0 по Цельсию равно нулю, а далее возрастает на 10 мВ на градус. То есть напряжение в мВ делим на 10 и получаем температуру датчика.

Теперь разберемся, что такое динамическая индикация. Задача этого метода сократить количество проводов  при работе с несколькими разрядами.

Идея заключается в следующем: от каждого разряда выводы соответствующих сегментов собираются вместе, а общие от каждого разряда подключаются отдельно. Далее зажигание происходит следующим образом: подключаются нужные сегменты + общий вывод нужного разряда.

И так аналогично с каждым разрядом в цикле. При достаточно быстром переключении глаз не замечает мерцания и мы видим просто многоразрядное число.

Теперь переходим к самому интересному – к контроллеру. На нашей плате стоит МК STM8L152C6T6. Для работы устройства нам потребуется использование таймера и аналогово-цифрового преобразователя (АЦП).

Итак,  таймер нам необходим, чтобы переключать зажигаемые разряды. У нашего МК есть несколько таймеров, но я использую таймер 2 для простоты. Для подключения индикатора я использую порт В под сегменты и выводы 2 и 3 порта D для управления разрядами. Выбор основан на том, что выводы выведены на плате рядом друг с другом. Привожу код инициализации для индикации.

static int ind[2] = { 0xFF, 0xFF, }; char seg = 0; /*переключение разрядов и сегментов по таймеру*/ #pragma vector=TIM2_OVR_UIF_vector __interrupt void timer2_interrupt(void) { if( !seg ) { PB_ODR = ind[0]; PD_ODR_bit.ODR2 = 0; PD_ODR_bit.ODR3 = 1; seg = 1; } else { PB_ODR = ind[1]; PD_ODR_bit.ODR2 = 1; PD_ODR_bit.ODR3 = 0; seg = 0; } TIM2_SR1_bit.UIF = 0;
} void Init( char priority )
{ PB_DDR = 0xFF; PB_CR1 = 0xFF; PD_DDR_bit.DDR2 = 1; PD_DDR_bit.DDR3 = 1; PD_CR1_bit.C12 = 1; PD_CR1_bit.C13 = 1; CLK_PCKENR1_bit.PCKEN10 = 1; //тактирование подано TIM2_PSCR = 1;//предделитель частоты TIM2_ARRH = 0x07; TIM2_ARRL = 0x07;//уровень переполнения TIM2_CR1_bit.URS = 1; TIM2_EGR_bit.UG = 1; TIM2_IER_bit.UIE = 1; ITC_SPR5_bit.VECT19SPR = priority; asm(“RIM”);//глобально разрешим прерывания TIM2_CR1_bit.CEN = 1;// запустим таймер
}

Далее логично показать код самой индикации.

/*код цифр*/
/*т. к. у меня индикатор с общим анодом, то для зажигания на общий вывод подаю высокий*/
/*потенциал, на сегмент низкий*/
/*каждому горящему сегменту соответствует бит 0, негорящему 1*/
/*биты идут от младшего к старшему в соответствии с сегментами A-E + точка*/
int map[11] = { 0xC0, //0 0xF9, //1 0xA4, //2 0xB0, //3 0x99, //4 0x92, //5 0x82, //6 0xD8, //7 0x80, //8 0x90, //9 0x00 // error
}; /*пишем цифру в нужный разряд*/
void wrDig( int digit, char pos, bool dp )
{ ind[0] = 0xFF; ind[1] = 0xFF; ind[pos] = map[digit]; if ( dp ) ind[pos] &= 0x7F; } /*пишем число из двух данных цифр*/
void wrNum( int d1, int d0 )
{ ind[0] = map[d0]; if (( d0 > 9 )&&( d0 < 0 )) ind[0] = map[10]; ind[1] = map[d1]; if (( d1 > 9 )&&( d1 < 0 )) ind[1] = map[10]; } /*пишем целое число*/ void wrInt( long int n ) { int a, b; if ( n > 99 ) n = n % 100; a = n % 10; b = (n-a)/10; wrNum(b,a);
}

В библиотеке есть еще функции, но они е используются в проекте и их я не описываю тут; думаю, из их названия понятно их назначение.

Теперь разберемся с АЦП. Именно он преобразует напряжение на выходе датчика в понятный контроллеру цифровой код. Важным параметром является разрешение АЦП – размер результата в битах. Я выбираю 12 бит. Это значит, что при напряжении на входе АЦП, равном опорному ( Vref ) будет результат из 12 двоичных единиц 0x0FFF в шестнадцатиричной системе или 4095 в десятичной.

Код инициализации АЦП

CLK_PCKENR2_bit.PCKEN20 = 1; //тактирование ADC1_CR1_bit.ADON = 1; //включим преобразователь ADC1_SQR1_bit.DMAOFF = 1; //вырубим контроллер DMA ADC1_SQR4_bit.CHSEL_S2 = 1; //второй канал – пин 4 порта А ADC1_TRIGR4_bit.TRIG2 = 1; ADC1_CR2_bit.SMTP1=7; ADC1_TRIGR1_bit.TSON = 1; //включим внутренний датчик температуры

Теперь завершающий штрих – все выше написанное связать воедино.

float value; int middle_value; int res[BUF_SIZE]; /* настройка пинов для светодиода и кнопки*/
/*кнопка на пине С1*/ PC_DDR_bit.DDR1 = 0; //на вход PE_DDR_bit.DDR7 = 1;//push-pull режим PC_CR1_bit.C11 = 1;//разрешить прерывания пином
/*зеленый светодиод на пине Е7*/ PE_CR1_bit.C17 = 1;//на выход PC_CR2_bit.C21 = 1; PE_ODR_bit.ODR7 = 1;//подать на выход 1 EXTI_CR1_bit.P1IS = 2;//прерывание от кнопки по спаду asm( “RIM” );

В итоге имеем следующее устройство.

Схема для тех, кто будет делать на отдельной плате. Распиновка контроллера STM8L152C6T6

Если собираете на макетке, то просто подключаете к нужным выводам платы нужные проводники.

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

Как я уже говорил, можно перенести прошивку на внешний контроллер. Для этого к чипу подключаем питание и делаем выводы от пинов RESET и SWIM.

В проекте не забываем поменять настройки и заголовочные файлы, если используем не STM8L52C6. Далее справа над LCD снимаем 2 джампера. Слева видим штыревые контакты, 4 штуки.

К2 втором сверху подключаем вывод SWIM, к четвертому RESET от внешнего кристалла. И шьем.

Мой профиль на форуме

Прикрепленные файлы:

Источник: http://cxem.net/mc/mc312.php

Термометр на STM8L-Discovery. Часть 1 – Видео

4 ча назад

В видео рассказывается о том, как хакеры могут взломать ваш Wi-Fi и методы защиты от этого. Не нарушайте закон, господа! Утилита для мониторинга эфира и получения handshake'а: www.aircrack-ng.

org Интересные статьи с подробными инструкциями по тестированию сетей: получение handshake'а и подбор пароля: habr.com/post/334966/ про reaver и WPS уязвимости: habr.

com/company/xakep/blog/143834/ Автор: Науменко Андрей vk.com/andrew_atreides

6 лет назад

Индукционный нагреватель своими руками

4 лет назад

ФОНАРИК БЕЗ БАТАРЕЕК СВОИМИ РУКАМИ Моя партнерка рекомендую! http://www.air.io/?page_id=1432&aff=1126 В контакте http://vk.com/rinat_pak Моя группа http://vk.com/public64164283

7 лет назад

Испытания термометра STH0014 в экстремальных для него условиях – жидкий газ, горячий воздух, кипящая вода.

STH0014 – Миниатюрный цифровой встраиваемый термометр с выносным датчиком/ Предназначен для измерения температуры и состоит из модуля индикации и выносного датчика температуры DS18B20 на длинном кабеле припаянном к модулю. Для подключения питания на модуле установлен клеммник под отвертку.

4 лет назад

Заработать на aliexpress https://epn.bz/?i=29c81 Верни 8.5% с покупок https://cashback.epn.bz/?i=29c81 Задать вопрос без регистрации http://goo.gl/2fm3EP Наши группы ВК https://vk.com/club79283215 , https://vk.

com/club54960228 и https://vk.com/club100966297 Скачать архив http://turbobit.net/5p8zkq6od6x9.html Наши сайты http://vip-cxema.org/ , http://x-shoker.ru/ и http://www.kit-shop.

org/ Поддержать проекты webmoney R392842219424 Z416312694449

2 лет назад

Обзор не дорогих Китайских ST-Link программаторов для STM8 / STM32 микроконтроллеров. Проблемы с дешевыми ST-Link. Защита от статики.

1 лет назад

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

—————————————————————————————– Отладочную плату STM8S-Discovery можно купить здесь: http://ali.

pub/2f73ge —————————————————————————————–

4 лет назад

Переделываем Китайский радиозвонок под радиоуправление приборами (к примеру моделью или игрушками) А также рассмотрим интересный способ реализации двухкомандного управления с помощью одного радиозвонка В конце видео, в схеме ошибка: вместо 100 мФ следует читать 100 мкФ.

Источник: https://inlove.kz/watch/termometr-na-STM8L-Discovery-chast-1/1WYM4B-KbyI

Страничка эмбеддера » Обзор stm8

Когда я выбирал контроллер для очередной поделки, я наткнулся на резкий дефицит разного рода AVR’ок. Я начал искать, чем их заменить, и нашел stm8.

stm8 – это относительно новое семейство микроконтроллеров от компании STMicroelectronics. В нем воплощено чуть ли не все, чего можно ожидать от 8 битных чипов. Конечно-же, у каждого контроллера есть свои плюсы и свои минусы.

Плюсы и минусы

Естественно, плюсы и минусы я оцениваю по применимости в моих проектах, для вас они могут отличаться в ту или иную сторону. Я буду сравнивать с AVR, потому, как на них многие уже скушали небольшую собачку.

Плюсы:

  1. Цена. Не смотря на мало распространенность, stm8 стоит по три копейки за ведро.

  2. Еще одна цена. Отладочные платы и отладчики стоят копейки. Можно забыть про всю ту ораву самопальных программаторов, что расплодились для AVR’ов. Также, можно забыть про программаторы без отладчиков – за минимальные деньги все включено.

  3. У stm8 в отличии от AVR нет фьюзов. И это меня очень радует. Теперь вся программа действительно содержится в одном hex файле. Ну согласитесь, фьюзы в AVR– чистейшее зло!

  4. Есть очень дешевые контроллеры с 12-битными АЦП и ЦАПами, и это – очень хорошо!

  5. Классный отладочный интерфейс. Задумка об отладке по одному проводу у AVR была хороша, но чтобы ее включить, приходилось подключать еще три. В итоге, JTAG был не намного хуже пресловутого debugWire. ST довела идею до логического завершения. Отладка по двум проводам. Супер!

  6. Работает от пяти вольт. Не знаю, можно ли это назвать достоинством в нынешнем мире, но олдфагам это точно понравится.

  7. Встроенный bootloader. Умеет загружать программы по uart, spi, can, i2c.

  8. На халяву дается библиотека драйверов периферии.

Недостатки:

  1. Нет контроллеров в маловыводных корпусах (типа so8).

  2. Нет контроллеров с USB. ST предлагает пересаживаться на ее кортексы, если нужен USB.

  3. Не слишком пока распространены. Соответственно, и доставать сложно, и цены выше, чем могли бы быть.

Семейства

Существует 3 семейства stm8.

  1. stm8s – “стандартные” контроллеры общего применения, обычно 10 битная аналоговая периферия, среднее по современным стандартам энергопотребление. Диапазон питания – 2.95 – 5.5в

  2. stm8l – “low-power” контроллеры с низким потреблением, 12 битный аналог, улученная электромагнитная совместимость. Диапазон питания – 1.8-3.6в. По сравнению со стандартными контроллерами, тут добавляется небольшая кучка периферии, в частности, DMA.

  3. stm8a – “автомобильные” – все сосредоточено на безопасности и CAN’е. Котроллеры выдерживают больше издевательств над ножками, чем обычные, работают при 145 градусах,   Диапазон питания – 2.95 – 5.5в

Названия

Без лишних слов:

Структура документации

В принципе, всего кроме этого раздела можно было и не писать. Документация у ST довольно неплохая. Главное знать, что и где искать. (Примеры будут для контроллера, который валяется у меня прямо сейчас на столе — stm8l152c4)

Заходим на страничку интересующего вас контроллера. (вот тут http://www.st.com/mcu/ выбираем нужное семейство и контроллер, к примеру, stm8l152c4).

В отличии от Atmel’a, дядьки из ST поступили умнее, и разбили документацию на несколько частей. В даташите они приводят только отличие конкретного контроллера от всей остальной линейки. В даташите нужно искать электрические параметры, размер памяти, список периферии.

Немного ниже есть reference manual – это документация на всю линейку. Тут описывается переферия и регистры. Вообщем то, что нужно нормальному сишнику для программирования.

Если полистать ниже, то можно наткнуться на Errata sheet. Ошибок много, но серьезных практически нет.

Если ты – сумасшедший ассемблерщик (С), и этого тебе не хватило, то, в разделе Programming Manual, можно найти документ STM8 CPU programming manual. Это — описание самого ядра, набора инструкций, их таймингов, итп.

Библиотека

ST сделала такую штуку, которая называется STM8x Firmware library. Это – суть фрэймворк для микроконтроллеров.

Давайте, к примеру, запустим АЦП

1#include «stm8a_lib.h»

2

3void main(void)

4{

5 ADC_DeInit();

6 enableInterrupts();

7

8 /* Init ADC peripheral */

9 ADC_Init(ADC_CONVERSIONMODE_CONTINUOUS, ADC_CHANNEL_9,

10 ADC_PRESSEL_FCPU_D2, ADC_EXTTRIG_TIM, DISABLE,

11 ADC_ALIGN_RIGHT, ADC_SCHMITTTRIG_CHANNEL9, DISABLE);

12

13 /* Enable EOC interrupt */

14 ADC_ITConfig(ENABLE);

15

16 /*Start Conversion */

17 ADC_StartConversion();

18

19 while(1) { /* wait for interrupts */ }

20}

Красиво, не правда ли? Конечно, скорость работы с использованием такого “фрэймворка” будет ниже, чем без, но, как завещал Кнут – “premature optimization is the root of all evil”. Если будет совсем медленно, функции библиотеки всегда можно подменить своими.

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

Документация на библиотеку, хоть и doxygen’овская, но довольно хороша!

Средства отладки

Как я и обещал, тут все очень хорошо. Есть два основных средства

  • stm8s-discovery. Стоит 10$ + жадность продавца. Включает в себя полноценный программатор и небольшую отладочную плату. Стоимость деталей программатора в Киеве намного больше 10$, поэтому разнообразные самопальные программаторы сразу отпадают. Я купил себе такую и не жалею. Намного более стоящее приобретение, чем тот-же avr dragon. Кстати! Отладчик построен на контроллере STM32F103C8T6. На отладочной плате разведен JTAG, и, поэтому, ее можно использовать как отладочную для stm32. Прошивка потеряется, но, учитывая, что весь discovery стоит как один STM32F103C8T6, можно на это забить. Зато есть USB, внешние проводки, светодиоды. Вообщем, discovery — мегавещь.
  • st-link стоит побольше, чем stm8-discovery, зато программирует все, что выпускает stm, включая stm32. St-link может стать очень хорошей покупкой, если у вас нет arm-программатора.

Компиляторы

  1. Первое, и главное для меня, IAR выпускает компилятор для stm8. Бесплатный умеет до 8 кбайт или до 30 дней. Ходят слухи, что плохие люди его взламывают. Наверняка, это только слухи

    Источник: http://bsvi.ru/obzor-stm8/

    ZiB

    Сегодня по плану первый старт с демо платой STM8L-Discovery. В рамках которого хочется рассказать о том как самостоятельно создать простенький проект и прошить его. Что из этого получится посмотрим…

    Введение

    Ранее я писал что предлагаемые IDE меня не устраивают, уж больно сильно я подсел на Eclipse. Отказ ведет к потере автоматизма, в связи с чем придется собирать все ручками, но данный процесс меня устраивает. Однако это не мешает Вам использовать решения “по умолчанию”.

    Cosmic

    В состав пакета входят компилятор и компоновщик (линкер), задача компилятора прочитать наш программный код и сформировать из них набор инструкций, которые компоновщик соберет в конечный выходной файл годный для заливки в МК.

    Исходя из того нам нужно каким-то образом объяснить компоновщику как устроен наш МК, т.е. написать некий сценарий (указать сколько у нас флеш и ОЗУ, по каким адресам расположены, а так же указать куда что «положить»).

    Кроме того нужно выполнить начальную инициализацию МК.

    Сценарий

    Необходимый минимум информации который должен содержать сценарий:

    • расположение и размер флеш, ОЗУ и EEPROM
    • расположение кода, данных
    • размер и расположение стека

    Шаблон сценария идёт в комплекте с компилятором, файл располагается в корневой директории Stm8lkf.lkf. Я немного скорректировал его, и добавил комментарии:

    #==========================================================
    # File: Linker Script File for STM8L152C6
    # Date: 2011-01-22
    #==========================================================

    # флеш: константы
    +seg .const -b 0x8080 -m 0x7f80 -n .const -it # флеш: программный код
    +seg .text -a .const -n .text # EEPROM
    +seg .eeprom -b 0x1000 -m 0x400 -n .eeprom # ОЗУ: нулевая страница
    +seg .bsct -b 0x0 -m 0x100 -n .bsct +seg .ubsct -a .bsct -n .ubsct +seg .bit -a .ubsct -n .bit -id +seg .share -a .bit -n .share -is # ОЗУ:
    +seg .data -b 0x100 -m 0x4ff -n .data +seg .bss -a .data -n .bss #———————————————————-

    # начальная инициализация
    crtsi0.sm8 # исходники
    target/main.o
    target/lcd_nokia_1100.o # библиотеки
    libis0.sm8
    libm0.sm8 # таблица прерываний
    +seg .const -b 0x8000 -k
    target/stm8_interrupt_vector.o # определения используются при начальной инициализации
    +def __endzp=@.ubsct
    +def __memory=@.bss
    +def __startmem=@.bss
    +def __endmem=0x5fe
    +def __stack=0x7ff

    Формат файла довольно прост, необходимо указать распределение памяти: флеш, EEPROM, ОЗУ. Далее перечислить исходники: код начальной инициализации, ваши исходники, файлы библиотек и таблицу прерываний. В заключении описаны определения необходимые для начальной инициализации микроконтроллера.

    Начальная инициализация

    В отличии от STM32, здесь я решил воспользоваться файлами идущими в комплекте с компилятором. На выбор имеются несколько вариантов начальной инициализации:

    Название файла Краткое описание
    crts.sm8 crts0.sm8 Инициализация стека, передача управления основной программе
    crtsif.sm8 crtsx.sm8 crtsx0.sm8 crtsxf.sm8 Инициализация стека, инициализация переменных, передача управления основной программе

    Наличие нескольких файлов с инициализацией переменных обусловлено структурой памяти, например файлы с именами заканчивающимися нулем предназначены для приложений с размером кода менее 64 кБ (при этом файлы библиотек так же должны заканчиваться “нулем”). Более подробно можно почитать в документации: C Cross Compiler User’s Guide for ST Microelectronics STM8, раздел Programming Environments.

    Makefile

    Все необходимое для сборки проекта у нас есть, можно приступить к майк-файлу. Долго не мудрил взял готовый от проекта на STM32 и поправил только под текущий компилятор. Вот что получилось:

    >#==========================================================
    # File: Makefile for STM8
    # Date: 2011-01-22
    #==========================================================

    SRC_C = main.c
    SRC_C += stm8_interrupt_vector.c
    SRC_C += lcd_nokia_1100.c #———————————————————-

    CROSS_PATH = C:/Tools/Cosmic/4.3.4 CROSS = $(CROSS_PATH)/ INCLUDES += -imcu
    INCLUDES += -imcu/peripherals
    INCLUDES += -iutility VPATH += mcu
    VPATH += mcu/peripherals
    VPATH += utility #———————————————————-

    FLAGS_C = +warn +mods0 -pxp -pp -l #———————————————————-

    all: clean target.elf %.elf: $(SRC_C:%.c=target/%.o) @echo Linking: $@ @echo '———————————————————–' @$(CROSS)clnk -l'$(CROSS_PATH)/Lib' -o'target/target.sm8' -m'target/target.map' -sa 'mcu/stm8l152c6.lsf' @$(CROSS)cvdwarf target/target.sm8 @$(CROSS)chex -o target/target.s19 target/target.sm8 @$(CROSS)cobj -n target/target.sm8 @rm -f target/*.o $(SRC_C:%.c=target/%.o): target/%.o: %.c @$(CROSS)cxstm8 $(FLAGS_C) $(INCLUDES) -i. -i$(CROSS_PATH)/Hstm8 -cl'target' -co'target' $> clean: @echo '———————————————————–' @rm -f target/*.* mcu_program: @C:/Tools/STMicroelectronics/ToolKit/apisample.exe -BoardName=ST-LINK -Device=STM8L152x6 -Port=USB -ProgMode=SWIM -no_loop -no_log -FileProg=target/target.s19 mcu_restart: @C:/Tools/STMicroelectronics/ToolKit/gdb7.exe –quiet –command=mcu/stm8l152c6.ini .PHONY : all clean program

    Ни чего сложного в файле нет. Вначале из исходников получаем объектные файлы, далее их собирает компоновщик, ну и для информативности вывожу информацию о секциях.

    Последние две цели mcu_program и mcu_restart позволяют прошить и сбросить микроконтроллер, что очень удобно не нужно переключаться между окнами.

    (К сожалению данная утилита не хочет прошивать микроконтроллер установленный в STM32-Discovery, хотя теоритически должна.

    И почему то в ней не предусмотрен сброс, поэтому приходится использовать костыль в виде mcu_restart). Файл управляющих команд (stm8l152c6.ini):

    #
    # define emulator reset port and MCU
    #
    define emulator-reset-port-mcu
    target gdi -dll swimstm_swim.dll -stlink3 -port $arg0 -mcuname $arg1
    mcuname -set $arg1
    end #
    # reset command and quit
    #
    emulator-reset-port-mcu usb://usb stm8l152c6

    quit

    В результате получаем вот такую информацию (сборка, прошивка, сброс):

    make all ———————————————————–
    main.c:
    mcu/stm8_interrupt_vector.c:
    mcu/peripherals/lcd_nokia_1100.c:
    Linking: target.elf
    ———————————————————– sections: .const: hilo code, at address 0x8080 526 data bytes (0x020e)
    .text: hilo code, at address 0x8291 1030 data bytes (0x0406)
    .eeprom: no attribute, at address 0x1000 0 data bytes (0x0000)
    .bsct: no attribute, at address 0x0 0 data bytes (0x0000)
    .ubsct: bss hilo zpage, at address 0x0 11 reserved bytes (0x000b)
    .bit: no attribute, at address 0xb 0 data bytes (0x0000)
    .share: no attribute, at address 0xb 0 data bytes (0x0000)
    .data: no attribute, at address 0x100 0 data bytes (0x0000)
    .bss: bss hilo, at address 0x100 0 reserved bytes (0x0000)
    .info.: no attribute, at address 0x0 770 data bytes (0x0302)
    .const: hilo code, at address 0x8000 128 data bytes (0x0080)
    .init: hilo code, at address 0x828e 3 data bytes (0x0003)make mcu_program Configuration:
    BoardName=ST-LINK Device=STM8L152x6 Port=USB ProgMode=SWIM Loading file target/target.s19 in PROGRAM MEMORY Programming PROGRAM MEMORY
    Cut Version and Revision of device: 2.0 Programming PROGRAM MEMORY succeeds Verifying PROGRAM MEMORY
    Cut Version and Revision of device: 2.0 Verifying PROGRAM MEMORY succeedsmake mcu_restart Connected to the GDI Debug Instrument.
    Disconnected from the GDI Debug Instrument.

    Последний штрих

    Для полного счастья нахватает только описать таблицу прерываний и структуру регистров микроконтроллера. Данные файлы я взял из стандартной либы. (stm8_interrupt_vector.c, stm8l15x.h). Приведу только файл с таблицей:

    /* BASIC INTERRUPT VECTOR TABLE FOR STM8S devices * Copyright (c) 2007 STMicroelectronics */ typedef void @far (*interrupt_handler_t)(void); struct interrupt_vector
    { unsigned char interrupt_instruction; interrupt_handler_t interrupt_handler;
    }; @far @interrupt void NonHandledInterrupt (void)
    { /* in order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction */ return;
    } extern void _stext(); /* startup routine */ struct interrupt_vector const _vectab[] = { { 0x82, (interrupt_handler_t)_stext } , /* reset */ {0x82, NonHandledInterrupt}, /* trap */ {0x82, NonHandledInterrupt}, /* irq0 – tli */ {0x82, NonHandledInterrupt}, /* irq1 – awu */ {0x82, NonHandledInterrupt}, /* irq2 – clk */ {0x82, NonHandledInterrupt}, /* irq3 – exti0 */ {0x82, NonHandledInterrupt}, /* irq4 – exti1 */ {0x82, NonHandledInterrupt}, /* irq5 – exti2 */ {0x82, NonHandledInterrupt}, /* irq6 – exti3 */ {0x82, NonHandledInterrupt}, /* irq7 – exti4 */ {0x82, NonHandledInterrupt}, /* irq8 – can rx */ {0x82, NonHandledInterrupt}, /* irq9 – can tx */ {0x82, NonHandledInterrupt}, /* irq10 – spi*/ {0x82, NonHandledInterrupt}, /* irq11 – tim1 */ {0x82, NonHandledInterrupt}, /* irq12 – tim1 */ {0x82, NonHandledInterrupt}, /* irq13 – tim2 */ {0x82, NonHandledInterrupt}, /* irq14 – tim2 */ {0x82, NonHandledInterrupt}, /* irq15 – tim3 */ {0x82, NonHandledInterrupt}, /* irq16 – tim3 */ {0x82, NonHandledInterrupt}, /* irq17 – uart1 */ {0x82, NonHandledInterrupt}, /* irq18 – uart1 */ {0x82, NonHandledInterrupt}, /* irq19 – i2c */ {0x82, NonHandledInterrupt}, /* irq20 – uart2/3 */ {0x82, NonHandledInterrupt}, /* irq21 – uart2/3 */ {0x82, NonHandledInterrupt}, /* irq22 – adc */ {0x82, NonHandledInterrupt}, /* irq23 – tim4 */ {0x82, NonHandledInterrupt}, /* irq24 – flash */ {0x82, NonHandledInterrupt}, /* irq25 – reserved */ {0x82, NonHandledInterrupt}, /* irq26 – reserved */ {0x82, NonHandledInterrupt}, /* irq27 – reserved */ {0x82, NonHandledInterrupt}, /* irq28 – reserved */ {0x82, NonHandledInterrupt} /* irq29 – reserved */ };

    Хух, на этом пока все, далее по плану линии ввода-вывода и пример работы с ЖКИ индикатором от мобильного телефона Нокиа 1100.

    Стандартная библиотека (STM8L15x standard peripheral library)

    STM8L-Ultra Low Power-8 bits Microcontrollers

    UM0151: STVP programming toolkit

    Источник: http://ziblog.ru/2011/01/24/stm8l-ndash-pervyiy-start.html

    Обзор STM8L-Discovery

    Решил сделать небольшой обзорчик платы STM8L-Discovery. В комплекте кроме самой платы идет пластиковая упаковка и картонка с описанием функционала. Не густо, да. Но что вы хотели от рекламного продукта?

    Источник: http://picofarad.ru/obzor-stm8l-discovery/

    Getting started with stm8 development using free software: LED and timer on the STM8L-DISCOVERY

    This short tutorial is about a simple LED and timer demo for the STMicroelectronics STM8L-DISCOVERY board. The author used a Debian GNU/Linux system, but the tutorial should work for other Linux distributions, *BSD or other Unices.

    The tools we use are

    • The SDCC compiler, version 3.4.0 or later to compile C programs for the STM8.
    • stm8flash, to write programs onto devices.

    Hardware setup

    Just the STM8L-DISCOVERY connected using a USB cable.

    Get SDCC

    Depending on your operating system there might be an easy way to install SDCC 3.5.0 or newer using a package system or similar (e.g. apt-get install sdcc on Debian). While SDCC 3.4.

    0 should be sufficient for this tutorial, you might want to try a newer version in case you encounter any bugs. In particular, SDCC 3.4.

    0 has an issue with the library search path; this can be worked around by explicitly specifying the path to the standard library when linking.

    SDCC binaries or a source tarball can be downloaded from its website.

    Get stm8flash

    The stm8flash source can be found at its GitHub location, where there is also a download link for a zip archive of the sources. To compile it, a C compiler, such as gcc, pkg-config and libusb need to be installed.

    Unzip the archive (e.g. using unzip stm8flash-master.zip) change into the directory stm8flash-master and type make.

    In case there are any errors, such as header files not found, check that pkg-config and development files for libusb are installed.

    The Demo

    We present a simple Demo that blinks two LEDS, one once per second, the other once every two seconds. This demonstrates setting up and using an accurate timer and doing basic I/O. Here is the C code:

    // Source code under CC0 1.0
    #include #define PC_ODR (*(volatile uint8_t *)0x500a)
    #define PC_DDR (*(volatile uint8_t *)0x500c)
    #define PC_CR1 (*(volatile uint8_t *)0x500d) #define PE_ODR (*(volatile uint8_t *)0x5014)
    #define PE_DDR (*(volatile uint8_t *)0x5016)
    #define PE_CR1 (*(volatile uint8_t *)0x5017) #define CLK_DIVR (*(volatile uint8_t *)0x50c0)
    #define CLK_PCKENR2 (*(volatile uint8_t *)0x50c4) #define TIM1_CR1 (*(volatile uint8_t *)0x52b0)
    #define TIM1_PCNTRH (*(volatile uint8_t *)0x52bf)
    #define TIM1_PCNTRL (*(volatile uint8_t *)0x52c0)
    #define TIM1_PSCRH (*(volatile uint8_t *)0x52c1)
    #define TIM1_PSCRL (*(volatile uint8_t *)0x52c2) unsigned int clock(void)
    { unsigned char h = TIM1_PCNTRH; unsigned char l = TIM1_PCNTRL; return((unsigned int)(h)

    Источник: http://www.colecovision.eu/stm8/L-Discovery%20LED.shtml

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}