AVR

Первый проект на STM8S для ардуинщика

Микроконтроллеры AVR и всевозможные клоны Arduino отлично применяются как основа для DIY-проектов. Но существуют проекты, где использование этих модулей, и даже отдельных контроллеров Atmega и Attiny, не является оптимальным с точки зрения стоимости/ функционала/ габаритов изделия. Статья рассчитана на начинающих разработчиков и рассказывает о личном опыте автора по разработке первого проекта на незнакомом ему до этого микроконтроллере серии STM8S
5118
В избранное

Микроконтроллеры AVR и всевозможные клоны Arduino отлично применяются как основа для DIY-проектов. Но существуют проекты, где использование этих модулей, и даже отдельных контроллеров Atmega и Attiny, не является оптимальным с точки зрения стоимости/ функционала/ габаритов изделия. Статья рассчитана на начинающих разработчиков и рассказывает о личном опыте автора по разработке первого проекта на незнакомом ему до этого микроконтроллере серии STM8S.

Все началось с того, что мне подарили накидку подогревателя для автокресла. Но просто воткнуть ее в прикуриватель было неинтересно, и я решил дополнить подогрев «интеллектуальными» функциями - таймером автоотключения и регулировкой степени нагрева в зависимости от температуры окружающей среды. Идя проторенным путем, я собирался подобрать простейший Arduino-совместимый контроллер и собрать проект на нем. Искал его на сайте Терраэлектроники, установив параметрический фильтр по наличию на складе и сортировку по цене. И с удивлением на первой странице выдачи обнаружил среди простых контроллеров PIC и Attiny STM8S903K3T6C по цене ниже 25 рублей! Куча выводов, богатая периферия, нормальный объем памяти и давно лежащая в заначке отладка STM8S-Discovery сразу же заставили меня поменять решение о выборе микроконтроллера.

Инструменты разработки для STM8

Для старта изучения микроконтроллера нужна недорогая отладка STM8S-Discovery, на которой, кроме целевого контроллера, расположен программатор-отладчик ST-LINK. Этот программатор можно будет в дальнейшем использовать и для прошивки других плат.

Из программных средств нужна IDE. Из предлагаемых бесплатных я случайным образом выбрал IAR. Бесплатная версия IAR бывает в двух вариантах - с ограничением по размеру кода 8 кбайт или на срок 30 дней. Установка и получение лицензионного ключа не вызывает никаких проблем, поэтому описывать ее не буду. Дополнительно нужно поставить драйвер ST-Link, который можно скачать на сайте компании STMicroelectronics.

Для быстрого старта имеет смысл использовать библиотеку SPL (Standard peripherial library). Она предоставляет собой интуитивно понятные функции для работы со всей периферийной системой микроконтроллера.

В дальнейшем могут пригодиться еще несколько инструментов от ST - STVP для установки Option byte/разблокировки микроконтроллера и STM8CubeMX для удобного назначения выходов MCU перед разводкой платы.

Настройка рабочей среды

В первый раз настройка IAR для работы с конкретным микроконтроллером и подключение библиотеки SPL было достаточно непростой задачей. К счастью, на сайтe easyelectronics я нашел готовые шаблоны для IAR (автор 1essor1), позволившие скомпилировать первый проект буквально за 5 минут. Для установки шаблонов нужно всего лишь распаковать архивы в папку: С:\Program Files\IAR Systems\Embedded Workbench 8.0\ stm8\ config\ template\ project\ (путь зависит от версии IAR и места установки).

После этого при создании проекта через меню Project -> Create New Project появится новый шаблон ”С project with STM8S SPL”, который и надо выбрать (рис. 1).

Шаблон проекта с SPL в IAR

Рис. 1. Шаблон проекта с SPL в IAR

В следующем окне надо создать/выбрать папку для проекта и создать сам файл проекта. Поскольку шаблоны были созданы в более ранней версии IAR, возникнет сообщение о создании бэкапа файла проекта, с которым надо согласиться. Через несколько секунд пустой проект с готовой структурой папок будет создан. Нажав кнопку F7 (Make), можно проверить, что проект компилируется без ошибок.

Теперь нужно установить необходимый микроконтроллер. Прежде всего, необходимо настроить целевой микроконтроллер для проекта. Для этого слева, в окне навигации по проекту, нужно отметить строку проекта и в контекстном меню выбрать “Options” (рис. 2).

Настройка проекта

Рис. 2. Настройка проекта

В открывшемся окне, в категории “General Options” на закладке “Target” в поле “Device” необходимо выбрать нужное семейство микроконтроллеров. В категории “С/С++ Compiler” на закладке “Preprocessor” нужно задать дефайны для микроконтроллера и тактовой частоты. Пример для контроллера STM8S903K3T6C и внутреннего тактового генератора 16 МГц:

STM8S903
HSI_VALUE=((uint32_t)16000000)

И в категории “Debugger” в поле “Driver” нужно выставить “ST-LINK” для работы через программатор ST-LINK. Полный список дефайнов для семейств микроконтроллеров находится в файле “stm8s.h”. Теперь все готово к написанию первой программы. По хорошей традиции, это - мигание светодиодом.

Программа «Hello World»

Заготовку программы main.c для нас уже создал шаблон:


#include "stm8s_conf.h"
int SystemInit(void)
{
  return 0;
}
void main(void)
{
  SystemInit();
  while (1) {
  };
}

В первой строке подключается библиотека SPL #include "stm8s_conf.h". В функции “SystemInit” (аналог Setup для Arduino) нужно выполнить инициализацию периферии. A в функции “Main” в бесконечный цикл (аналог “Loop”) вставить, собственно, рабочий код.

Сначала нужно задать работу тактового генератора. В библиотеке SPL за тактирование отвечает stm8s_clk.h. У микроконтроллеров этого семейства три возможных источника тактирования: внешний (HSE) и внутренний (HSI) высокоскоростные осциляторы и внутренний низкоскоростной (LSI). Для запуска с минимальным количеством внешних компонентов будем использовать внутренний высокоскоростной осциллятор. Тактовая частота для него была задана дефайнами выше. Посмотрев функции заголовочного файла stm8s_clk.h, можно предположить, что для инициализации тактирования нужны следующие три команды:

CLK_DeInit();
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
CLK_HSICmd(ENABLE);

Первая инициализирует регистры тактирования в целом. Вторая задает делитель для тактовой частоты. И третья, собственно, запускает работу микроконтроллера от внутреннего источника тактирования.

Теперь инициализируем порты ввода/вывода. Смотрим функции в заголовочном файле stm8s_gpio.h. Для инициализации порта потребуется функция “GPIO_DeInit” (установка всех регистров в значение по умолчанию) и “GPIO_Init” (настройка режима работы конкретного порта).

Если использовать плату STM8S-Discovery, то на ней светодиод подключен к порту PD0.

Следовательно, инициализация порта в режиме выхода “push-pull” будет выглядеть следующим образом:


GPIO_DeInit(GPIOD);
GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_SLOW);

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

Вставив эти пять строк в функцию инициализации, можно попробовать откомпилировать и запустить программу - светодиод должен загореться. Но, скорее всего, у вас возникнет ошибка: Error[Li005]: no definition for "assert_failed" [referenced from …]. Дело в том, что все параметры, передаваемые в функции SPL, проверяются на соответствие типов макросом “Assert_param”, а для функции “Assert_failed”, вызываемой в случае, если параметр не прошел проверку, написана только декларация void assert_failed(uint8_t* file, uint32_t line);.

Соответственно, в main.c нужно определить функцию-ловушку:


void assert_failed(u8* file, u32 line){
   while (1)  {
   }
}

Теперь компиляция должна пройти без проблем, и программу, если вы выбрали правильный контроллер и отладчик в настройках проекта, можно загрузить в контроллер (кнопка “Download & debug”, Ctrl-D). После загрузки включится отладчик, он позволит пройти программу по шагам (или по точкам останова) и проверить значение переменных. Отладку можно отключить, если в ней нет необходимости.

Самый простой способ заставить светодиод мигать – вызывать в цикле команду “GPIO_WriteReverse”, а между вызовами сделать задержку с помощью пустого цикла:


volatile u16 i;
while (1) {
   GPIO_WriteReverse(GPIOD, GPIO_PIN_0);
   i=50000;
   while (i>0) {
     i--;
   }
}

Переменная цикла должна быть определена как “Volatile”, чтобы оптимизатор не исключил ее из цикла.

В результате получилась следующая программа:


#include "stm8s_conf.h"

int SystemInit(void)
{
   CLK_DeInit();
   CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
   CLK_HSICmd(ENABLE);
 
   GPIO_DeInit(GPIOD);
   GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_SLOW);
   return 0;
}
 
void main(void)
{
   SystemInit();
   volatile u16 i;
   while (1){
     GPIO_WriteReverse(GPIOD, GPIO_PIN_0);
     i=50000;
     while (i>0){
       i--;
     }
   };
}
 
void assert_failed(u8* file, u32 line)
{
   while (1){
   }
}

Мигание светодиодом с использованием таймеров и прерываний

Теперь для изучения генерации ШИМ, прерываний и таймеров сделаем проект, который будет плавно увеличивать и уменьшать яркость светодиода. Для этого понадобятся два таймера – один для генерации ШИМ, второй для вызова прерываний, в которых будет изменяться коэффициент заполнения ШИМ. В различных моделях микроконтроллеров STM8S доступно три или четыре таймера: один 8-битный и два или три 16-битных. Они могут иметь различные номера: TIM1…TIM6. Какие таймеры будут доступны в конкретном контроллере, можно узнать в документации на сайте ST.

Проект будем запускать на отладочной плате STM8S-Discovery на микроконтроллере STM8S105C6, в нем доступны три 16-битных таймера: TIM1, TIM2, TIM3 и 8-битный таймер TIM4. К порту PD0, на котором расположен светодиод, подключен второй канал TIM3. Соответственно, будем использовать TIM3 для генерации ШИМ и TIM2 для вызова прерываний, изменяющих заполнение ШИМ.

Для управления таймером TIM3 понадобятся следующие функции, описанные в заголовочном файле stm8s_tim3.h:

  • void TIM3_DeInit(void) – сброс всех регистров в значение по умолчанию;
  • void TIM3_TimeBaseInit(TIM3_Prescaler_TypeDef TIM3_Prescaler, uint16_t TIM3_Period) – задание делителя тактовой частоты и максимального значения счетика;
  • void TIM3_OC2Init(TIM3_OCMode_TypeDef TIM3_OCMode, TIM3_OutputState_TypeDef TIM3_OutputState, uint16_t TIM3_Pulse, TIM3_OCPolarity_TypeDef TIM3_OCPolarity) – задание режима работы второго канала таймера, ширины и полярности выходного импульса;
  • void TIM3_Cmd(FunctionalState NewState) - разрешение или запрещение работы таймера;
  • void TIM3_SetCompare2(uint16_t Compare2) – задание ширины выходного импульса.

Варианты значений перечисленных типов, используемых в функциях, можно найти в заголовочном файле. Кроме того, нужно разрешить тактирование таймеров командой “CLK_PeripheralClockConfig”.

Прежде всего, нужно раскомментировать подключение заголовочных файлов таймеров stm8s_tim3.h и stm8s_tim2.h в конфигурационном файле stm8s_conf.h. Для инициализации таймера TIM3 в функцию “SystemInit” надо добавить следующие строки:


TIM3_DeInit();
TIM3_TimeBaseInit(TIM3_PRESCALER_16, 1000);
TIM3_OC2Init(TIM3_OCMODE_PWM1, TIM3_OUTPUTSTATE_ENABLE, 100, TIM3_OCPOLARITY_HIGH);
TIM3_Cmd(ENABLE);

Вторая строка устанавливает частоту ШИМ. Настроить ее можно следующим образом: на рисунке 3 приведена схема тактирования микроконтроллера, которая взята из программы STM8CubeMX.

Схема тактирования STM8S

Рис. 3. Схема тактирования STM8S

На этом рисунке видно, что при установленном предделителе частоты HIS 1 (команда “CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1)”) вся периферия тактируется частотой 16 МГц. В команде “TIM3_TimeBaseInit” записано максимальное значение счетчика таймера 1000 и деление частоты на 16. Соответственно, частота ШИМ будет 1 кГц.

В третьей строке командой “TIM3_OC2Init” устанавливается режим работы второго канала - ШИМ с положительным импульсом длиной 100 тактов.

Задачей таймера TIM2 будет изменение заполнения ШИМ каждые 20 мс (50 Гц). Нужный коэффициент деления – 320000 – можно получить путем комбинации деления частоты на 32 и счетчика 10000. В итоге вот такая последовательность команд приведет к нужному результату - вызову прерываний с заданной частотой:


TIM2_DeInit();
TIM2_TimeBaseInit(TIM2_PRESCALER_32, 10000);
TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
TIM2_Cmd(ENABLE);
enableInterrupts(); // разрешение прерываний

В третьей строке задается вызов прерываний при переполнении счетчика.

Заглушка для обработчика прерываний находится в файле stm8s_it.c INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13).

Добавим в этот обработчик установку флага для нашей программы и сброс флага прерываний:

extern u8 flgChangePwm; // переменная флага определена в main.c, так что здесь она объявлена как внешняя


INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13){
  flgChangePwm=1;
  TIM2_ClearITPendingBit(TIM2_IT_UPDATE);
}

А в функции “Main” будем, если флаг установлен, увеличивать и уменьшать заполнение ШИМ:


if(flgChangePwm){
  pwm+=step;
  if (pwm>=MAX_PWM || pwm<=MIN_PWM){
     step=-step;
     pwm+=step;
  }
  TIM3_Cmd(DISABLE);
  TIM3_SetCompare2(pwm); // установка нового заполнения ШИМ
  TIM3_Cmd(ENABLE);
  flgChangePwm=0;
}

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

Полностью программу можно скачать в архиве test3-1.zip.

Интерфейс SWIM, использование отладчика, схема подключения контроллера

Несколько слов о «железе». Для программирования и отладки микроконтроллеров STM8S используется четырехпроводной интерфейс SWIM. Программатор ST-LINK с этим интерфейсом входит в состав платы STM8S-Discovery, но, сняв две перемычки, его можно использовать и для программирования любых своих плат. Для восстановления возможности программирования отладочной платы нужно соединить контакты разъемов, как показано на рис. 4.

Перемычки SWIM

Рис. 4. Перемычки SWIM

Нужно обратить внимание, что программатор питается от целевой платы, так что его можно использовать для программирования схем как 3,3 В, так и 5 В. При программировании внешних плат нужно снять джампер питания JP1 на Discovery.

Интерфейс SWIM дает возможность не только прошить микроконтроллер, но и пошагово пройти программу и проверить заложенную в нее логику. Можно использовать точки останова, проверять значения переменных – все это помогает быстро найти ошибки в коде и исправить их. Разумеется, в пошаговом режиме не стоит смотреть на быстро меняющиеся сигналы, задержки и прочие зависящие от времени процессы – этот режим предназначен только для проверки логики.

Какая минимальная обвязка нужна при разработке собственной схемы микроконтроллера? Если брать по минимуму, то только один конденсатор С5, подключенный к выводу VCAP. Желательно добавить резистор R6 и конденсатор C1 на цепь сброса и фильтрующий конденсатор C8 на цепи питания (рис. 5).

Минимальная обвязка микроконтроллера

Рис. 5. Минимальная обвязка микроконтроллера

Альтернативный режим работы выводов

Многие выводы микроконтроллера имеют альтернативную функциональность (указана в квадратных скобках на рис. 5), это позволяет оптимизировать трассировку печатной платы, уменьшив количество переходов между слоями. Например, предположим, что нам нужно использовать один канал TIM5 именно на выводе 22 контроллера STM8S903K3T6C (таблица 1). Для включения альтернативного режима работы нужно установить бит AFR0 в опциональных байтах во Flash-памяти (OPT2) по адресам 0x4803 и 0x4804 (таблица 2).

Таблица 1. Описание выводов микроконтроллера

SDIP32 LQFP/
UFQFP32
Pin name Type Input Output Main function (after reset) Default alternate function Alternate function after remap [option bit]
Floating Wpu Ext. interrupt High sink* Speed OD PP
24 19 PC2/TIM_CH2 [TIM1_CH3N] I/O X X X HS O3 X X Port C2 Timer 1 - channel 2 Timer 1 - inverted channel 3 [AFR1:0]
25 20 PC3/TIM1_CH3/TLI/ [TIM1_CH1N] I/O X X X HS O3 X X Port C3 Timer 1 - channel 3 Top level interrupt [AFR3] Timer 1 channel 1 [AFR7]
26 21 PC4/TIM1_CH4/
CLK_CCO/AIN2/ [TIM1_CH2N]
I/O X X X HS O3 X X Port C4 Timer 1 - channel 4 /configurable clock output Analog input 2 [AFR2] Tiner 1 inverted channel 2 [AFR7]
27 22 PC5/SPI_SCK [TIM5_CH1] I/O X X X HS O3 X X Port C4 SPI clock Timer 5 channel 1 [AFR0]

Таблица 2. Опциональные байты для ремапинга выводов

Add. Option name Option byte no. Option bits Factory default setting
7 6 5 4 3 2 1 0
0x4800 Red-out protection (ROP) OPT0 ROP [7:0] 0x00
0x4801 User boot code (UBC) OPT1 UBC [7:0] 0x00
0x4802 NOPT1 NUBC [7:0] 0xFF
0x4803 Alternat function remapping (AFR) OPT2 AFR7 AFR6 AFR5 AFR4 AFR3 AFR2 AFR1 AFR0 0x00
0x4804 NOPT2 NAFR7 NAFR6 NAFR5 NAFR4 NAFR3 NAFR2 NAFR1 NAFR0 0xFF

Это несколько специфичные байты. Для предотвращения ошибок в соседние ячейки памяти нужно записать управляющий байт в прямом и инверсном видах. Включить альтернативный режим работы вывода контроллера можно двумя способами: прямо в программе или используя специальный инструмент от ST – ST Visual Programming.

Функции, необходимые для работы с Flash-памятью, декларированы в файле stm8s_flash.h. Нужно выполнить следующие строки:


FLASH_Unlock(FLASH_MEMTYPE_DATA); // разблокировать память
FLASH_ProgramOptionByte(0x4803, 0x01); // записать новое значение “Option Byte”
FLASH_Lock(FLASH_MEMTYPE_DATA); // заблокировать память

Обратите внимание, что инверсное значение в ячейку 0x4804 записывать не нужно, это сделает сама функция.

Второй способ записать “Option byte” - использование ST Visual Programming. После запуска этой программы нужно выбрать меню конфигурации и там установить целевой микроконтроллер и программатор (рис. 6).

 Запуск STVP

Рис. 6. Запуск STVP

После этого нужно на закладке “Option Byte” считать данные из микроконтроллера, выбрать в выпадающем списке нужное значение бита AFR0 и сохранить закладку обратно в микроконтроллер (рис. 7).

Настройка Option byte

Рис. 7. Настройка Option byte

Программа STVP поможет, если при неаккуратных манипуляциях с option byte из кода вы заблокируете микроконтроллер.

Сенсорные кнопки и Touch-Sensing Library

Для микроконтроллеров STM8S компания ST подготовила библиотеку для реализации емкостных сенсорных кнопок. Библиотека сопровождается достаточно полной документацией, но на несколько моментов я хочу обратить особое внимание.

Подключение сенсорных кнопок

Рис. 8. Подключение сенсорных кнопок

Принцип работы емкостной кнопки следующий: таймер непрерывно считает время разряда и заряда емкости Cxi (рис. 8). При приближении пальца емкость возрастает и время увеличивается. Микроконтроллер отслеживает изменения и формирует события при касании. В библиотеке реализована калибровка кнопок и защита от дребезга. Для реализации двух кнопок нужно минимум три вывода, как показано на рисунке 9. Желательно еще один вывод использовать для подключения экрана, это позволяет увеличить чувствительность схемы. Кроме выводов микроконтроллера библиотека использует два таймера: 8-битный для генерации событий измерения состояний выходов и 16-битный для подсчета времени заряда/разряда кнопок.

Рассмотрим конфигурацию библиотеки для такой схемы, подключенной к контроллеру STM8S903 (рис. 9).

Схема подключения кнопок

Рис. 9. Схема подключения кнопок

Конфигурация таймеров:


#define TIMACQ (TIM1)// определяет таймер для измерения емкости
#define TIMACQ_CNTR_ADD (0x525E) // адрес регистра TIM1_CNTRH
#define TIMTICK (TIM6) // 8-битный таймер, устанавливающий миллисекундный и секундный флаги

Задание вывода LOAD на порту PC2:


#define LOADREF_PORT_ADDR (GPIOC_BaseAddress) /**< LOADREF pin GPIO base address */
#define LOADREF_BIT (0x04) /**< LOADREF pin mask */

Задание копок, подключеннных к портам PC1 и PC3:


#define SCKEY_P1_KEY_COUNT (2) /**количество кнопок*/
#define SCKEY_P1_PORT_ADDR (GPIOC_BaseAddress) /**идентификатор порта*/
#define SCKEY_P1_A (0x02) /**маска кнопки 1  PC1*/
#define SCKEY_P1_B (0x08) /**маска кнопки 2  PC3*/
#define SCKEY_P1_DRIVEN_SHIELD_MASK (0x10) /**маска экрана PC4*/

Общая маска подключенных выводов для порта PC (кроме вывода LOAD):


#define GPIOC_ELECTRODES_MASK (0x0A) /**< Electrodes mask for GPIOC */

Использование TIM1

TIM1 - несколько специфический таймер, одним из отличий которого является возможность установки коэффициента деления любым числом u16, а не только степенями двойки, как в других таймерах. Поэтому при компиляции вы увидите ошибку: регистр TIMACQ->PSCR не определен. Вместо этого регистра в таймере TIM1 используются два регистра: TIMACQ->PSCRL и TIMACQ->PSCRH. Соответственно, в stm8_tsl_rc_acquisition.c в функции “TSL_IO_Init” нужно задать значения этих двух регистров.

Минимальный код опроса кнопок:


for (i = 0; i < NUMBER_OF_SINGLE_CHANNEL_KEYS; i++) { // активация кнопок
  sSCKeyInfo[i].Setting.b.IMPLEMENTED = 1;
  sSCKeyInfo[i].Setting.b.ENABLED = 1;
  sSCKeyInfo[i].DxSGroup = 0x00; /* 0x00 = DxS disabled, other values = DxS enabled */
}
TSL_Init(); // инициализация библиотеки TSL
for (;;) { // бесконечный основной цикл
   TSL_Action(); // опрос кнопок, установка флагов
   if ((TSL_GlobalSetting.b.CHANGED) && (TSLState == TSL_IDLE_STATE)) { // если состояние кнопок изменилось и измерения окончены
     TSL_GlobalSetting.b.CHANGED = 0; // сбросить флаг изменения состояния кнопок
     if (sSCKeyInfo[0].Setting.b.DETECTED) { // если нажата кнопка «1»
       // полезный код здесь
       }
     if (sSCKeyInfo[1].Setting.b.DETECTED){ // если нажата кнопка «2»
       // полезный код здесь
     }
   }
}

Калибровка кнопок

Емкость кнопки и ее изменение зависят от множества факторов, начиная от геометрии платы и заканчивая влажностью воздуха. Поэтому не исключено, что после выполнения калибровки программа окажется не в состоянии определить касание кнопки. Что нужно сделать?

Можно отладчиком посмотреть, как происходит измерение нажатий на кнопку. Для этого нужно поставить прерывание (“Break point”) в файле stm8_tsl_rc_acquisition.c на строке “CumulatedMeasurement += Measurement”. Величина “Measurement” при каждой остановке не должна существенно отличаться от предыдущей (пальцем кнопки не касаемся). Если это не так, то возможно, что рядом проходят провода, от которых идет наводка. Попробуйте убрать провода питания и отладчика, находящиеся рядом металлические предметы. Проверьте наводки по питанию.

Теперь проверьте, что когда к кнопке поднесен палец, значение “Measurement” существенно изменяется. Если изменение невелико, можно увеличить номиналы резисторов R10 и R11 (рисунок 11), это повысит чувствительность схемы (но также увеличит шум и возможность ошибки при калибровке из-за меняющихся значений).

Поставьте прерывание в функции “TSL_SCKey_CheckErrorCondition”, она проверяет попадание измеренного значения в заданные границы “SCKEY_MIN_ACQUISITION” и “SCKEY_MAX_ACQUISITION”. Если ваши значения выходят за эти пределы, но они стабильны, а нажатое и отпущенные состояния существенно отличаются друг от друга, то эти пределы можно изменить.

В принципе, кнопка диаметром примерно 8 мм с экраном должна уверенно детектировать палец на расстоянии 3…5 мм с воздушной прослойкой.

Измерение временных интервалов

В библиотеке TSL есть встроенная возможность для отслеживания временных интервалов. Она реализуется с помощью переменной “TSL_Tick_Flags” и дает возможность отслеживать интервалы в одну секунду и 100 милисекунд.

В простейшем случае для выполнения действия раз в секунду нужно написать следующий код:


if(TSL_Tick_Flags.b.DTO_1sec){ // проверить состояние флага
  //полезный код;
  TSL_Tick_Flags.b.DTO_1sec=0; // сбросить флаг
}

Проект контроллера подогрева автокресла

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

Датчик температуры

Самый бюджетный датчик температуры - это терморезистор. Возьмем B57621C5103J062 – NTC-терморезистор в корпусе 1206 с сопротивлением при температуре 25°C 10 кОм и коэффициентом Beta 3530K. С помощью делителя напряжения, в одном плече которого стоит терморезистор, микроконтроллер через аналоговый вход может приблизительно оценить температуру воздуха и изменить режим работы (рис. 10).

Схема подключения термистора

Рис. 10. Схема подключения термистора

Для приведенной на рис. 12 схемы зависимость напряжения от температуры для термистора B57621C5103J062 указана в таблице 3.

Таблица 3. Зависимость напряжения от температуры для термистора B57621C5103J062

Температура, °С Напряжение в цепи TEMP, В
-5 3,89831
0 3,69185
5 3,46856
10 3,23322
15 2,98971
20 2,74378
25 2,5

Включение АЦП

Так как с выхода делителя с терморезистором в одном плече снимается аналоговый сигнал, для измерения этого сигнала потребуется АЦП. Чтобы его использовать, в файле конфигурации stm8s_conf.h нужно раскомментировать строку подключения заголовочного файла АЦП #include "stm8s_adc1.h". Для измерений будем использовать канал AIN0.

Инициализации и запуск измерения напряжения на этом канале выполняется следующим кодом:


CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC, ENABLE); // тактирование АЦП
GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_IN_FL_NO_IT); // включение порта в режим входа
ADC1_DeInit(); // сброс регистров АЦП
ADC1_Init(ADC1_CONVERSIONMODE_SINGLE, /*однократный запуск*/
  ADC1_CHANNEL_0, /*канал «0»*/
  ADC1_PRESSEL_FCPU_D8, /*делитель частоты «8»*/
  ADC1_EXTTRIG_TIM, /*запуск от внутреннего триггера*/
  ENABLE,
  ADC1_ALIGN_RIGHT, /*результат выровнен вправо*/
  ADC1_SCHMITTTRIG_ALL, /*отключен триггер Шмита на входе*/
  DISABLE);
ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE); // разрешение прерываний по окончанию измерения
ADC1_Cmd(ENABLE); // разрешение работы
ADC1_StartConversion(); //запуск преобразования

Результаты измерений выдаются в обработчике прерываний:


INTERRUPT_HANDLER(ADC1_IRQHandler, 22) {
  uint16_t v=ADC1_GetConversionValue(); // получение результатов измерений
  ADC1_ClearITPendingBit(ADC1_IT_EOC); // сброс флага прерываний
}

Описание программы

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

Постановка задачи: устройство при включении должно переходить в автоматический режим, и коэффициент заполнения ШИМ должен зависеть от окружающей температуры. Пользователь может изменить режим работы на ручной или вернуться к автоматическому. В ручном режиме можно задать три режима нагрева. Через 30 минут после включения устройство должно выключиться.

Программа состоит из двух частей - инициализации и основного цикла. Во время инициализации нужно выполнить следующие задачи:

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

Блок-схема основного цикла изображена на рис. 11.

Основной цикл

Рис. 11. Основной цикл

В начале цикла проверяется состояние клавиатуры, потом, в зависимости от режима работы и температуры, выставляется новое значение переменной, хранящей заполнения ШИМ. В конце цикла, если значение переменной заполнения цикла изменилось, происходит реальное изменение заполнения ШИМ.

Раз в секунду проверяется общее время работы программы (если оно достигло заданного значения, устройство выключится) и, если режим работы автоматический, то запускается измерение температуры (рис. 12).

Обработка событий раз в секунду

Рис. 12. Обработка событий раз в секунду

Блок-схема функции обработки нажатий клавиатуры приведена на рис. 13.

Опрос клавиатуры

Рис. 13. Опрос клавиатуры

Полностью код проекта можно скачать здесь.

Принципиальная схема проекта, приведенная на рисунке 14, не учитывает импульсные помехи, характерные для сетей питания автомобильной электроники. В реальной схеме нужно добавить дроссель на входе питания VCC.

Принципиальная схема

Рис. 14. Принципиальная схема

Стоимость BOM-изделия составляет менее 100 рублей даже при покупке комплектующих в розничном магазине. Схему можно собрать на односторонней плате (рис.15).

PCB

Рис. 15. PCB

Полностью со схемой и платой проекта можно ознакомиться здесь.

Заключение

В статье рассмотрены подключение микроконтроллера серии STM8S и работа с периферией: АЦП, таймерами, портами ввода/вывода. Библиотека SPL позволяет быстро начать разработку устройства на этом микроконтроллере без глубокого изучения документации и регистров, а изучив функции этой библиотеки, можно перейти к непосредственной работе с регистрами. Возможность пошаговой отладки программы с просмотром значений переменных и полноценная среда разработки IAR существенно ускоряют написание работающей программы. Привлекательная стоимость STM8S903K3T6C, удобный корпус, богатая периферия и большой объем памяти позволяют использовать этот микроконтроллер во многих проектах вместо Arduino-совместимых контроллеров других производителей.

Производитель: STMicroelectronics
Наименование
Производитель
Описание Корпус/
Изображение
Цена, руб. Наличие
STM8S103K3T6C
STM8S103K3T6C
STMicroelectronics
Арт.: 328745 ИНФО PDF AN RD DT
Доступно: 105 шт. от 1 шт. от 624,94
Выбрать
условия
поставки
Микроконтроллер - [LQFP-32]; Ядро: STM8, 8-бит; FLASH: 8 КБайт; EEPROM: 640 Байт; RAM: 1 КБайт; АЦПканалов: 5; АЦПразр: 10
STM8S103K3T6C от 1 шт. от 624,94
105 шт.
(под заказ)
Выбрать
условия
поставки
STM8S105K4T6C
STM8S105K4T6C
STMicroelectronics
Арт.: 328746 ИНФО PDF AN RD DT
Доступно: 859 шт. 76,50
Микроконтроллер - [LQFP-32]; Ядро: STM8, 8-бит; FLASH: 16 КБайт; EEPROM: 1 КБайт; RAM: 2 КБайт; АЦПканалов: 7; АЦПразр: 10
STM8S105K4T6C 76,50 от 51 шт. 65,50 от 112 шт. 59,00 от 250 шт. 54,50 от 750 шт. 52,00
859 шт.
(на складе)
STM8S-DISCOVERY
STM8S-DISCOVERY
STMicroelectronics
Арт.: 538958 ИНФО PDF AN RD
Доступно: 60 шт. 1020,00
Key Features ?STM8S105C6T6 microcontroller, 32 KB Flash, 2 KB RAM, 1 KB EEPROM ?Powered by USB cable between PC and STM8S-DISCOVERY ?Selectable power…
STM8S-DISCOVERY 1020,00 от 4 шт. 878,00 от 9 шт. 791,00 от 18 шт. 732,00 от 48 шт. 695,00
16 шт.
(на складе)
44 шт.
(под заказ)
STM8S105K6T6C
STM8S105K6T6C
STMicroelectronics
Арт.: 566942 ИНФО PDF AN RD DT
Доступно: 842 шт. 78,00
8-bit Microcontrollers - MCU Access Line 16 MHz 8-bit MCU 32 Kbyt
STM8S105K6T6C 78,00 от 50 шт. 67,00 от 110 шт. 60,00 от 250 шт. 55,50 от 500 шт. 53,00
842 шт.
(на складе)
STM8S105C4T3
STM8S105C4T3
STMicroelectronics
Арт.: 566979 ИНФО PDF AN RD DT
Доступно: 93 шт. от 1 шт. от 700,82
Выбрать
условия
поставки
8-bit Microcontrollers - MCU Access line 16 MHz 8-bit MCU 32 Kbyt
STM8S105C4T3 от 1 шт. от 700,82
93 шт.
(под заказ)
Выбрать
условия
поставки
STM8S105K6T3C
STM8S105K6T3C
STMicroelectronics
Арт.: 566984 ИНФО PDF AN RD DT
Доступно: 185 шт. от 5 шт. от 353,47
Выбрать
условия
поставки
8-bit Microcontrollers - MCU Access line 16 MHz 8-bit MCU 32 Kbyt
STM8S105K6T3C от 5 шт. от 353,47
185 шт.
(под заказ)
Выбрать
условия
поставки
STM8S005K6T6C
STM8S005K6T6C
STMicroelectronics
Арт.: 884036 ИНФО PDF AN RD DT
Доступно: 681 шт. 96,50
8-bit Microcontrollers - MCU 8-bit MCU Value Line 16 MHz 32kb Flash
STM8S005K6T6C 96,50 от 40 шт. 82,50 от 89 шт. 74,50 от 191 шт. 69,00 от 500 шт. 65,50
681 шт.
(на складе)
STM8S003K3T6C
STM8S003K3T6C
STMicroelectronics
Арт.: 884044 ИНФО PDF AN RD DT
Доступно: 966 шт. 68,00
Микроконтроллер - [LQFP-32]; Ядро: STM8, 8-бит; FLASH: 8 КБайт; EEPROM: 128 Байт; RAM: 1 КБайт; АЦПканалов: 4; АЦПразр: 10
STM8S003K3T6C 68,00 от 57 шт. 58,00 от 126 шт. 52,50 от 250 шт. 48,40 от 750 шт. 46,00
966 шт.
(на складе)
STM8S003F3U6TR
STM8S003F3U6TR
STMicroelectronics
Арт.: 884047 ИНФО PDF AN RD DT
Доступно: 1785 шт. 36,80
8-bit Microcontrollers - MCU 8-bit MCU Value Line 16 MHz 8kb FL 128EE
STM8S003F3U6TR 36,80 от 105 шт. 31,50 от 232 шт. 28,40 от 500 шт. 26,30 от 1316 шт. 25,00
1785 шт.
(на складе)
Производитель: EPCOS AG
Наименование
Производитель
Описание Корпус/
Изображение
Цена, руб. Наличие
B57621C5103J062
B57621C5103J062
EPCOS AG
Арт.: 994889 ИНФО PDF
Доступно: 7143 шт. 9,20
THERMISTOR, NTC, 10K, 1206
B57621C5103J062 9,20 от 420 шт. 7,90 от 930 шт. 7,10 от 2010 шт. 6,50 от 5290 шт. 6,20
7143 шт.
(на складе)
Производитель: Терраэлектроника
Наименование
Производитель
Описание Корпус/
Изображение
Цена, руб. Наличие
TE-ST-LINK
TE-ST-LINK
Терраэлектроника
Арт.: 1081691 ИНФО PDF
Доступно: 38 шт. 1860,00
TE-ST-LINK (версия 2) – внутрисхемный эмулятор/программатор компании Терраэлектроника для микроконтроллеров  STM8 и STM32
TE-ST-LINK 1860,00 от 3 шт. 1590,00 от 5 шт. 1430,00 от 10 шт. 1330,00 от 27 шт. 1260,00
38 шт.
(на складе)
Производитель: Waveshare Electronics Ltd.
Наименование
Производитель
Описание Корпус/
Изображение
Цена, руб. Наличие
ST-LINK/V2 [mini]
ST-LINK/V2 [mini]
Waveshare Electronics Ltd.
Арт.: 2274149 ИНФО PDF
Доступно: 166 шт. 761,00
ST-LINK/V2 [mini] – крайне экономичное решение для внутрисхемного программирования и отладки микроконтроллеров STM8 и STM32
ST-LINK/V2 [mini] 761,00 от 6 шт. 652,00 от 12 шт. 587,00 от 25 шт. 544,00 от 64 шт. 516,00
126 шт.
(на складе)
40 шт.
(под заказ)

Сравнение позиций

  • ()