4.4 Системный таймер SysTick
Этот таймер не описан подробно в документации на конкретное семейство микроконтроллеров, в Reference manual про него присутствует всего лишь несколько строк. Таймер SysTick расположен в ядре микроконтроллера и для всех устройств на базе ядра Cortex является стандартным. Этот таймер предназначен для формирования временных интервалов операционной системы реального времени – RTOS. Но и для других целей можно использовать периодические прерывания, формируемые этим таймером. В микроконтроллерах на ядре Cortex время перехода к обработчику прерывания строго детерминировано, что является огромным плюсом этого ядра.
Таймер представляет собой 24-разрядный декрементирующий счетчик. Источником тактирования является системная тактовая частота SYSCLK, либо та же частота, но поделенная на 8 – SYSCLK/8. В составе таймера имеются следующие регистры:
1. SYSTICK Current Value Register – счетный регистр, с каждым тактом уменьшающий содержимое на 1. При достижении нулевого значения в счетном регистре генерируется прерывание.
2. SYSTICK Reload Value Register – в этом регистре хранится значение для перезагрузки счетного регистра после обнуления.
3. SYSTICK Control and Status Register — регистр управления и статуса, здесь выбирается тактовая частота, запускается счетчик, разрешается генерация прерывания.
Контроллер прерываний NVIC всегда ожидает прерывания от этого таймера, достаточно только загрузить регистры таймера нужными значениями, разрешить генерацию прерываний и запустить счет, и тогда в устройстве будет источник периодических прерываний, при этом периферийные таймеры можно использовать для других целей. Для конфигурации таймера в файле core_cm3.h есть функция SysTick_Config(uint32_t ticks), в качестве аргумента которой передается коэффициент деления тактовой частоты для получения необходимой временной задержки (рис. 19).
Рис. 19 Конфигурация таймера в файле core_cm3.h
Это значение заносится в регистр перезагрузки. В самом начале выполняется проверка на то, что данная величина не выходит за максимальный предел, поскольку счетчик 24-разрядный, а передаваемый аргумент функции является 32-разрядным числом. Далее в функции конфигурации SysTick_Config() задается уровень приоритета прерывания, обнуляется счетный регистр, разрешается генерация прерывания, задается источник тактирования и разрешается работа таймера – запускается счет.
По умолчанию тактовая частота этого таймера будет равна системной тактовой частоте SYSCLK. Если же нужно задать частоту тактирования таймера как SYSCLK/8, то уже после этой функции инициализации можно вызвать функцию SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8),
которая находится в файле misc.c. Для этого к проекту необходимо подключить файлы misc.c и misc.h.
5. Справка по С
Для программирования в среде Keil uVision необходимо некоторое понимание языка С и структуры проектов, создаваемых на его базе.
Проект состоит из файлов с расширениями .c и .h. В первых находятся функции во вторых названия используемых функций и константы. Самый главный файл, в котором находится код программы main.c. Для использования различных функций нужно подключать библиотеки с этими функциями. Подключаются они записью #include "название_библиотеки" библиотеки должны быть в проекте. Подключают их в самом начале файла.
Функции – это часть программы. Программа состоит из одной или нескольких функций. Функция имеет вид:
тип_возвращаемой_переменной имя_функции (тип_переменной)
{
Тело функции
}
В функцию можно отправить переменную, функция её обработает и вернёт значение. Очень удобно использовать функцию для повторяющихся действий. Перед тем, как использовать функцию, её нужно объявить в самом начале файла. Делают это в таком виде:
тип_возвращаемой_переменной имя_функции (тип_переменной);
В конце каждой строки должна быть точка с запятой.
Если функция ничего не возвращает (например, временная задержка) то тип указывают void. При запуске, первой всегда выполняется функция main().
Все переменные могут быть разных типов, вот основные:
INT - переменная этого типа может быть только целым числом от -2147483648 до 2147483647
FLOAT - переменная этого типа число с точностью до 7 разрядов от ±1,5*10-45 до ±3,4*1033
DOUBLE - число с точностью до 16 разрядов от ±5*10-324 до ±1,7*10306
ULONG - тоже целое число, но от 0 до 18446744073709551615
LONG - целое от -9223372036854775808 до 9223372036854775807
CHAR - один символ
BOOL - логическая переменная. Она может иметь только 2 значения: истина (true) или ложь (false)
Строку (слово, предложение) можно представить как массив из символов типа char. Например:
char stroka[5] = "Слово";
Здесь квадратных скобках – количество символов в строке, «stroka» – название массива.
Перед использованием переменной её нужно обязательно объявить. (просто указать тип переменной и имя)
Дальше по плану операторы. Операторы - символы при помощи которых производятся какие либо операции над переменными.
+ – сложение.
- – вычитание.
* – умножение.
/ – деление.
= – присвоение переменной значения.
Например выражение a=b+c значит присвоить переменной a значение суммы значений переменных b и c.
++ – инкремент. Увеличение значения переменной на 1
-- – декремент. Уменьшение значения переменной на 1
Например, выражение a++ значит увеличить значение переменной a на 1 (то же самое, что и a=a+1)
== – сравнение, знак «равно».
!= – сравнение, знак «не равно».
< – сравнение, знак «меньше».
<= – сравнение, знак «меньше или равно».
> – сравнение, знак «больше».
>= – сравнение, знак «больше или равно».
Например выражение a<b становится истинным, если значение ,переменной a меньше значения переменной b и ложным, если значения равны или a больше b.
Выражение a==b истинно если a равно b и ложно, если a не равно b, НО выражение a=b истинно всегда, потому что это не сравнение, это присвоение
переменной a значения переменной b.
% – остаток от деления
Например, если a=5, b=3, то значение выражения a%b будет равно 2 (т.к. 5/3=1 (ост.2))
<< – побитовый сдвиг влево. Не вдаваясь в подробности, значение выражения a<<b на языке Си будет равно выражению a*2b
>> – побитовый сдвиг вправо. Выражение a>>b в программе равносильно выражению a/2b
& – логическое И.
| – логическое ИЛИ.
~ – инвертирование.
Циклы. Основные:
while(условие) {
тело цикла
}
Тело цикла (всё что в фигурных скобках) выполняется, когда условие истинно (пока условие не станет ложным).
Дальше идёт цикл всех циклов. Цикл со счетчиком. Он выполняется определенное количество раз, выглядит он так:
for (начальное_значение; цикл_выполняется_до, шаг) {
тело цикла
{
Начальное_значение – начальное значение счётчика
Цикл_выполняется_до – до достижения какого значения выполняется цикл
Шаг – с каким шагом счетчик считает
Например
Здесь начальное значение переменной i равно 0, цикл выполняется, пока значение переменной i меньше 10, при каждом выполнении цикла к переменной i прибавляется 1. Так же можно изменять значение переменной прямо в цикле.
Дальше по плану «условный переход»:
if (условие){
тело 1
} else {
тело 2
}
В условном переходе «тело 1» выполняется, если условие истинно и выполняется «тело 2», если условие ложно. Ещё есть такой вариант:
if (условие 1){
тело 1
} else if (условие 2) {
тело 2
}
В этом случае «тело 1» выполняется, если истинно «условие 1», «тело 2» выполняется, если истинно «условие 2». Таких условий может быть сколько угодно, так же может быть одно else.
Условия могут быть простыми и составными: простые - одно логическое выражение, а составное - несколько логических выражений соединённых знаком & (условия истинно, когда все условия соединённые этим знаком истинны) или | (условие истинно, если хотябы одно условие соединённое этим знаком истинно).
Ещё полезная вещь – комментарии. Комментировать можно или после знаков // и до конца строки или начинаются знаками /* и заканчиваются */, в таком случае комментарий может быть любое количество строк. На размер программы комментарии не влияют.
Лабораторная работа №1. Изучение настройки портов ввода\вывода с использованием библиотеки CMSIS.
Цель работы: ознакомиться с созданием проектов для платы, рассмотреть структуру проекта, изучить принципы работы с портами ввода/вывода и организацией их взаимодействия с использованием библиотеки CMSIS.
Оборудование и программное обеспечение: плата STM32VL Discovery, среда разработки Keil uVision 5, библиотека CMSIS, справочное руководство Reference manual для микроконтроллера STM32F100RB.
Светодиоды, предназначенные для программирования, подключены на плате к порту С (рис. 22):
Рис. 22 Подключение светодиодов на плате
Программируемая пользовательская кнопка подключена к порту А (рис. 23):
Рис. 23 Подключение пользовательской кнопки
Ход работы:
1. Создаем новый проект в среде разработки Keil uVision 5.
2. Для создания программы необходимо подключить файл, обеспечивающий инициализацию стека и таблицу векторов прерываний - startup_stm32f10x_md_vl.s Для этого в файле main.c проекта необходимо набрать #include "stm32f10x.h". Либо кликнуть правой кнопкой мыши по пустой строчке в файле main.c, выбрать меню Insert #include file – stm32f10x.h // Device header.
3. Далее, так, как показано в разделе 3, включить утилиту Manage Run-Time Environment и подключить библиотеки периферии: CMSIS – CORE, Device – GPIO, Startup.
4. Необходимо включить тактирование портов. Для определения регистра, ответственного за тактирование порта С обратимся к Reference Manual – раздел Reset and clock control – RCC register map. Находим в таблице IOPCEN и IOPAEN – за него отвечает регистр RCC APB2ENR. Устанавливаем биты 2 и 4 в единицу, таким образом, активируется тактирование портов PA и PC.
5. Теперь необходимо настроить выводы PC8 и PC9 как выходы. Для настройки выводов смотрим в Refrence Manual раздел General-purpose I/Os – GPIO registers. Здесь нам понадобятся регистры конфигурации GPIOx_CRH и GPIOx_CRL.
Задание:
1. Написать код программы для реализации заданного функционала.
2. Запрограммировать плату и продемонстрировать работу программы.
Лабораторная работа №2. Изучение настройки портов ввода/вывода с использованием библиотеки StdPeriph.
Цель работы: ознакомиться с созданием проектов для платы, рассмотреть структуру проекта, изучить принципы работы с портами ввода/вывода и организацией их взаимодействия с использованием библиотеки StdPeriph.
Оборудование и программное обеспечение: плата STM32VL Discovery, среда разработки Keil uVision 5, библиотека StdPeriph, справочное руководство Reference manual для микроконтроллера STM32F100RB.
Ход работы:
1. Создать новый проект в среде разработки Keil uVision 5.
2. Для создания программы необходимо подключить следующие файлы библиотек:
1. Основной файл программы – main.c необходимо создать самостоятельно.
2. Файл инициализации стека и таблицы векторов прерываний - startup_stm32f10x_md_vl.s. Для этого в файле main.c проекта необходимо набрать #include "stm32f10x.h". Либо кликнуть правой кнопкой мыши по пустой строчке в файле main.c, выбрать меню Insert #include file – stm32f10x.h // Device header.
3. В утилите Manage Run-Time Environment и подключить библиотеки периферии: CMSIS – CORE, Device –Startup, Device – StdPeriph Drivers – GPIO, RCC, Framework.
Для подключения указанных файлов следует нажать на кнопку Mange Run-Time Environment на панели (рис. 24)
Рис. 24 Вызов окна Manage Run-Time Environment
0 комментариев