В данном уроке вы освоите основы работы с таймером TIM4 и пройдете небольшую практику. Суть практической работы заключается в том, чтобы как и в самом начале поморгать светодиодом. Резонно назвать этот практикум "Hello, LED-2". В отличие от первого примитивного примера, где задержка (пауза) осуществлялась зависанием микроконтроллера на количество заданных итераций, здесь микроконтроллер зависать не будет. Он будет "слушать" события. Таймер будет создавать эти события в строго определенный промежуток времени. И по возникновении событий можно будет менять состояние линии порта, на которой висит светодиод. По-прежнему я использую отладочную плату "синяя пуля оптовых оценка STM8 доска" и данный пример будет работать вообще на любом STM8 линеек Value и Acces line.

В предыдущем занятии мы создали обработчик прерывания IRQ22, для этого понадобилось создать взаимосвязь между таблицей векторов прерываний и кодом основной программы. Таким связующим звеном послужил файл main.h, в котором был определен прототип функции ADC_int_handler - которая и является обработчиком прерывания. Алгоритм работы функции был помещен в main.c, а ссылку на функцию я вписал в таблицу векторов из файла stm8_interrupt_vector.c.

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

Таблица векторов прерываний находится в памяти программ (flash) в диапазоне адресов 0x008000 - 0x00807F. Каждый вектор занимает 4 байта. Всего векторов 32 и под них отведено 128 байт.

Прерывания (interrupts) приостанавливают выполнение текущей программной инструкции и вызывают совсем другую подпрограмму - обработчик прерывания. После того как обработчик выполнит свои инструкции, то вернет управление обратно в то место, откуда была прервана основная программа. Это может быть полезно, например, если приложение должно синхронизироваться по времени (при срабатывании прерывания таймера в строго заданный интервал времени), если нужно мгновенно отреагировать на внешнее событие (нажали на кнопку), оперативно прочесть значение ADC сразу по завершении преобразования и так далее.

Прерывания от каждого источника прерываний будут вызывать разные обработчики прерываний. В STM8 есть так называемые векторы прерываний, их 32, но фактически могут быть задействованы только 23 из них, так как 9 зарезервированы. Таким образом можно создать до 23 обработчиков прерываний. Примером вектора прерываний может послужить вектор IRQ22 "ADC1", он вызывает подпрограмму-обработчик прерывания, возникшего от источника "ADC1" при окончании преобразования (выставление флага EOC - end of conversion и вызов прерывания) или при возникновении события AWD (Analog watchdog, флаг AWD будет выставлен и вызвано то же самое прерывание, что и при выставлении флага EOC). Таким образом, по флагам можно понять, почему "сработал" этот вектор.

Аналого-цифровой преобразователь STM8 способен перевести аналоговое значение в цифровое с точностью в 10 бит, или с погрешностью в 0,097%. При максимальном уровне сигнала 3.3V, шаг дискретизации будет 3,2 мВ (соответственно, напряжение на входе можно определить с точностью до 3,2 мВ).

Линия аналогового входа имеет довольно большой импеданс и будучи не нагруженной ничем, может собирать все низкочастотные помехи. Особенно хорошо это видно было в последней практической работе, все помехи, все наводки легко попадали на вход. Поэтому, при конструировании электронных изделий необходимо позаботиться о фильтрации сигнала и защите от помех.

В микроконтроллерах STM8S обычных линеек, установлен аналогово-цифровой преобразователь с разрядностью (точностью) 10 бит. Конкретно в STM8S103F3T6 имеется 5 аналоговых линий AIN2-AIN6, способных преобразовывать напряжение в диапазоне от 0 до Vdd. Отладочная плата Blue pill, используемая в этой практике, питает процессор напряжением 3,3V. Соответственно на аналоговую линию можно подавать напряжение в диапазоне от 0 до 3.3V.

10-Битная точность означает, что диапазон напряжений 0-3,3V будет представлен в цифровом виде как 0-1023. 10-битное максимальное число - это 1023 (210-1). Цифра, полученная в результате аналогово-цифрового преобразования, называется дискретным значением АЦП.