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
>
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;
0x40; // PE.6 as a floating input
GPIOE->DDR&=
// *** 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= 4<<4 & ADC1_CR1_SPSEL; // master clock/8, single conversion
ADC1->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
ALL_LEDs); // LEDs settings in according to LED status
GPIOB->ODR|= leds;
>;
>;
>
/**
* @>
*/
Микроконтроллеры STM8 «с нуля»
Линейка микроконтроллеров STM8 заменила STR7 в 2008 году. На сегодня она состоит из трех семейств: для автомобильного, низкопотребляющего и общего применений. Это, соответственно, STM8A, STM8L и STM8S. Общая же номенклатура составляет более 160 позиций, и компания постоянно работает над расширением каждой линейки. Хотя на рынке наметилась тенденция перехода на 16/32-битные микроконтроллеры, 8-битные все еще составляют основную часть рынка, и в ближайшее десятилетие их доля останется значительной.
Инструментарий для работы
Для работы с любым микроконтроллером, и STM8 — в частности, нам понадобятся отладочный комплект и среда разработки c Си-инструментарием. В качестве отладочного комплекта можно использовать любой из предоставляемых комплектов как от ST, так и от сторонних производителей. Рассмотрим STM8S-Discovery, его внешний вид представлен на рис. 1.
Рис. 1. STM8S-Discovery
Данный выбор обусловлен, в первую очередь, очень низкой стоимостью комплекта (меньше $15), его доступностью и дальнейшей пригодностью. Комплект состоит из двух частей. Одна — это контроллер STM8S105С6 со светодиодом, сенсорной кнопкой и разъемами, на которые выведены все свободные порты ввода/вывода. Вторая — программатор-отладчик ST-Link c USB-интерфейсом. Если внимательно посмотреть на изображение отладочного комплекта, то можно увидеть, что с помощью небольших усилий его можно разделить на две части, и в дальнейшем использовать отделенный ST-Link для программирования и отладки своих собственных разработок. Всю необходимую документацию вы можете посмотреть и скачать по ссылке.
Выбор программного инструментария
для разработки
На данный момент для разработки и отладки программного обеспечения для STM8 существует четыре среды: ST Toolset от STMicroelectronics, Ride7 от Raisonance (www.raisonance.com), CXSTM8 от Cosmic software, IAR Embedded Workbench от IAR Systems. Сравнительный анализ средств разработки программного обеспечения представлен в таблице 1.
Таблица 1. Сравнительный анализ бесплатных средств разработки программного обеспечения
Инструментарий | Среда разработки | Си-инструментарий | Си-инструментарий других производителей | Ограничение Си-иструментария, Кбайт | Программатор-отладчик |
---|---|---|---|---|---|
STMicroelectronics | ST Visual Develop | Нет | Cosmic software, Raisonance | Нет | ST-Link R-Link STICE |
Raisonance | Ride 7 | Есть | Нет | 16 | R-Link |
Cosmic software | CXSTM8 | Есть | Нет | 32 | Нет |
IAR Systems | IAR Workbench | Есть | Нет | 8 или полная версия на 30 дней | ST-Link STICE |
Пакет ST Toolset включает в себя среду разработки ST Visual Develop и отдельную программу для более функционального внутрисхемного программирования flash-памяти микроконтроллеров ST Visual Programmer. Среда разработки ST Visual Develop имеет встроенный инструментарий для разработки программного обеспечения на языке assembler, но у нее также имеется возможность подключения и использования Си-инструментария от Raisonance и Cosmic software. Стоит заметить, что все четыре среды с Си-инструментарием предоставляют возможность использования с некоторыми ограничениями, а именно — по загружаемому коду во flash-память. У Raisonance оно составляет 16 Кбайт, у Cosmic software — 32 Кбайт, а у IAR — 8 Кбайт или полную версию с 30-дневным ограничением. Самый дешевый и оптимальный вариант — это использование ST Visual Develop в качестве среды разработки и Си-инструментария либо от Raisonance, либо от Cosmic software. Вы, конечно же, можете заметить, что наиболее известным и популярным является инструментарий от IAR System, и тут с вами трудно не согласиться. Он представляет собой более серьезный продукт с лучшей технической поддержкой, но и является самым дорогим. Итак, мы останавливаем свой выбор на ST Visual Developer, плюс Си-инструментарий от Cosmiс software и Raisonance. Большой разницы в использовании обоих инструментариев нет, и далее в своих разработках вы можете остановиться на любом из них. Если вы — начинающий разработчик, и у вас недостаточный опыт, рекомендую устанавливать все программное обеспечение по предполагаемым установщиком местам расположения, т.е. по умолчанию. Это необходимо для меньшей путаницы при дальнейшей настройке проектов, расположении файлов, библиотек и синхронизации с информацией приведенных материалов.
Установка программного инструментария для разработки
Итак, скачиваем и устанавливаем ST Toolset по ссылке. Далее нам необходимо скачать Си-инструментарий от Raisonance и от Cosmic software.
Открываем браузер, входим по ссылке, скачиваем два установочных файла — это среда разработки Ride7 и инструментарий RKit-STM8. Устанавливаем в той же последовательности. После установки, необходимо получить бесплатную лицензию на использование Си-инструментария, заполнив регистрационную форму. В течение короткого срока вы получите лицензионный ключ по указанной в регистрации электронной почте. Запускаем среду «Пуск ® Программы ® Raisonance Tools ® Ride7 ® Ride7» и переходим на «Help ® License». Вводим общую информацию, выбираем «Manual Activation», копируем ключ из поля «This computer Serial Key» в поле «Serial Key», вводим ключ, присланный по электронной почте в поле «Paste the Activation code and Select Next» и, если все сделано верно, Си-инструментарий будет активирован и выдаст соответствующее сообщение.
Для установки Си-инструментария от Cosmic Software переходим по ссылке и скачиваем инструментарий «STM8 32k free tools 2010 special edition», предварительно заполнив регистрационные данные. Далее устанавливаем инструментарий, отправляем информацию, выданную при его установке, на электронную почту «stm8_32k@cosmic.fr». Спустя некоторое время вам придет ответное письмо с файлом лицензии. Теперь вы можете активировать Си-инструментарий, запустив среду разработки «Пуск ® Программы ® Cosmic Tools ® STM8 32K Compiler 4.3.4 ® CXSTM8», которая предложит вам активировать продукт двумя методами. Мы выбираем «Specify the License File» и указываем файл с лицензией.
На сайте STMicroelectronics вы можете найти всю необходимую информацию для работы c STM8S. На основе одного из примеров мы рассмотрим проект, более подробно останавливаясь на ключевых моментах. Также мы остановимся на двух библиотеках — сенсорной и библиотеке стандартной периферии микроконтроллера — написанных инженерами STMicroelectronics для быстрого освоения всех линеек МК и вывода продукции на рынок. Вы можете отказаться от использования библиотек и работать напрямую с именами регистров или написать собственное программное обеспечение для работы с периферией микроконтроллера.
Обзор библиотек
Библиотека стандартной периферии содержит набор функций, структур данных и макросов, охватывающих свойства периферии микроконтроллеров STM8S. Использование библиотеки в значительной степени облегчает процесс разработки собственного программного обеспечения, т.к. устраняется необходимость изучения документации с именами регистров и их функционального назначения. Последняя версия библиотеки со всей необходимой информацией доступна по ссылке , раздел «firmware». Структура библиотеки представлена на рис. 2.
Рис. 2. Структура библиотеки стандартной периферии
Заголовочный файл «stm8s.h» содержит определения констант и структур регистров для всей периферии. Для использования библиотеки данный файл необходимо включить («#include "stm8s.h"») в основной листинг программы «main.c», и раскомментировать строку («#define USE_STDPERIPH_DRIVER»). Функционал каждого периферийного модуля состоит из заголовочного и исполняемого файла, например, для GPIO — это «stm8s_gpio.h» и «sym8s_gpio.с». В заголовочном файле описаны все переменные, константы, структуры данных и функции, обеспечивающие полный функционал конкретного периферийного модуля. В исполняемом файле осуществляется реализация функционала, описанного в заголовочном файле.
В заголовочном файле «stm8s_type.h» стандартные типы переменных стандарта ANSI C переопределены в более короткие и понятные имена типов. В конечном счете вы можете скорректировать данный файл под наиболее понятные и удобные для вас имена типов.
Заголовочный файл «stm8s_conf.h» используется для конфигурирования библиотеки необходимых для работы периферийных модулей, задания определенных констант (например, тактовой частоты работы ядра). Это осуществляется через раскомментирование макроопределений, соответствующих определенному периферийному модулю, например, в приведенном ниже листинге расскомментированы вторая и четвертая строки:
2. #define _CLK (1)
4. #define _EXTI (1)
5. /**** FLASH/DATA EEPROM ****/
6. /**** #define _FLASH (1) ****/
В связи с наличием разной периферии в файле «stm8s_conf.h» учтены особенности периферийных модулей для определенного микроконтроллера. Например, в нижеприведенном листинге таймер 3 определен только в микроконтроллерах STM8S208, STM8S207 и STM8S105:
2. #if defined(STM8S208) || defined(STM8S207) ||
4. #endif /**** (STM8S208) || (STM8S207) ||
Работа с библиотекой и ее использование на конкретном примере будут рассмотрены ниже в разделе «Создание нового проекта, конфигурирование библиотек». Более подробную информацию, файл справки «stm8s_fwlib_um.chm» вы можете посмотреть либо по ссылке, либо в директории «STM8S_StdPeriph_Driver» загруженного пакета программного обеспечения.
При использовании прерываний необходимо быть внимательным, так как обработка источников прерывания различна для обоих инструментариев. Для инструментария от Raisonance используется функция без параметров (void) с префиксом «interrupt» и номера прерывания, например:
// Код обработки прерывания
// Код обработки прерывания
Для инструментария от Cosmic все «пустые» обработчики прерывания описаны в файле «stm8s_it.c», и весь код по обработке прерывания следует размещать здесь. Таблица векторов прерывания располагается в «stm8s_interrupt_vector.c», который связан с документом «stm8s_it.c» через заголовочный файл. Для более подробного ознакомления с обработкой прерываний и особенностями компилятора необходимо посмотреть документацию соответствующего компилятора.
Сенсорная библиотека разработана инженерами STMicroelectronics для применения в микроконтроллерах STM8, так как в настоящее время популярность и актуальность использования решений на основе сенсоров очень велика. Библиотека представляет собой набор совместимых С-файлов, включающих API, который образует интерфейс для работы с другими уровнями программного обеспечения. У компании STMicroelectronics существуют разнообразные решения в данной области, более подробную информацию вы можете получить на сайте компании. Структура библиотеки представлена на рис. 3.
Рис. 3. Структура сенсорной библиотеки
Для использования библиотеки в приложении необходимо добавить все заголовочные и исполняемые файлы в проект. Исключение составляют два файла — «STM8_TSL_RC_Configuration_TOADAPT.h» и «STM8_TSL_RC_routines.asm». Первый копируется в директорию проекта и переименовывается в «stm8_TSL_RC_Configuration.h». Второй добавляется в проект только при использовании инструментария от Raisonance. Файлы «stm8_tsl_rc_api.h» и «stm8_tsl_rc_api.c» определяют функции API, переменные, структуры данных, константы для связи между библиотекой и кодом пользователя. Для использования библиотеки заголовочный файл «stm8_tsl_rc_api.h» должен быть включен в основной исполняемый файл «main.c». Документ «stm8_TSL_RC_Configuration.h» содержит статические конфигурационные параметры, которые должны быть сконфигурированы в соответствии с аппаратной частью проекта. Необходимо проверить все параметры с префиксом «#define» в соответствии с правильными значениями. Более подробно работа с библиотекой будет рассмотрена в разделе «Проект discover».
Среда разработки ST Visual Developer
Для начала работы нам необходимо ознакомиться со средой разработки ST Visual Developer. В среде существуют два основных понятия — проект и рабочая область.
Одна рабочая область может содержать несколько проектов. Это может быть удобно при разработке ПО. Рабочая область создается или открывается через «File ® New Workspace…» или «File ® Open Workspace…». В уже созданной рабочей области можно создавать, удалять и добавлять новый проект через «Project ® Add New Project to WorkSpace…», «Project ® Remove Project from WorkSpace» или «Project ® Insert Project to WorkSpace…». Для работы с определенным проектом необходимо его сделать активным: «Project ® Set Active Project». Все вышеописанные операции также можно выполнить, кликнув правой кнопкой мыши на проекте или рабочей области. Добавление папок и файлов в проект осуществляется кликом правой кнопки мыши на проекте или файле; в выпадающем меню вам будут доступны эти операции. Операции по компилированию и сборке проекта доступны во вкладке основного меню «Build ® Compile filename», «Build ® Build», «Build ® Rebuild All». Выбор программатора-отладчика доступен во вкладке «Debug Instrument ® Target Settings…», а все операции по отладке находятся во вкладке основного меню «Debug» и на дополнительной панели инструментов. Для отдельной настройки каждого проекта в среде, по умолчанию, доступны два режима конфигурации проекта — «debug» и «release». Режим «debug» предназначен для использования в режиме отладки. Режим «release» предназначен для автономной работы ПО в микроконтроллере без избыточной функциональности режима «debug». Каждый из режимов вы можете настроить персонально или создать свой собственный режим со специфичными для вас настройками. Более подробную информацию для работы со средой вы можете прочитать в соответствующем руководстве.
Структура пакета программного обеспечения микроконтроллера STM8S-Diccovery
Для дальнейшей работы нам необходимо скачать пакет программного обеспечения (примеры, библиотеки, файлы справки (8,5 Мбайт) для оценочного набора STM8S-Discovery. Пакет имеет следующую структуру:
- «Libraries»- директория состоит из двух частей:
- inc- в ней хранятся заголовочные файлы проекта, включая конфигурационные файлы для сенсорной библиотеки (STM8_TSL_RC_Configuration.h) и библиотеки периферийных устройств (stm8s_conf.h);
- src- в ней хранятся все файлы исходных текстов, включенные и используемые в проекте (main.c, stm8_interrupt_vector.c и др.);
- STVD(Raisonance, Cosmic)- в ней хранятся рабочие файлы проектов, областей, настроек (discover.stw).
- Source Files- содержит исходные файлы проекта;
- Source FilesFWLib- содержит исходные файлы библиотеки периферии;
- Source FilesTSLib- содержит исходные файлы сенсорной библиотеки;
- Include Files- содержит заголовочные файлы проекта;
- Include FilesFWlib- содержит заголовочные файлы библиотеки периферии;
- Include FilesSTlib- содержит заголовочные файлы сенсорной библиотеки.
- Скопировать файл «STM8_TSL_RC_Configuration_TOADAPT.h» из директории «C:Program FilesSTMicroelectronicsst_toolsetLibrariesSTM8_TouchSensing_Driverinc» в директорию проекта «C:Program FilesSTMicroelectronicsst_toolsetProjectnew_projectinc» и переименовать данный файл в «STM8_TSL_RC_Configuration.h»;
- Сконфигурировать файл «STM8_TSL_RC_Configuration.h» в соответствии с аппаратными особенностями проекта;
- Добавить файл «STM8_TSL_RC_Configuration.h» в директорию «Include Files» проекта: «правая кнопка мыши®Add Files to Folder…»;
- При использовании инструментария от Raisonance добавить файлы с расширением «.h» и «.c», исключая файл «STM8_TSL_RC_Configuration_TOADAPT.h» из сенсорной библиотеки C:Program FilesSTMicroelectronicsst_toolsetLibrariesSTM8_TouchSensing_Driver», соответственно, в директории «Include FilesTSLib» и «Source FilesTSLib» (рис.9). При использовании инструментария от Cosmic Software файл «STM8_TSL_RC_routines.asm» также не добавляется, вместо него необходимо сконфигурировать «Project® Settings® Linker», что будет описано ниже;
- Добавить строчку «#include <stm8_tsl_rc_api.h>» в основной файл проекта «main.c»;
- Некоторые функции библиотеки должны быть расположены в памяти по специальным адресам при использовании инструментария Cosmic software (рис.10):
Рис. 10. Конфигурирование сенсорной библиотеки для Cosmic software
- При использовании инструментария Raisonance в операциях с «Project® Settings® Linker» нет необходимости. Необходимо всего лишь добавить файл «STM8_TSL_RC_routines.asm» в директорию проекта «Source FilesFWLib».
Общую настройку проекта с обеими библиотеками вы можете посмотреть на примере «discover» в загруженном пакете программного обеспечения.
Проект «discover»
Алгоритм работы программного обеспечения проекта следующий: программа ожидает срабатывания нажатия сенсора TS1 и меняет частоту мерцания светодиода LD1. Рассмотрим проект более подробно. Открываем среду разработки ST Visual Developer, затем «File ® Open Workspace…» и выбираем проект по следующему пути C:Program FilesSTMicroelectronicsst_toolsetProjectdiscoverSTVDRaisonance». Как вы можете заметить, у данного проекта структура фактически идентична шаблону проекта «project_template» и используются обе библиотеки — сенсорная библиотека и библиотека периферии. Рассмотрим более подробно основные моменты основного файла проекта «main.c».
// Заголовочный файл библиотеки периферии
// Заголовочный файл сенсорной библиотеки
// Объявление глобальных переменных
//Конфигурация тактового сигнала
// Конфигурация портов ввода/вывода
// Инициализация сенсорной библиотеки
// Инициализация сенсорных кнопок
// Старт таймера для управления частотой
мерцания светодиода LD1 с периодом 100 мс
// Основной цикл программы
// Главная функция сенсорной библиотеки
// Реализация объявленных функций
Программы для микроконтроллеров имеют похожие структуры, точкой входа программы является функция «main()». Для начала работы с микроконтроллером, в зависимости от задачи, его необходимо сконфигурировать — настроить тактовые частоты, периферийные модули, разрешить прерывания, если необходимо. После этого уже запускается т.н. диспетчер, обычно — это бесконечный цикл «while(1)<….>» или «for(;;)<….>», в контексте которого уже и выполняются функции основной программы — реакция на события, выполнение вычислений и т.д.
В проекте из библиотеки стандартной периферии используются функции для настройки тактового сигнала, настройка работы с портами ввода/вывода. С помощью функции «CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1)» в качестве источника тактового сигнала выбирается внутренний генератор HSI, работающий на частоте 16 МГц, коэффициент деления равен 1, соответственно рабочая частота микроконтроллера равна 16 МГц. Для работы со светодиодом LD1 необходимо настроить соответствующую ему ножку ввода/вывода. Данная операция выполняется с помощью функции библиотеки «GPIO_Init(GPIOD, GPIO_PIN_0, GPIO_MODE_OUT_PP_LOW_FAST)». По передаваемым параметрам функции видно, что используется ножка «0» порта «D» микроконтроллера, режим push — pull, режим быстрого переключения (до 10 МГц), и в данный момент на ее выходе — сигнал низкого уровня. Переключение состояния ножки осуществляется с помощью функции «GPIO_WriteReverse(GPIOD, GPIO_PIN_0)».
Процесс работы с сенсорной библиотекой начинается с ее инициализации: «TSL_Init()» — инициализация памяти, функций и структур данных. Далее необходимо настроить библиотеку согласно аппаратным требованиям. В нашем случае библиотека настраивается под сенсорную кнопку TS1 в функции ExtraCode_Init(). После того, как все настроено, можно начинать работать с библиотекой, которая предоставляет API для работы с ней, нам в частности необходимо определять событие нажатия TS1. Данная операция осуществляется в функции «ExtraCode_StateMachine()», также здесь задается режим мерцания светодиода LD1. Для работоспособности сенсорной библиотеки необходимо включать в основной цикл программы (диспетчер) функцию «TSL_Action()», которая выполняет необходимые операции для обработки и определения событий сенсорных кнопок и других сенсорных объектов.
Заключение
В статье мы представили необходимую информацию для начала работы с микроконтроллерами STM8. В материале были рассмотрены лишь основные моменты, для более подробного и глубокого ознакомления читателю следует обращаться к справочным материалам, доступным на сайте.
Изучаем STM8S Медленный старт. Часть 0
При написании данной статьи, я предполагаю, что читающий умеет:
- Внимательно читать (что редкость)
- Немного работать с англоязычной технической литературой (ну или мотивацию научиться, т.к. первый язык программиста — английский)
- Паять (хотя бы минимальные навыки)
- Программировать на С (опять же, не все так сложно)
- Гуглить (без этого никуда)
- Пользоваться мультиметром и имеет прочие базовые навыки (по типу «не суй пальцы в розетку»)
- Обзорно пробежать все этапы разработки системы на базе микроконтроллера
- Дать необходимые вводные для человека практически не посвященного
- По возможности формирование у читающего понимания того, где, что и как найти
Думаю имеет смысл сделать подробный курс программирования МК.
Мне послужит поводом изучить всю периферию более детально и попутно поможет другим.
Знаю, что уже существует огромное количество статей и даже обучающих курсов, но я имею слегка иной подход. (Возможно получу адекватную критику, изменю мнение и примкну к MX Cube ребятам).Грустно видеть, как stm контроллеры превращают в arduino.
По поводу arduino:
Есть 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. Необходимое оборудование
Я вижу два варианта работы с МК:
Здорово, классно, мне нравится. Так делают многие люди.
В этом случае для МК нужна будет так называемая обвязка. План простой:
- Берем макетную плату, в моем случае TQFP(32-64PIN)0.8MM, запаиваем на неё МК
- Берем двухрядную гребенку PLS-2×40 припаиваем к отверстиям, которые ведут к выводам МК
- Берем печатную макетную плату (у меня 9х15 см) и припаиваем на нее прошлый бутерброд
- Смотрим RM пункт 7. Power supply, читаем. Написано нужен конденсатор соединяющий вывод VCAP и наши 0В источника питания. Еще написано, что подробней в смотреть нужно в DS к конкретному МК в секции electical characteristics. Для меня это пункт 10.3.1 VCAP external capasitor со ссылкой на Table 18 где и указан номинал 470 — 3300 нФ. Я взял 1 мФ (на схеме C3). (для чего он нужен, надеюсь, почитаете сами в RM)
- Там же в DS в пункте 10.3.8. Reset pin characteristics находим номинал конденсатора 0.1мФ(на схеме C4). Резистор R4 номиналом 10 КОм используют в отладочных платах и различных application note, хотя внутри МК уже есть подтягивающий резистор номиналом от 30 до 80 КОм (если верить тому же DS). Параллельно конденсатору C4 ставим нашу кнопку сброса. Такую схему сброса можно увидеть например в Desighn note DN0005.
- Также, ST любят добавлять на отладочные платы конденсаторы по питанию на 100нФ, в количестве N выводов подключенных к питанию +1. На схеме нарисовано всего C1, C2 и C5 3 шт, и на плату я их не паял, но смысл вы поняли. На столе работать будет и без них, а в реальной коммерческой разработке лучше этим делом озаботиться при разведении платы устройства.
- Распаять 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, для меня путь:
Находим среди заголовочных файлов iostm8 свою модель МК, для меня:
Подключаем её в самом начале и добавляем бесконечный цикл.
В меню 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)
STM8S-Discovery review and tutorial
STMicroelectronics recently released the STM8S-Discovery, an exceedingly cheap (RRP $7) evaluation kit for one of their 8-bit microcontrollers. It features the microcontroller itself (an STM8S105C6), running at up to 16MHz and offering 32KB of program memory, 2KB of RAM and 1KB of data EEPROM. This microcontroller has a solid set of on-board peripherals, including four timers (one advanced, one general-purpose, and one basic), SPI, I 2 C, UART, and ADC – so there are plenty of connectivity options. The device offers up to 38 general-purpose I/O pins.
The evaluation board is pretty feature-packed, and includes an integrated ST-LINK for programming and debugging over USB. The circuit board has been designed so that you can simply snap off the ST-LINK part if you’d like to use the microcontroller on its own. Standard 0.1″ pin headers are provided to permit you to connect the board to other components, and a small wrapping area is also present. A jumper can be used to select 5V or 3.3V operation.
A green LED and a touch sensitive key are built into the evaluation board; the device comes pre-programmed with a demo program that flashes this LED at different rates when you touch the key.
All in all, a decent piece of kit – but what really sets it apart is its price. ST’s recommended price is $7; I bought mine for £4.25 from Farnell. All you need to do is provide a USB A to USB B cable and download the various development tools (Windows only at the time of writing), datasheets and libraries.
First impressions
I really wasn’t expecting much for £4.25, but am very impressed with the hardware. It’s solidly built and comes attractively packaged, with clear instructions on the back of the box on how to run the demo program (just plug it in to a USB port!) and where to go next for development tools.
Unfortunately, what appears to be lacking at the moment – not surprisingly for a new product – is guidance for absolute beginners with ST’s microcontrollers. Hopefully that will improve as more people get hold of these new kits, as their incredibly low price and self-contained nature makes them ideal for beginners (no need to build up a collection of parts or buy a programmer to get started, just plug and play). I personally found the documentation quite baffling, and judging by a thread on Hack a Day I wasn’t the only one.
I’m not an expert with ST’s microcontrollers, but I have at least managed to get something running on the microcontroller after a few frustrating hours spent with the current documentation. The following code may not be the best, but it is simple and it should work (if I’ve missed anything out or not been clear enough anywhere, please let me know so I can fix it). It doesn’t go into any great detail; my assumption is that if you can get some code you’ve written yourself running on your evaluation board and understand how to use the basic peripherals offered by the microcontroller to work with the board’s LED and touch key you should be ready enough to dive into the official documentation and sample code yourself!
Getting started
If you visit the STM8S-Discovery page, you will see options to download various pieces of software and development tools. You’ll need to download the following:
- A C compiler (I’m currently using Cosmic’s, but it’s worth installing the Raisonance compiler too).
- The ST MCU Toolset, which includes the ST Visual Develop IDE.
- The application development package (this contains examples and relevant libraries to access the various peripherals of the chip).
- The STM8S105C6 datasheet (invaluable device specifications/information).
- The STM8S microcontroller family reference manual (a general overview of the STMS8 family, including documentation on the various on-board peripherals).
- The STM8S-Discovery evaluation board user manual (information specific to the evaluation board, including circuit diagrams and other specifications).
There is a document that accompanies the development package, Developing and debugging your STM8S-DISCOVERY application code, which contains instructions on setting up a project – confusingly, these directions don’t appear to apply to Raisonance’s tool chain, and rely on copying and pasting files from the demo programs. You will need to register the compilers to be able to use them, and Cosmic’s registration process is handled by a human so may take some time for you to receive your licence key.
Debugging one of the sample programs
One way to verify that everything is set up correctly and to try out the development tools is to build one of the sample programs included as part of the application development package. In this zip file you will find a directory named STM8S-Discovery_dev; extract this somewhere sensible. Run ST Visual Develop, and select File→Open Workspace. Open the file STM8S-Discovery_dev\Project\Discover\STVD\Cosmic\Discover.stw – this is the project that came pre-loaded onto the evaluation board. If you click Build→Build it should crunch away and after a few seconds should report that there were no errors.
We’ll now need to set up the IDE to use your evaluation board’s ST-LINK as its debugging instrument. Click Debug instrument→Target Settings and select Swim ST-Link in the dropdown. You can leave the other settings as they are; click OK to close the dialog.
If you now click Debug→Start Debugging (or the blue «D» in the toolbar) the IDE should program the evaluation board and then enter the debugger in «Break» mode. Press Continue (F5) to start running the program; at this point you should be able to use the touch sensitive key on the board to change the rate at which the green LED flashes. When you’re done, click Debug→Stop Debugging (or the red cross button in the toolbar) to stop debugging.
The debugger shouldn’t be especially surprising to anyone who has used a graphical debugger (e.g. Visual Studio) before. Try going to line 148 in main.c – BlinkSpeed++; – and selecting Edit→Insert/Remove Breakpoint. Start debugging as before, and you’ll notice that when you touch the key this time the debugger breaks on that line. Click Debug→Continue and the program will continue. Marvellous – all pretty intuitive thus far.
Creating your own project
Creating your own project is a rather more involved process, as there’s quite a lot you need to set up first. Hopefully this step-by-step guide should help!
- Firstly, click File→New Workspace, and select Create Workspace and Project from the dialog that appears.
- Now, we need to store our workspace (analagous to a solution in Visual Studio) somewhere; create a new directory for the workspace that is preferably not inside Program Files and give the workspace a name. I’m going to go for «Blinkenlight» as my workspace name.
- Create a new project with the same name as the solution name. It should default to the same directory; keep this as it is. Select STM8 Cosmic as the toolchain.
- Select STM8S105C6 as the microcontroller.
With that done, you should have a shiny new workspace and project containing two files – main.c, containing the entry point for your application, and stm8_interrupt_vector.c, used to associate interrupt requests with interrupt service routines – more on those later. If you build the project and try to debug it you’ll note that it does precisely nothing of use. Let’s make it do something useful!
Adding the standard firmware library
To access the various peripherals of the microcontroller, ST have provided an extensive standard firmware library. You will need to download this from the STM8S documents and files page; it’s the zip archive named STM8S firmware library. Open the zip archive, and copy the FWLib\library folder to your own project folder. You may wish to rename the library folder FWLib, so you should end up with the two folders Project\FWLib\inc and Project\FWLib\src.
There is a folder named project in the firmware library download – copy stm8s_conf.h from this folder into the root of your project folder.
Now, return to ST Visual Develop. Use the workspace panel to the left to create two new folders in your project – Source Files\FWLib and Include Files\FWLib. Add all of the files from FWLib\inc to Include Files\FWLib and stm8s_conf.h to the root of Include Files. You should now have something that looks like this:
You will also need to inform the firmware library that you are using an STM8S105 microcontroller as opposed to the default STM8S208. Here are two ways of doing this – pick whichever seems easiest to you.
- Open stm8s.h in Project\FWLib\inc, comment out #define STM8S208 and uncomment #define STM8S105 near the top of the file.
- Pass the definition directly to the compiler by clicking Project→Settings, selecting the C Compiler tab and typing STM8S105 into the Preprocessor Definitions field. You will need to do this twice; once for the Debug configuration and once for Release (select the configuration with the drop-down box in the top left).
Illuminating the LED using GPIO
The cathode of the evaluation board’s LED is connected to PD0 on the microcontroller – that is, pin 0 of port D. By driving this pin low we could therefore illuminate the LED. If you consult the documentation for the standard firmware library – it’s the stm8s_fwlib_um.chm file in the zip archive – you can see a number of helper functions dedicated to GPIO, or «general-purpose I/O». To use the GPIO functions, we need to do two things:
- Add FWLib\src\stm8s_gpio.c to the project under Source Files\FWLib.
- Enable inclusion of the relevant GPIO header files, achieved by uncommenting #define _GPIO (1) in stms8_conf.h
Both steps will need to be carried out whenever you want to use a new peripheral (e.g. a timer or the UART). Once that’s done, you can modify main.c to read as follows:
There are more comments than code there – using the firmware library makes life rather easy, once it’s set up! If you start debugging that, you’ll note that the LED does indeed light up. It’s not much, but it’s a sign of life.
Flashing the LED using a delay loop
The GPIO library provides a handy GPIO_WriteReverse() function, which inverts the state of a pin. By toggling PD0, we can make the LED flash. To slow this flashing down at a rate we can see, a delay loop is introduced that delays for 50,000 nops, plus overhead of the for loop structure, between calls to GPIO_WriteReverse().
The reason for the nop() is that without it, the compiler optimises away the entire for loop as it does nothing useful.
Well, that’s a bit more dynamic, but surely there’s a better way to do this than a hard-coded delay loop?
Timers – of which the STM8S has four with varying capabilities – are an extremely versatile peripheral. They are typically based around a counter, which counts up or down, and various events can be triggered when this counter reaches particular values. We’ll start here by using the TIM3 peripheral.
To use TIM3 we need to perform the following steps, as we did previously for GPIO:
- Add FWLib\src\stm8s_tim3.c to the project under Source Files\FWLib.
- Uncomment #define _TIM3 (1) in stms8_conf.h
By default, the microcontroller uses its internal 16MHz RC oscillator («HSI», or high-speed internal) divided by eight as a clock source. This results in a base timer frequency of 2MHz. When configuring a timer, you can specify a prescaler to further divide the clock frequency – if you were to divide the 2MHz clock frequency by 2000, the timer would count up once every millisecond.
TIM3 restricts the prescaler to powers of two between 1 and 32,768, so we’ll use a prescaler of 2048 (that’s close enough for jazz). You also need to specify a timer period; this is the value up to which the timer will count before resetting itself. With a period of 999, the timer will run from 0 to 999 before resetting – approximately one thousand milliseconds, or one second, from start to finish.
Using the standard firmware library allows for easy timer configuration. Now that we have a timer running, we can query its counter value to flash the LED – if it’s in the range 0
499, switch the LED on; if it’s in the range 500
999, switch the LED off. Building on the ealier source code, here’s a program that does just that:
Pulse-width modulation for flashing
One of the many features of these timers is the ability to generate pulse-width modulation – PWM – output on dedicated pins. When this feature is enabled, the timer will set the output pin to one logic level when it starts or restarts and to another when it reaches a used-defined threshold. This is effectively what we’re doing in our current program, just manually – far better if the timer could do it for us automatically!
The green LED is connected to PD0, which also acts as TIM3_CH2, or TIM3‘s channel 2. We can remove most of the code from our previous program, including the GPIO code, leaving us with the following:
In PWM1 mode, the output starts in the activated state. As we have specified that TIM3_OCPOLARITY_LOW is an activated state, this means that the output will start at a logic low (the LED will be illuminated). When the capture compare value (500) is reached, the output will switch to the deactivated state (logic high) and the LED will switch off. If you run this program as before you will see that the LED does indeed flash on and off automatically.
Pulse-width modulation to change brightness
As the LED is on for approximately 500ms and off for approximately 500ms it is on half of the time. On average, therefore, it is at half its possible brightness. If you modify the 500 in the TIM3_OC2Init function call to 250 and run the program again you will see that on for a quarter of the possible time, and at 750 it is on for three quarters of the possible time. By increasing the rate at which the LED flashes so that it appears to be continuously lit we can control its apparent brightness by adjusting the relative amount of time it is switched on in comparison to the time it is switched off.
We can increase the rate at which the LED flashes by reducing the prescaler of TIM3. Try changing the TIM3_TimeBaseInit call to use TIM3_PRESCALER_16 instead of TIM3_PRESCALER_2048, and change the capture compare value in the TIM3_OC2Init call to 100. When you run your program, the LED on the board will appear to be dimly lit. If you pick up the board and very carefully shake it from side to side you should be able to see that the LED is flashing from the dotted trace it leaves in the air. If you drop the prescaler all the way down to TIM3_PRESCALER_1 you will find that you have to shake the board much faster, but take care not to damage anything!
The brightness of the LED can be modified at runtime by changing the value of the capture compare register with the TIM3_SetCompare2 function.
The above program fades the LED up from the minimum brightness to the maximum brightness then back down again in an infinite loop. It also reintroduces our old enemy, the delay loop, which leads us neatly on to the next subject – interrupts.
Interrupts provide a way to respond to events in a way that doesn’t require that we constantly check (poll) the event source. One such event is a timer overflowing – we can use this event to update the brightness of the LED every millisecond without having to poll a timer’s counter manually or use delay loops.
We’ll use TIM1 to generate the interrupt; it provides a few additional features that are not present on the other timers, but we’ll need to keep TIM2 and TIM4 free for later. As before, you’ll need to add stm8s_tim1.c to your project and uncomment #define _TIM1 (1) in stm8s_conf.h.
We’ll start by adding some skeleton interrupt handler code and reference it in the interrupt vector table to ensure that it is called when the timer updates itself. Firstly, add the two following files to your project:
These stm8s_it files contain the interrupt request handlers. Interrupt handler functions are called via the interrupt vector table, which is defined in the stm8_interrupt_vector.c file that was automatically generated when you created the project. Open this file and add #include "stm8s_it.h" to the top of it so that it can see your interrupt handler functions. According to the STM8S105xx datasheet the TIM1 update/overflow interrupt is mapped to IRQ 11, so scroll down the table of interrupt vectors and change NonHandledInterrupt on the line marked irq11 (some lines omitted for clarity):
Now we have that in place we can start writing the interrupt handler code. Internally, interrupts are signalled by setting a flag in a control register, which the microcontroller periodically checks. If you do not clear this flag the microcontroller will call your interrupt handler again as soon as you return from the function, so you must remember to do so – this is done with the TIM1_ClearITPendingBit(TIM1_IT_UPDATE) function. Using a variable to store the current brightness «direction» (positive to get brighter; negative to get dimmer) the LED brightness could be adjusted every time the timer overflowed using the following code:
We also need to configure TIM1 to generate interrupts. This can be done with the TIM1_ITConfig function, in addition to the existing code used to configure TIM3:
Interrupts are globally disabled by default, hence the need to call enableInterrupts(). If you run this program, you should find that the LED fades in and out as before, but without the need for hacky delay loops. As you can see, TIM1 takes a few additional parameters to its TIM1_TimeBaseInit function; you aren’t limited to powers of two for its prescaler, it can count in a number of different ways and you can specify a «repetition count» that will only update the timer registers after a given number of cycles of the counter (in this case, we’ve disabled that feature).
Touch key input
As well as an LED for output, the evaluation board provides a touch key for input. This requires considerably more computing power to handle than a conventional push switch, but is considerably more interesting! Thankfully, ST have provided a royalty-free library to handle touch sensing keys, sliders and wheels with their microcontrollers which we can use:
- Visit the documents and files page again to download the STM8S Touch Sensing Library; it is packaged as an installer, which should be run.
- Go to the installation directory and copy Libraries\STM8_TouchSensing_Driver to your own project folder as you did for FWLib previously.
- Move Inc\STM8_TSL_RC_Configuration_TOADAPT.h to the root of your project folder and rename it STM8_TSL_RC_Configuration_TOADAPT.h (remove «_TOADAPT»).
When you have copied the files, switch back to your project and follow these steps:
- Create a folder Touch Sensing Library under Source Files and add all of the files in STM8_TouchSensing_Driver\Src apart from STM8_TSL_RC_MultiChannelKey.c to it.
- Create a folder Touch Sensing Library under Include Files and add all of the files in STM8_TouchSensing_Driver\Inc to it.
- Add STM8_TSL_RC_Configuration.h to the root of Include Files.
Due to some functions needing to be aligned to even memory addresses, you will need to modify your linker settings. In the IDE, click Project→Settings and switch to the Linker tab. Set the Category dropdown to Input, expand the Code, Constants section and add a section named .TSL_IO_ALCODE with its options set to -r2. You will need to do this to both Debug and Release configurations.
Now we need to go and configure STM8_TSL_RC_Configuration.h for our particular hardware. Open this file, and make the following amendments:
- TIMACQ will need to be changed to TIM2 as we’re using TIM3 to drive our LED.
- TIMACQ_CNTR_ADD needs to be changed to 0x530A to match the change to TIM2.
- The touch key is attached to GPIO port C so LOADREF_PORT_ADDR needs to be changed to GPIOC_BaseAddress.
- The load reference is connected to pin PC2, so we need to change LOADREF_BIT to 0x04 (1<<2 = 0x04).
- We only have one key, so change SCKEY_P1_KEY_COUNT to 1.
- The touch key input is connected to PC1, so leave SCKEY_P1_PORT_ADDR at GPIOC_BaseAddress and SCKEY_P1_A at 0x02 (1<<1 = 0x02). As there are no other keys on that port, set all of the other key masks (SCKEY_P1_B to SCKEY_P1_H) to 0.
- As we don’t have any keys on a second port, set SCKEY_P2_KEY_COUNT, SCKEY_P2_PORT_ADDR and SCKEY_P2_A—SCKEY_P2_H to 0.
- As we don’t have any multi-channel keys, set NUMBER_OF_MULTI_CHANNEL_KEYS to 0.
- The touch key electrodes are connected to PC1 and PC2, so set GPIOC_ELECTRODES_MASK to 0x0A (0b00001010). Set all of the other electrode masks to 0.
Whew, quite a lot of work there! Now we’ve set that up, we can get programming. Try building your project; it should take a bit longer than before, but not emit any errors if you’ve set things up correctly!
The first thing we need to change in our program is to switch to running at 16MHz, a requirement of the touch sensing library. To do this, we need to use the CLK peripheral library; add stm8s_clk.c to Source Files\FWLib as before, and uncomment #define _CLK (1) in stm8s_conf.h. Now add CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1) to the start of your main() function to set the internal high-speed oscillator prescaler to 1 (it defaults to eight). If you now build and run your project you will notice that the LED fades up and down much faster – eight times faster, in fact. Change the TIM1 prescaler to 8000 to revert to the old speed:
Now we’ve got that organised, we can go ahead with using the touch sensing library. Start by adding #include "STM8_TSL_RC_API.h" to the top of main.c. We need to initialise the library and the touch key in our main function; add the following lines after the CLK_HSIPrescalerConfig call:
The touch sensing library makes use of a timer interrupt. We’ve set TIMTICK to TIM4, so need to attach the TIM4 update/overflow interrupt (IRQ 23) to TSL_Timer_ISR. Open stm8_interrupt_vector.c, add #include "STM8_TSL_RC_API.h" to the top of it, then modify the vector marked irq23:
Some lines are, as before, omitted for clarity.
The infinite loop at the end of the program will need to be modified to call the TSL_Action function to update the touch sensing library’s internal state machine, then check the state of the touch sensing library to see if there’s any input to be processed:
Set a breakpoint on the nop() line, then build and run the program. The LED will fade up and down as before, but if all has gone to plan touching the key should break execution on the nop() line. A slightly more useful program is shown below, modifying the current LED fading code to only fade out and using the touch key to set the LED to its maximum brightness when tapped.
Now that you’ve got this far, you should be able to delve into the documentation and samples provided by ST to find out more about this platform. If ST can keep the price as low as they currently recommend, then this is an extremely attractive platform for hobbyists, especially beginners as you don’t need any additional tools barring a USB A to USB B cable – I have deliberately avoided interfacing with external components, for that reason. The hardware is extremely capable, low price or not, so I’m sure we’ll see many interesting projects created with this board as a starting point!
Каждый проект состоит из трех поддиректорий:
Итак, копируем папки «Libraries» и «Project» в рабочую область, где мы предполагаем их использовать, например, в следующее местоположение: «C:Program FilesSTMicroelectronicsst_toolset». Теперь запускаем среду разработки «Пуск ® Программы ® ST Toolset ® Development Tools — ST Visual Develop», кликаем «File ® Open Workspace…» и открываем проект «discover» из папки «C:Program FilesSTMicroelectronicsst_toolsetProjectdiscoverSTVDRaisonance» или «C:Program FilesSTMicroelectronicsst_toolsetProjectdiscoverSTVDCosmic». Теперь мы можем скомпилировать, собрать, прошить микроконтроллер и запустить программу на исполнение. Сборка проекта должна пройти без каких-либо проблем, единственное, что понадобится сделать — это выбрать программатор-отладчик ST-Link через «Debug instrument ® Target Settings ® Swim ST-Link» (рис. 4). Если по каким-то причинам сборка проекта произошла с ошибками, ниже будут приведены все настройки проекта.
Рис. 4. Свойства проекта
Самостоятельная настройка проекта
Если вы решили разместить проект, библиотеки, исходные и заголовочные файлы по вашему собственному усмотрению или создать проект «с нуля», то у вас могут возникнуть проблемы с линковкой файлов библиотек. Все пути к этим файлам можно прописать вручную, но это слишком загромождает проект и делает ваш код менее наглядным. Ниже будут приведены основные настройки проекта для каждого из Си-инструментария в отдельности, и начнем мы с настройки инструментария от Raisonance. Заметим, что в качестве примера будет использоваться проект «discover», скачанный по вышеприведенной ссылке. Переходим на «Projects ® Settings…» (рис. 4).
В поле «Toolset» выбирается Си-инструментарий с необходимыми настройками, в нашем случае выбран инструментарий от Raisonance. В поле «Root path» указывается путь к Си-инструментарию, а в «Output directory» — режим конфигурации проекта, для которого и будут применяться все настройки; на рисунке 4 выбран режим «debug».
Следующая вкладка «Projects ® Settings… ®
Debug». В данной вкладке нас интересует поле «Source Directories:», где прописываются пути к используемым файлам проекта с исходным кодом. Для проекта «discover» — это «С:Program filesstmicroelectronicsst_toolsetprojectdiscoversrc», «C:Program filesstmicroelectronicsst_toolsetlibrariesstm8s_stdperiph_driversrc» и «C:Program filesstmicroelectronicsst_toolsetlibrariesstm8_touchsensing_driversrc».
Следующая вкладка «Projects ® Settings… ® MCU Selection». Здесь выбирается тип микроконтроллера — STM8S105C6 для выбранного нами оценочного комплекта.
Следующая вкладка — «Projects ® Settings… ® C Compiler» (рис. 5). В поле «Category» необходимо выбрать «Preprocessor» и далее в поле «Additional include directories» прописать пути к заголовочным файлам, используемым в проекте. Для проекта «discover» — это «C:Program FilesSTMicroelectronicsst_toolsetProjectdiscoverinc», «C:Program FilesSTMicroelectronicsst_toolsetLibrariesSTM8_TouchSensing_Driverinc» и «C:Program FilesSTMicroelectronicsst_toolsetLibrariesSTM8S_StdPeriph_Driverinc».
Рис. 5. Свойства проекта
И последняя вкладка — «Projects ® Settings… ®
Linker». Если вы используете ограниченно-бесплатный Си-инструментарий, то необходимо убрать флажок «Run Code Compressor», иначе при сборке проекта будет сгенерирована ошибка.
Что касается использования Си-инструментария от Cosmic Software, необходимо всего лишь произвести некоторые изменения в поле «General» (рис. 6), остальные настройки идентичны приведенным выше для Raisonance. В частности в поле «Toolset» выбирается Си-инструментарий от Cosmic software и соответствующие настройки.
Рис. 6. Свойства проекта
В разделе, посвященном настройке проекта, были затронуты лишь основные моменты. К сожалению, описать все настройки и тонкости не хватит места, да и в этом, собственного говоря, нет необходимости. Для более детальной информации вам следует обратиться к руководству описания среды ST Visual Developer. Что касается приведенных выше настроек проекта — путей к файлам, вы можете пересобрать и перекомпоновать проект по вашему усмотрению, нужно лишь прописать правильные пути к исходным и заголовочным файлам. По мере работы со средой и приобретения опыта вы сами разберетесь, какие настройки для чего необходимы.
Создание нового проекта,
конфигурирование библиотек
Возможно, по каким-либо причинам у вас не возникнет желания использовать предоставляемые производителем библиотеки. В таком случае вам понадобится следующая информация. Все файлы с описанием регистров находятся в папке «C:Program FilesSTMicroelectronicsst_toolsetinclude». Пути для Си-компилятора прописываются в свойствах проекта «Project ® Settings ® C compiler ® Category Preprocessor». Свойства линковщика находятся в «Project ®Settings ® Linker ® Category Input».
Для создания собственного проекта с использованием библиотек наиболее простым и быстрым методом является использование шаблона проекта «Project_template», расположенного в скачанном пакете в папке «Project». При создании проекта вы вручную создаете папку с названием вашего проекта и копируете туда содержимое проекта «Project_template». Затем в среде ST Visual Develop открываем проект из вновь созданной папки (рис. 7).
Рис. 7. Создание нового проекта
Структура проекта состоит из следующих директорий:
Далее нам необходимо выбрать в свойствах проекта программатор-отладчик, Си-инструментарий, тип микроконтроллера, прописать пути к файлам, если они не указаны. Эти операции описывались выше.
Для использования библиотеки стандартной периферии необходимо убедиться, что в основном файле проекта «main.с» был подключен файл «stm8s.h» (#include <stm8s.h>), который содержится в директории «inc» библиотеки периферии микроконтроллера. Также файл «stm8s.h» необходимо добавить в поддиректорию «Include FilesFWlib», кликнув правой кнопкой мыши на папке, и выбрать в выпадающем меню «Add Files to Folder…» (рис. 7).
Шаблон проекта подразумевает, что разработчик будет использовать библиотеку стандартной периферии микроконтроллера. В другом случае вам нужно закомментировать строку «#define USE_STDPERIPH_DRIVER» в файле «stm8s.h». Если вы все же будете использовать библиотеку стандартной периферии, то вам необходимо выполнить следующие шаги:
1) Убедиться, что строка «#define USE_STDPERIPH_DRIVER» в файле «stm8.h» раскомментирована;
2) Добавить файл «stm8s_conf.h» из директории вашего проекта «My Projectinc» в папку корневого каталога «Include Files» проекта с помощью операции «правая кнопка мыши ® Add Files to Folder…». Для использования какого-либо периферийного модуля необходимо раскомментировать его название в файле «stm8s_conf.h» (рис. 8);
Рис. 8. Конфигурирование библиотеки периферии
3) Вся периферия и функции работы с ней описаны в двух файлах: заголовочном (расширение .h) и исходном (расширение .с) с именем «stm8s_PeriphType». Данные файлы расположены в директориях «inc» и «src» по следующему пути «C:Program FilesSTMicroelectronicsst_toolsetLibrariesSTM8S_StdPeriph_Driver». При использовании любого периферийного модуля в вашем проекте необходимо добавить исходный файл в поддиректорию «Source FilesFWLib», а заголовочный — в «Include FilesFWLib» (рис. 8). Данные операции выполняются кликом правой кнопкой мыши на соответствующей папке: «Правая кнопка мыши ® Add Files to Folder…»
После вышеперечисленных действий вы можете использовать функционал библиотеки периферии. В примере «discover» используется сенсорная кнопка, работа с которой реализована в специальной библиотеке. Для использования библиотеки ее необходимо сконфигурировать следующим образом:
1) Сконфигурировать библиотеку в соответствии с количеством сенсорных кнопок (до 24), ползунков (до двух) и колец (до двух):
Рис. 9. Конфигурирование сенсорной библиотеки