Файл: Курсовой проект по курсу Проектирование цифровых вычислительных (у правляющих) устройств.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 17.03.2024
Просмотров: 58
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
Вход BOOT0 предназначен для выбора режима загрузки программы. Если подать на этот вход логический «0», то после сброса ОМК начнёт выполнять программу, записанную во встроенную FLASH-память.
К выводам SWDIO и SWCLK подключаются цепи отладочного интерфейса SWD, с помощью которого выполняется запись программы во FLASH-память ОМК и её отладка.
Все подключения внешних цепей к ССОИ выполняются с помощью разъёмов. К таким цепям относятся аналоговые и дискретные входы, дискретные выходы, цепи питания, линии связи с ВУ, цепи отладочного интерфейса SWD.
-
РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ССОИ-
Общий алгоритм функционирования ПО
-
Алгоритм работы ПО ССОИ изображён на рис. 3.1.
Рис. 3.1 Схема алгоритма основной программы
После сброса ОМК управление передаётся подпрограмме инициализации (блок 1), выполняющей настройку аппаратных средств контроллера и задание начальных значений переменных. После этого запускается бесконечный рабочий цикл программы (блоки 2…9).
В соответствии с ИЗ ССОИ должна циклически выполнять ввод и обработку значений аналоговых и дискретных сигналов, вывод дискретных сигналов, передачу данных на ВУ и индикацию, причём периодичность выполнения всех перечисленных функций равна или кратна периоду опроса аналоговых входов 140. Следовательно, любые операции в рабочем цикле должны начинаться по истечению очередного интервала времени 140. Отсчёт этих интервалов целесообразно реализовать с помощью одного из таймеров- счетчиков (Т/С) ОМК, например, с помощью так называемого системного таймера, имеющегося во всех контроллерах с ядром Cortex-M3. Таймер должен работать постоянно и с периодом 140 устанавливать признак переполнения.
В блоке 2 программа следит за этим признаком и, как только он установится, передаёт управление основным функциям рабочего цикла (блоки 3…9).
В блоке 3 выполняется однократный опрос всех аналоговых входов и обработка новых и ранее полученных данных в соответствии с ИЗ. Результатом обработки являются вычисленные значения RESAIдля каждого канала измерения.
В блоке 4 реализована подпрограмма индикации, поскольку на ССИ выводится информация, связанная с аналоговыми входами.
В блоке 6 осуществляется ввод и обработка данных с дискретных входов. Эта функция должна выполняться с периодичностью TDI= MDI× TAI, MDI= TDI/ TAI = 420 / 140 = 3 то есть в каждом 3 рабочем цикле, поэтому в блоке 5 организован счётчик, изначально равный 3и уменьшающийся в каждом рабочем цикле на единицу. Как только он достигнет нуля, в него записывается число 3 и управление передаётся блоку 6. MDО = TDО / TAI = 420/140 = 3. Поскольку MDО=3, то требуется организовать счётчик в блоке 7.
В блоке 10 выполняется формирование символьной строки для передачи на ВУ и разрешается работа передатчика УАПП. Дальнейшие действия по передаче отдельных символов этой строки осуществляются подпрограммой обработки прерываний от передатчика. Периодичность передачи определяется блоком 8 следующим образом: MCОMM = TCОMM / TAI= 1400/140=10.
-
Подпрограмма инициализации
-
Настройка типового модуля инициализации
В среде Keil uVision в проектах для ОМК семейства STM32F101 типовой модуль инициализации представлен тремя файлами: «system_stm32f10x.c», «startup_stm32f10x_md.s» и «RTE_Device.h». При выполнении курсового проекта изменения вносим только в «RTE_Device.h».
Редактирование файла «RTE_Device.h» выполняем в режиме режиме мастера. Для этого в Keil uVision открываем двойным щелчком файл «RTE_Device.h» и в нижней части окна редактирования выбираем вкладку «Configuration Wizard».
Прежде всего в группе «Clock Configuration» зададим тактовые частоты для различных элементов ОМК. В строке «High-speed External Clock» укажем частоту кварцевого резонатора, подключенного к ОМК, – 12 000 000 (Гц). В строках «System Clock», «HCLK Clock», «APB1 Clock» и «APB2 Clock» задаём значения 36 000 000 (Гц) – внутренняя тактовая частота для большинства встроенных узлов ОМК. В строке «ADC Clock» вводим 9 000 000 (Гц).
Далее частично сконфигурируем используемое встроенное периферийное оборудование УАПП. Поставим галочку напротив группы «USART1», и раскроем эту группу. В строке «USART1_TX_Pin» выберем из списка вывод ОМК, используемый в качестве выхода передатчика линию PA9, в строке «USART1_RX_Pin» – вывод PA10, используемый в качестве входа приемника.
-
Пользовательская инициализация
Очевидно, что в типовом модуле инициализации невозможно учесть все особенности функционирования конкретной МПС, поэтому в программе следует описать дополнительную функцию инициализации и вызвать её в самом начале функции «
main()». Эта функция должна решать следующие задачи: – разрешение работы и настройка используемого встроенного периферийного оборудования ОМК (таймер, УАПП, АЦП, контроллер прерываний);
– настройка используемых выводов ОМК на работу в необходимом режиме (ввод, вывод, специальная функция и т.д.);
– инициализация рабочих переменных программы.
Разрешение работы встроенного оборудования
Разрешим работу встроенных блоков с помощью схемы управления сбросом и синхронизацией (Reset and Clock Control, RCC). Эта схема имеет управляющие регистры RCC_APB1ENR и RCC_APB2ENR, каждый бит которых разрешает или запрещает подачу тактовых импульсов на соответствующий блок.
Листинг разрешающей работу УАПП1, АЦП1, порта А и B:
RCC->APB2ENR |= (
RCC_APB2ENR_USART1EN; // разрешаем УАПП1
RCC_APB2ENR_ADC1EN // разрешаем таймер АЦП1
|RCC_APB2ENR_IOPAEN // разрешаем порт A
|RCC_APB2ENR_IOPBEN // разрешаем порт B
|RCC_APB2ENR_AFIOEN // разрешаем использование
); // альтернативных функций
Настройка системного таймера
Для определения периодичности опроса входов, то есть отсчёта временных интервалов, используем системный таймер, имеющийся во всех ОМК с ядром Cortex-M3. Таймер уменьшает свой значение на единицу с каждым тактовым импульсом, при достижении нуля устанавливает флаг перезагрузки COUNTFLAG, автоматически загружает в счётный регистр заранее заданное значение и продолжает работу. Изменяя перезагружаемое значение, можно задавать нужный период установки COUNTFLAG.
Для правильной настройки системного таймера прежде всего вычисляем перезагружаемое значение. Таймер должен устанавливать COUNTFLAG каждые миллисекунд.
Длительность такта определяется по формуле: =1/ ,
где – тактовая частота процессорного ядра (в нашем случае 36 МГц). Теперь для установки COUNTFLAG через миллисекунд, таймер должен начать счёт с величины:
504000.
Полученное значение, уменьшенное на единицу, записываем в регистр таймера STK_LOAD, после чего разрешаем работу таймера путём установки в единицу бита ENABLE (нулевой бит) в регистре STK_CTRL. Остальные биты регистра STK_CTRL обнуляем, тем самым запрещая формирование запросов прерываний и выбирая тактовую частоту таймера 36 МГц:
SysTick->LOAD = 504000-1; // перезагружаемое значение
SysTick->CTRL = SysTick_CTRL_ENABLE; // разрешение счёт
Настройка выводов ОМК
Большинство линий ввода-вывода в используемом ОМК работают в нескольких режимах. Перед использованием производим настройку этих линий, то есть задаем направление передачи данных и выполняемую функцию. ОМК содержит несколько 16-разрядных портов ввода-вывода, обозначенных буквами: порт «А» (РА), порт «В» (РВ). Отдельные линии каждого порта настраиваются с помощью 32-разрядных регистров GPIOx_CRL и GPIOx_CRH, где «х» - имя порта. Регистр GPIOА_CRL настраиваем 8 младших линий порта , регистр GPIOА_CRH – 8 старших линий порта. Для каждой линии порта в этих регистрах есть 4 управляющих бита: CNF[1:0] и MODE[1:0] (рис. 3.2).
Параметр MODE задаёт направление передачи данных, принимает следующие значения:
00 – ввод данных;
01 – вывод с максимальной частотой 10 МГц;
10 – вывод с максимальной частотой 2 МГц;
11 – вывод с максимальной частотой 50 МГц.
При настройке линии выход выбираем режим с минимально необходимой частотой, чтобы снизить уровни излучаемых помех.
Рисунок 3.2 Регистры настройки GPIO
Параметр CNF уточняет режим работы линии GPIO и имеет разный смысл для входов и для выходов. Если параметром MODE линия настроена на ввод, то CNF позволяет указать:
00 – аналоговый вход;
01 – «плавающий» цифровой вход (без подтягивающих резисторов);
10 – цифровой вход с подтягивающим резистором к Vdd или к GND;
11 – недопустимая комбинация.
Если линия настроена как выход, то CNF имеет следующий смысл:
00 – обычный выход общего назначения;
01 – выход общего назначения с открытым стоком;
10 – выход, выполняющий альтернативную функцию;
11 – выход с открытым стоком, выполняющий альтернативную функцию.
Линии GPIO обычно удобно настраивать индивидуально, поэтому в регистрах GPIOx_CRL и GPIOx_CRH приходится изменять только часть битов, а не всё содержимое сразу. Для этого все биты MODE[1:0] и CNF[1:0], относящиеся к выбранной линии, сначала обнуляют операцией «И», а затем устанавливают необходимые биты в единицу операцией «ИЛИ».
Для установки используем операции сдвига. Параметры настройки линии GPIO с номером К начинаются в регистре GPIOx_CRL с бита NL = 4×K, а в регистре GPIOx_CRH – с бита NH = 4×(K–8).
Настроим аналоговые входы РА0…PA3:
// Линия PА0
GPIOА->CRL &=
(0xF<<4*0);
GPIOА->CRL |= (0x0<<4*0);
// Линия PA1
GPIOА->CRL &=
(0xF<<4*1);
GPIOА->CRL |= (0x0<<4*1);
// Линия PА2
GPIOА->CRL &=
(0xF<<4*2);
GPIOА->CRL |= (0x0<<4*2);
// Линия PA3
GPIOА->CRL &=
(0xF<<4*3);
GPIOА->CRL |= (0x0<<4*3);
Настроим выходы под ССИ РB0…РB6:
// Линия PB0
GPIOB->CRL &=
(0xF<<4*0);
GPIOB->CRL |= (0x4<<4*0);
// Линия PB1
GPIOB->CRL &=
(0xF<<4*1);
GPIOB->CRL |= (0x4<<4*1);
// Линия PB2
GPIOB->CRL &=
(0xF<<4*2);
GPIOB->CRL |= (0x4<<4*2);
// Линия PB3
GPIOB->CRL &=
(0xF<<4*3);
GPIOB->CRL |= (0x4<<4*3);
// Линия PB4
GPIOB->CRL &=
(0xF<<4*4);
GPIOB->CRL |= (0x4<<4*4);
// Линия PB5
GPIOB->CRL &=
(0xF<<4*5);
GPIOB->CRL |= (0x4<<4*5);
// Линия PB6
GPIOB->CRL &=
(0xF<<4*6);
GPIOB->CRL |= (0x4<<4*6);
Настроим дискретные выходы РA4, A5:
// Линия PA4
GPIOA->CRL &=
(0xF<<4*4);
GPIOA->CRL |= (0x4<<4*4);
// Линия PA5
GPIOA->CRL &=
(0xF<<4*5);
GPIOA->CRL |= (0x4<<4*5);
Теперь необходимо настроить линию РА9 на выполнение альтернативной функции (USART1_TX) в режиме выхода.
Обнулим биты конфигурации РА9 и зададим им нужные значения:
GPIOA->CRH &=
(0xF<<4*(9-8));
GPIOA->CRH |= (0xA<<4*(9-8));
Настраиваем линию РА10 на выполнение альтернативной функции (USART1_RX) в режиме выхода.
GPIOA->CRH &=
(0xF<<4*(10-8));
GPIOA->CRH |= (0x4<<4*(10-8));
Настроим линии РA11…РA13 как дискретные входы.
// линия PA11
GPIOA->CRH &= (0xF<<4*(11-8));
GPIOA->CRH |= (0x2<<4*(11-8));
// линия PA12
GPIOA->CRH &= (0xF<<4*(12-8));
GPIOA->CRH |= (0x2<<4*(12-8));
// линия PA13
GPIOA->CRH &= (0xF<<4*(13-8));
GPIOA->CRH |= (0x2<<4*(13-8));
Настройка АЦП
Зададим рабочую частоту АЦП. Для этого надо разделить частоту «APB2 Clock», равную 36 МГц, на 4. Полученный результат не должен превышать 14 МГц [2]. Коэффициент деления задаем в регистре RCC_CFGR битами ADCPRE[1:0]. Результирующая частота АЦП равняется 9 МГц (меньше 14 МГц):
RCC->CFGR |=
RCC_CFGR_ADCPRE_DIV4;
Разрешение работы встроенного оборудования
Разрешим работу встроенных блоков с помощью схемы управления сбросом и синхронизацией (Reset and Clock Control, RCC). Эта схема имеет управляющие регистры RCC_APB1ENR и RCC_APB2ENR, каждый бит которых разрешает или запрещает подачу тактовых импульсов на соответствующий блок.
Листинг разрешающей работу УАПП1, АЦП1, порта А и B:
RCC->APB2ENR |= (
RCC_APB2ENR_USART1EN; // разрешаем УАПП1
RCC_APB2ENR_ADC1EN // разрешаем таймер АЦП1
|RCC_APB2ENR_IOPAEN // разрешаем порт A
|RCC_APB2ENR_IOPBEN // разрешаем порт B
|RCC_APB2ENR_AFIOEN // разрешаем использование
); // альтернативных функций
Настройка системного таймера
Для определения периодичности опроса входов, то есть отсчёта временных интервалов, используем системный таймер, имеющийся во всех ОМК с ядром Cortex-M3. Таймер уменьшает свой значение на единицу с каждым тактовым импульсом, при достижении нуля устанавливает флаг перезагрузки COUNTFLAG, автоматически загружает в счётный регистр заранее заданное значение и продолжает работу. Изменяя перезагружаемое значение, можно задавать нужный период установки COUNTFLAG.
Для правильной настройки системного таймера прежде всего вычисляем перезагружаемое значение. Таймер должен устанавливать COUNTFLAG каждые миллисекунд.
Длительность такта определяется по формуле: =1/ ,
где – тактовая частота процессорного ядра (в нашем случае 36 МГц). Теперь для установки COUNTFLAG через миллисекунд, таймер должен начать счёт с величины:
504000.
Полученное значение, уменьшенное на единицу, записываем в регистр таймера STK_LOAD, после чего разрешаем работу таймера путём установки в единицу бита ENABLE (нулевой бит) в регистре STK_CTRL. Остальные биты регистра STK_CTRL обнуляем, тем самым запрещая формирование запросов прерываний и выбирая тактовую частоту таймера 36 МГц:
SysTick->LOAD = 504000-1; // перезагружаемое значение
SysTick->CTRL = SysTick_CTRL_ENABLE; // разрешение счёт
Настройка выводов ОМК
Большинство линий ввода-вывода в используемом ОМК работают в нескольких режимах. Перед использованием производим настройку этих линий, то есть задаем направление передачи данных и выполняемую функцию. ОМК содержит несколько 16-разрядных портов ввода-вывода, обозначенных буквами: порт «А» (РА), порт «В» (РВ). Отдельные линии каждого порта настраиваются с помощью 32-разрядных регистров GPIOx_CRL и GPIOx_CRH, где «х» - имя порта. Регистр GPIOА_CRL настраиваем 8 младших линий порта , регистр GPIOА_CRH – 8 старших линий порта. Для каждой линии порта в этих регистрах есть 4 управляющих бита: CNF[1:0] и MODE[1:0] (рис. 3.2).
Параметр MODE задаёт направление передачи данных, принимает следующие значения:
00 – ввод данных;
01 – вывод с максимальной частотой 10 МГц;
10 – вывод с максимальной частотой 2 МГц;
11 – вывод с максимальной частотой 50 МГц.
При настройке линии выход выбираем режим с минимально необходимой частотой, чтобы снизить уровни излучаемых помех.
Рисунок 3.2 Регистры настройки GPIO
Параметр CNF уточняет режим работы линии GPIO и имеет разный смысл для входов и для выходов. Если параметром MODE линия настроена на ввод, то CNF позволяет указать:
00 – аналоговый вход;
01 – «плавающий» цифровой вход (без подтягивающих резисторов);
10 – цифровой вход с подтягивающим резистором к Vdd или к GND;
11 – недопустимая комбинация.
Если линия настроена как выход, то CNF имеет следующий смысл:
00 – обычный выход общего назначения;
01 – выход общего назначения с открытым стоком;
10 – выход, выполняющий альтернативную функцию;
11 – выход с открытым стоком, выполняющий альтернативную функцию.
Линии GPIO обычно удобно настраивать индивидуально, поэтому в регистрах GPIOx_CRL и GPIOx_CRH приходится изменять только часть битов, а не всё содержимое сразу. Для этого все биты MODE[1:0] и CNF[1:0], относящиеся к выбранной линии, сначала обнуляют операцией «И», а затем устанавливают необходимые биты в единицу операцией «ИЛИ».
Для установки используем операции сдвига. Параметры настройки линии GPIO с номером К начинаются в регистре GPIOx_CRL с бита NL = 4×K, а в регистре GPIOx_CRH – с бита NH = 4×(K–8).
Настроим аналоговые входы РА0…PA3:
// Линия PА0
GPIOА->CRL &=
(0xF<<4*0);
GPIOА->CRL |= (0x0<<4*0);
// Линия PA1
GPIOА->CRL &=
(0xF<<4*1);
GPIOА->CRL |= (0x0<<4*1);
// Линия PА2
GPIOА->CRL &=
(0xF<<4*2);
GPIOА->CRL |= (0x0<<4*2);
// Линия PA3
GPIOА->CRL &=
(0xF<<4*3);
GPIOА->CRL |= (0x0<<4*3);
Настроим выходы под ССИ РB0…РB6:
// Линия PB0
GPIOB->CRL &=
(0xF<<4*0);
GPIOB->CRL |= (0x4<<4*0);
// Линия PB1
GPIOB->CRL &=
(0xF<<4*1);
GPIOB->CRL |= (0x4<<4*1);
// Линия PB2
GPIOB->CRL &=
(0xF<<4*2);
GPIOB->CRL |= (0x4<<4*2);
// Линия PB3
GPIOB->CRL &=
(0xF<<4*3);
GPIOB->CRL |= (0x4<<4*3);
// Линия PB4
GPIOB->CRL &=
(0xF<<4*4);
GPIOB->CRL |= (0x4<<4*4);
// Линия PB5
GPIOB->CRL &=
(0xF<<4*5);
GPIOB->CRL |= (0x4<<4*5);
// Линия PB6
GPIOB->CRL &=
(0xF<<4*6);
GPIOB->CRL |= (0x4<<4*6);
Настроим дискретные выходы РA4, A5:
// Линия PA4
GPIOA->CRL &=
(0xF<<4*4);
GPIOA->CRL |= (0x4<<4*4);
// Линия PA5
GPIOA->CRL &=
(0xF<<4*5);
GPIOA->CRL |= (0x4<<4*5);
Теперь необходимо настроить линию РА9 на выполнение альтернативной функции (USART1_TX) в режиме выхода.
Обнулим биты конфигурации РА9 и зададим им нужные значения:
GPIOA->CRH &=
(0xF<<4*(9-8));
Разрешение работы встроенного оборудования
Разрешим работу встроенных блоков с помощью схемы управления сбросом и синхронизацией (Reset and Clock Control, RCC). Эта схема имеет управляющие регистры RCC_APB1ENR и RCC_APB2ENR, каждый бит которых разрешает или запрещает подачу тактовых импульсов на соответствующий блок.
Листинг разрешающей работу УАПП1, АЦП1, порта А и B:
RCC->APB2ENR |= (
RCC_APB2ENR_USART1EN; // разрешаем УАПП1
RCC_APB2ENR_ADC1EN // разрешаем таймер АЦП1
|RCC_APB2ENR_IOPAEN // разрешаем порт A
|RCC_APB2ENR_IOPBEN // разрешаем порт B
|RCC_APB2ENR_AFIOEN // разрешаем использование
); // альтернативных функций
Настройка системного таймера
Для определения периодичности опроса входов, то есть отсчёта временных интервалов, используем системный таймер, имеющийся во всех ОМК с ядром Cortex-M3. Таймер уменьшает свой значение на единицу с каждым тактовым импульсом, при достижении нуля устанавливает флаг перезагрузки COUNTFLAG, автоматически загружает в счётный регистр заранее заданное значение и продолжает работу. Изменяя перезагружаемое значение, можно задавать нужный период установки COUNTFLAG.
Для правильной настройки системного таймера прежде всего вычисляем перезагружаемое значение. Таймер должен устанавливать COUNTFLAG каждые миллисекунд.
Длительность такта определяется по формуле: =1/ ,
где – тактовая частота процессорного ядра (в нашем случае 36 МГц). Теперь для установки COUNTFLAG через миллисекунд, таймер должен начать счёт с величины:
504000.
Полученное значение, уменьшенное на единицу, записываем в регистр таймера STK_LOAD, после чего разрешаем работу таймера путём установки в единицу бита ENABLE (нулевой бит) в регистре STK_CTRL. Остальные биты регистра STK_CTRL обнуляем, тем самым запрещая формирование запросов прерываний и выбирая тактовую частоту таймера 36 МГц:
SysTick->LOAD = 504000-1; // перезагружаемое значение
SysTick->CTRL = SysTick_CTRL_ENABLE; // разрешение счёт
Настройка выводов ОМК
Большинство линий ввода-вывода в используемом ОМК работают в нескольких режимах. Перед использованием производим настройку этих линий, то есть задаем направление передачи данных и выполняемую функцию. ОМК содержит несколько 16-разрядных портов ввода-вывода, обозначенных буквами: порт «А» (РА), порт «В» (РВ). Отдельные линии каждого порта настраиваются с помощью 32-разрядных регистров GPIOx_CRL и GPIOx_CRH, где «х» - имя порта. Регистр GPIOА_CRL настраиваем 8 младших линий порта , регистр GPIOА_CRH – 8 старших линий порта. Для каждой линии порта в этих регистрах есть 4 управляющих бита: CNF[1:0] и MODE[1:0] (рис. 3.2).
Параметр MODE задаёт направление передачи данных, принимает следующие значения:
00 – ввод данных;
01 – вывод с максимальной частотой 10 МГц;
10 – вывод с максимальной частотой 2 МГц;
11 – вывод с максимальной частотой 50 МГц.
При настройке линии выход выбираем режим с минимально необходимой частотой, чтобы снизить уровни излучаемых помех.
Рисунок 3.2 Регистры настройки GPIO
Параметр CNF уточняет режим работы линии GPIO и имеет разный смысл для входов и для выходов. Если параметром MODE линия настроена на ввод, то CNF позволяет указать:
00 – аналоговый вход;
01 – «плавающий» цифровой вход (без подтягивающих резисторов);
10 – цифровой вход с подтягивающим резистором к Vdd или к GND;
11 – недопустимая комбинация.
Если линия настроена как выход, то CNF имеет следующий смысл:
00 – обычный выход общего назначения;
01 – выход общего назначения с открытым стоком;
10 – выход, выполняющий альтернативную функцию;
11 – выход с открытым стоком, выполняющий альтернативную функцию.
Линии GPIO обычно удобно настраивать индивидуально, поэтому в регистрах GPIOx_CRL и GPIOx_CRH приходится изменять только часть битов, а не всё содержимое сразу. Для этого все биты MODE[1:0] и CNF[1:0], относящиеся к выбранной линии, сначала обнуляют операцией «И», а затем устанавливают необходимые биты в единицу операцией «ИЛИ».
Для установки используем операции сдвига. Параметры настройки линии GPIO с номером К начинаются в регистре GPIOx_CRL с бита NL = 4×K, а в регистре GPIOx_CRH – с бита NH = 4×(K–8).
Настроим аналоговые входы РА0…PA3:
// Линия PА0
GPIOА->CRL &=
(0xF<<4*0);
GPIOА->CRL |= (0x0<<4*0);
// Линия PA1
GPIOА->CRL &=
(0xF<<4*1);
GPIOА->CRL |= (0x0<<4*1);
// Линия PА2
GPIOА->CRL &=
(0xF<<4*2);
GPIOА->CRL |= (0x0<<4*2);
// Линия PA3
GPIOА->CRL &=
(0xF<<4*3);
GPIOА->CRL |= (0x0<<4*3);
Настроим выходы под ССИ РB0…РB6:
// Линия PB0
GPIOB->CRL &=
(0xF<<4*0);
GPIOB->CRL |= (0x4<<4*0);
// Линия PB1
GPIOB->CRL &=
(0xF<<4*1);
GPIOB->CRL |= (0x4<<4*1);
// Линия PB2
GPIOB->CRL &=
(0xF<<4*2);
GPIOB->CRL |= (0x4<<4*2);
// Линия PB3
GPIOB->CRL &=
(0xF<<4*3);
GPIOB->CRL |= (0x4<<4*3);
// Линия PB4
GPIOB->CRL &=
(0xF<<4*4);
GPIOB->CRL |= (0x4<<4*4);
// Линия PB5
GPIOB->CRL &=
(0xF<<4*5);
GPIOB->CRL |= (0x4<<4*5);
// Линия PB6
GPIOB->CRL &=
(0xF<<4*6);
GPIOB->CRL |= (0x4<<4*6);
Настроим дискретные выходы РA4, A5:
// Линия PA4
GPIOA->CRL &=
(0xF<<4*4);
Разрешение работы встроенного оборудования
Разрешим работу встроенных блоков с помощью схемы управления сбросом и синхронизацией (Reset and Clock Control, RCC). Эта схема имеет управляющие регистры RCC_APB1ENR и RCC_APB2ENR, каждый бит которых разрешает или запрещает подачу тактовых импульсов на соответствующий блок.
Листинг разрешающей работу УАПП1, АЦП1, порта А и B:
RCC->APB2ENR |= (
RCC_APB2ENR_USART1EN; // разрешаем УАПП1
RCC_APB2ENR_ADC1EN // разрешаем таймер АЦП1
|RCC_APB2ENR_IOPAEN // разрешаем порт A
|RCC_APB2ENR_IOPBEN // разрешаем порт B
|RCC_APB2ENR_AFIOEN // разрешаем использование
); // альтернативных функций
Настройка системного таймера
Для определения периодичности опроса входов, то есть отсчёта временных интервалов, используем системный таймер, имеющийся во всех ОМК с ядром Cortex-M3. Таймер уменьшает свой значение на единицу с каждым тактовым импульсом, при достижении нуля устанавливает флаг перезагрузки COUNTFLAG, автоматически загружает в счётный регистр заранее заданное значение и продолжает работу. Изменяя перезагружаемое значение, можно задавать нужный период установки COUNTFLAG.
Для правильной настройки системного таймера прежде всего вычисляем перезагружаемое значение. Таймер должен устанавливать COUNTFLAG каждые миллисекунд.
Длительность такта определяется по формуле: =1/ ,
где – тактовая частота процессорного ядра (в нашем случае 36 МГц). Теперь для установки COUNTFLAG через миллисекунд, таймер должен начать счёт с величины:
504000.
Полученное значение, уменьшенное на единицу, записываем в регистр таймера STK_LOAD, после чего разрешаем работу таймера путём установки в единицу бита ENABLE (нулевой бит) в регистре STK_CTRL. Остальные биты регистра STK_CTRL обнуляем, тем самым запрещая формирование запросов прерываний и выбирая тактовую частоту таймера 36 МГц:
SysTick->LOAD = 504000-1; // перезагружаемое значение
SysTick->CTRL = SysTick_CTRL_ENABLE; // разрешение счёт
Настройка выводов ОМК
Большинство линий ввода-вывода в используемом ОМК работают в нескольких режимах. Перед использованием производим настройку этих линий, то есть задаем направление передачи данных и выполняемую функцию. ОМК содержит несколько 16-разрядных портов ввода-вывода, обозначенных буквами: порт «А» (РА), порт «В» (РВ). Отдельные линии каждого порта настраиваются с помощью 32-разрядных регистров GPIOx_CRL и GPIOx_CRH, где «х» - имя порта. Регистр GPIOА_CRL настраиваем 8 младших линий порта , регистр GPIOА_CRH – 8 старших линий порта. Для каждой линии порта в этих регистрах есть 4 управляющих бита: CNF[1:0] и MODE[1:0] (рис. 3.2).
Параметр MODE задаёт направление передачи данных, принимает следующие значения:
00 – ввод данных;
01 – вывод с максимальной частотой 10 МГц;
10 – вывод с максимальной частотой 2 МГц;
11 – вывод с максимальной частотой 50 МГц.
При настройке линии выход выбираем режим с минимально необходимой частотой, чтобы снизить уровни излучаемых помех.
Рисунок 3.2 Регистры настройки GPIO
Параметр CNF уточняет режим работы линии GPIO и имеет разный смысл для входов и для выходов. Если параметром MODE линия настроена на ввод, то CNF позволяет указать:
00 – аналоговый вход;
01 – «плавающий» цифровой вход (без подтягивающих резисторов);
10 – цифровой вход с подтягивающим резистором к Vdd или к GND;
11 – недопустимая комбинация.
Если линия настроена как выход, то CNF имеет следующий смысл:
00 – обычный выход общего назначения;
01 – выход общего назначения с открытым стоком;
10 – выход, выполняющий альтернативную функцию;
11 – выход с открытым стоком, выполняющий альтернативную функцию.
Линии GPIO обычно удобно настраивать индивидуально, поэтому в регистрах GPIOx_CRL и GPIOx_CRH приходится изменять только часть битов, а не всё содержимое сразу. Для этого все биты MODE[1:0] и CNF[1:0], относящиеся к выбранной линии, сначала обнуляют операцией «И», а затем устанавливают необходимые биты в единицу операцией «ИЛИ».
Для установки используем операции сдвига. Параметры настройки линии GPIO с номером К начинаются в регистре GPIOx_CRL с бита NL = 4×K, а в регистре GPIOx_CRH – с бита NH = 4×(K–8).
Настроим аналоговые входы РА0…PA3:
// Линия PА0
GPIOА->CRL &=
(0xF<<4*0);
GPIOА->CRL |= (0x0<<4*0);
// Линия PA1
GPIOА->CRL &=
(0xF<<4*1);
GPIOА->CRL |= (0x0<<4*1);
// Линия PА2
GPIOА->CRL &=
(0xF<<4*2);
GPIOА->CRL |= (0x0<<4*2);
// Линия PA3
GPIOА->CRL &=
(0xF<<4*3);
GPIOА->CRL |= (0x0<<4*3);
Настроим выходы под ССИ РB0…РB6:
// Линия PB0
GPIOB->CRL &=
(0xF<<4*0);
GPIOB->CRL |= (0x4<<4*0);
// Линия PB1
GPIOB->CRL &=
(0xF<<4*1);
GPIOB->CRL |= (0x4<<4*1);
// Линия PB2
GPIOB->CRL &=
(0xF<<4*2);
GPIOB->CRL |= (0x4<<4*2);
// Линия PB3
GPIOB->CRL &=
(0xF<<4*3);
GPIOB->CRL |= (0x4<<4*3);
// Линия PB4
GPIOB->CRL &=
(0xF<<4*4);
GPIOB->CRL |= (0x4<<4*4);
// Линия PB5
GPIOB->CRL &=
(0xF<<4*5);
Разрешение работы встроенного оборудования
Разрешим работу встроенных блоков с помощью схемы управления сбросом и синхронизацией (Reset and Clock Control, RCC). Эта схема имеет управляющие регистры RCC_APB1ENR и RCC_APB2ENR, каждый бит которых разрешает или запрещает подачу тактовых импульсов на соответствующий блок.
Листинг разрешающей работу УАПП1, АЦП1, порта А и B:
RCC->APB2ENR |= (
RCC_APB2ENR_USART1EN; // разрешаем УАПП1
RCC_APB2ENR_ADC1EN // разрешаем таймер АЦП1
|RCC_APB2ENR_IOPAEN // разрешаем порт A
|RCC_APB2ENR_IOPBEN // разрешаем порт B
|RCC_APB2ENR_AFIOEN // разрешаем использование
); // альтернативных функций
Настройка системного таймера
Для определения периодичности опроса входов, то есть отсчёта временных интервалов, используем системный таймер, имеющийся во всех ОМК с ядром Cortex-M3. Таймер уменьшает свой значение на единицу с каждым тактовым импульсом, при достижении нуля устанавливает флаг перезагрузки COUNTFLAG, автоматически загружает в счётный регистр заранее заданное значение и продолжает работу. Изменяя перезагружаемое значение, можно задавать нужный период установки COUNTFLAG.
Для правильной настройки системного таймера прежде всего вычисляем перезагружаемое значение. Таймер должен устанавливать COUNTFLAG каждые миллисекунд.
Длительность такта определяется по формуле: =1/ ,
где – тактовая частота процессорного ядра (в нашем случае 36 МГц). Теперь для установки COUNTFLAG через миллисекунд, таймер должен начать счёт с величины:
504000.
Полученное значение, уменьшенное на единицу, записываем в регистр таймера STK_LOAD, после чего разрешаем работу таймера путём установки в единицу бита ENABLE (нулевой бит) в регистре STK_CTRL. Остальные биты регистра STK_CTRL обнуляем, тем самым запрещая формирование запросов прерываний и выбирая тактовую частоту таймера 36 МГц:
SysTick->LOAD = 504000-1; // перезагружаемое значение
SysTick->CTRL = SysTick_CTRL_ENABLE; // разрешение счёт
Настройка выводов ОМК
Большинство линий ввода-вывода в используемом ОМК работают в нескольких режимах. Перед использованием производим настройку этих линий, то есть задаем направление передачи данных и выполняемую функцию. ОМК содержит несколько 16-разрядных портов ввода-вывода, обозначенных буквами: порт «А» (РА), порт «В» (РВ). Отдельные линии каждого порта настраиваются с помощью 32-разрядных регистров GPIOx_CRL и GPIOx_CRH, где «х» - имя порта. Регистр GPIOА_CRL настраиваем 8 младших линий порта , регистр GPIOА_CRH – 8 старших линий порта. Для каждой линии порта в этих регистрах есть 4 управляющих бита: CNF[1:0] и MODE[1:0] (рис. 3.2).
Параметр MODE задаёт направление передачи данных, принимает следующие значения:
00 – ввод данных;
01 – вывод с максимальной частотой 10 МГц;
10 – вывод с максимальной частотой 2 МГц;
11 – вывод с максимальной частотой 50 МГц.
При настройке линии выход выбираем режим с минимально необходимой частотой, чтобы снизить уровни излучаемых помех.
Рисунок 3.2 Регистры настройки GPIO
Параметр CNF уточняет режим работы линии GPIO и имеет разный смысл для входов и для выходов. Если параметром MODE линия настроена на ввод, то CNF позволяет указать:
00 – аналоговый вход;
01 – «плавающий» цифровой вход (без подтягивающих резисторов);
10 – цифровой вход с подтягивающим резистором к Vdd или к GND;
11 – недопустимая комбинация.
Если линия настроена как выход, то CNF имеет следующий смысл:
00 – обычный выход общего назначения;
01 – выход общего назначения с открытым стоком;
10 – выход, выполняющий альтернативную функцию;
11 – выход с открытым стоком, выполняющий альтернативную функцию.
Линии GPIO обычно удобно настраивать индивидуально, поэтому в регистрах GPIOx_CRL и GPIOx_CRH приходится изменять только часть битов, а не всё содержимое сразу. Для этого все биты MODE[1:0] и CNF[1:0], относящиеся к выбранной линии, сначала обнуляют операцией «И», а затем устанавливают необходимые биты в единицу операцией «ИЛИ».
Для установки используем операции сдвига. Параметры настройки линии GPIO с номером К начинаются в регистре GPIOx_CRL с бита NL = 4×K, а в регистре GPIOx_CRH – с бита NH = 4×(K–8).
Настроим аналоговые входы РА0…PA3:
// Линия PА0
GPIOА->CRL &=
(0xF<<4*0);
GPIOА->CRL |= (0x0<<4*0);
// Линия PA1
GPIOА->CRL &=
(0xF<<4*1);
GPIOА->CRL |= (0x0<<4*1);
// Линия PА2
GPIOА->CRL &=
(0xF<<4*2);
GPIOА->CRL |= (0x0<<4*2);
// Линия PA3
GPIOА->CRL &=
(0xF<<4*3);
GPIOА->CRL |= (0x0<<4*3);
Настроим выходы под ССИ РB0…РB6:
// Линия PB0
GPIOB->CRL &=
(0xF<<4*0);
GPIOB->CRL |= (0x4<<4*0);
// Линия PB1
GPIOB->CRL &=
(0xF<<4*1);
GPIOB->CRL |= (0x4<<4*1);
// Линия PB2
GPIOB->CRL &=
(0xF<<4*2);
GPIOB->CRL |= (0x4<<4*2);
// Линия PB3
GPIOB->CRL &=
(0xF<<4*3);
Разрешение работы встроенного оборудования
Разрешим работу встроенных блоков с помощью схемы управления сбросом и синхронизацией (Reset and Clock Control, RCC). Эта схема имеет управляющие регистры RCC_APB1ENR и RCC_APB2ENR, каждый бит которых разрешает или запрещает подачу тактовых импульсов на соответствующий блок.
Листинг разрешающей работу УАПП1, АЦП1, порта А и B:
RCC->APB2ENR |= (
RCC_APB2ENR_USART1EN; // разрешаем УАПП1
RCC_APB2ENR_ADC1EN // разрешаем таймер АЦП1
|RCC_APB2ENR_IOPAEN // разрешаем порт A
|RCC_APB2ENR_IOPBEN // разрешаем порт B
|RCC_APB2ENR_AFIOEN // разрешаем использование
); // альтернативных функций
Настройка системного таймера
Для определения периодичности опроса входов, то есть отсчёта временных интервалов, используем системный таймер, имеющийся во всех ОМК с ядром Cortex-M3. Таймер уменьшает свой значение на единицу с каждым тактовым импульсом, при достижении нуля устанавливает флаг перезагрузки COUNTFLAG, автоматически загружает в счётный регистр заранее заданное значение и продолжает работу. Изменяя перезагружаемое значение, можно задавать нужный период установки COUNTFLAG.
Для правильной настройки системного таймера прежде всего вычисляем перезагружаемое значение. Таймер должен устанавливать COUNTFLAG каждые миллисекунд.
Длительность такта определяется по формуле: =1/ ,
где – тактовая частота процессорного ядра (в нашем случае 36 МГц). Теперь для установки COUNTFLAG через миллисекунд, таймер должен начать счёт с величины:
504000.
Полученное значение, уменьшенное на единицу, записываем в регистр таймера STK_LOAD, после чего разрешаем работу таймера путём установки в единицу бита ENABLE (нулевой бит) в регистре STK_CTRL. Остальные биты регистра STK_CTRL обнуляем, тем самым запрещая формирование запросов прерываний и выбирая тактовую частоту таймера 36 МГц:
SysTick->LOAD = 504000-1; // перезагружаемое значение
SysTick->CTRL = SysTick_CTRL_ENABLE; // разрешение счёт
Настройка выводов ОМК
Большинство линий ввода-вывода в используемом ОМК работают в нескольких режимах. Перед использованием производим настройку этих линий, то есть задаем направление передачи данных и выполняемую функцию. ОМК содержит несколько 16-разрядных портов ввода-вывода, обозначенных буквами: порт «А» (РА), порт «В» (РВ). Отдельные линии каждого порта настраиваются с помощью 32-разрядных регистров GPIOx_CRL и GPIOx_CRH, где «х» - имя порта. Регистр GPIOА_CRL настраиваем 8 младших линий порта , регистр GPIOА_CRH – 8 старших линий порта. Для каждой линии порта в этих регистрах есть 4 управляющих бита: CNF[1:0] и MODE[1:0] (рис. 3.2).
Параметр MODE задаёт направление передачи данных, принимает следующие значения:
00 – ввод данных;
01 – вывод с максимальной частотой 10 МГц;
10 – вывод с максимальной частотой 2 МГц;
11 – вывод с максимальной частотой 50 МГц.
При настройке линии выход выбираем режим с минимально необходимой частотой, чтобы снизить уровни излучаемых помех.
Рисунок 3.2 Регистры настройки GPIO
Параметр CNF уточняет режим работы линии GPIO и имеет разный смысл для входов и для выходов. Если параметром MODE линия настроена на ввод, то CNF позволяет указать:
00 – аналоговый вход;
01 – «плавающий» цифровой вход (без подтягивающих резисторов);
10 – цифровой вход с подтягивающим резистором к Vdd или к GND;
11 – недопустимая комбинация.
Если линия настроена как выход, то CNF имеет следующий смысл:
00 – обычный выход общего назначения;
01 – выход общего назначения с открытым стоком;
10 – выход, выполняющий альтернативную функцию;
11 – выход с открытым стоком, выполняющий альтернативную функцию.
Линии GPIO обычно удобно настраивать индивидуально, поэтому в регистрах GPIOx_CRL и GPIOx_CRH приходится изменять только часть битов, а не всё содержимое сразу. Для этого все биты MODE[1:0] и CNF[1:0], относящиеся к выбранной линии, сначала обнуляют операцией «И», а затем устанавливают необходимые биты в единицу операцией «ИЛИ».
Для установки используем операции сдвига. Параметры настройки линии GPIO с номером К начинаются в регистре GPIOx_CRL с бита NL = 4×K, а в регистре GPIOx_CRH – с бита NH = 4×(K–8).
Настроим аналоговые входы РА0…PA3:
// Линия PА0
GPIOА->CRL &=
(0xF<<4*0);
GPIOА->CRL |= (0x0<<4*0);
// Линия PA1
GPIOА->CRL &=
(0xF<<4*1);
GPIOА->CRL |= (0x0<<4*1);
// Линия PА2
GPIOА->CRL &=
(0xF<<4*2);
GPIOА->CRL |= (0x0<<4*2);
// Линия PA3
GPIOА->CRL &=
(0xF<<4*3);
GPIOА->CRL |= (0x0<<4*3);
Настроим выходы под ССИ РB0…РB6:
// Линия PB0
GPIOB->CRL &=
(0xF<<4*0);
GPIOB->CRL |= (0x4<<4*0);
// Линия PB1
GPIOB->CRL &=
(0xF<<4*1);
Разрешение работы встроенного оборудования
Разрешим работу встроенных блоков с помощью схемы управления сбросом и синхронизацией (Reset and Clock Control, RCC). Эта схема имеет управляющие регистры RCC_APB1ENR и RCC_APB2ENR, каждый бит которых разрешает или запрещает подачу тактовых импульсов на соответствующий блок.
Листинг разрешающей работу УАПП1, АЦП1, порта А и B:
RCC->APB2ENR |= (
RCC_APB2ENR_USART1EN; // разрешаем УАПП1
RCC_APB2ENR_ADC1EN // разрешаем таймер АЦП1
|RCC_APB2ENR_IOPAEN // разрешаем порт A
|RCC_APB2ENR_IOPBEN // разрешаем порт B
|RCC_APB2ENR_AFIOEN // разрешаем использование
); // альтернативных функций
Настройка системного таймера
Для определения периодичности опроса входов, то есть отсчёта временных интервалов, используем системный таймер, имеющийся во всех ОМК с ядром Cortex-M3. Таймер уменьшает свой значение на единицу с каждым тактовым импульсом, при достижении нуля устанавливает флаг перезагрузки COUNTFLAG, автоматически загружает в счётный регистр заранее заданное значение и продолжает работу. Изменяя перезагружаемое значение, можно задавать нужный период установки COUNTFLAG.
Для правильной настройки системного таймера прежде всего вычисляем перезагружаемое значение. Таймер должен устанавливать COUNTFLAG каждые миллисекунд.
Длительность такта определяется по формуле: =1/ ,
где – тактовая частота процессорного ядра (в нашем случае 36 МГц). Теперь для установки COUNTFLAG через миллисекунд, таймер должен начать счёт с величины:
504000.
Полученное значение, уменьшенное на единицу, записываем в регистр таймера STK_LOAD, после чего разрешаем работу таймера путём установки в единицу бита ENABLE (нулевой бит) в регистре STK_CTRL. Остальные биты регистра STK_CTRL обнуляем, тем самым запрещая формирование запросов прерываний и выбирая тактовую частоту таймера 36 МГц:
SysTick->LOAD = 504000-1; // перезагружаемое значение
SysTick->CTRL = SysTick_CTRL_ENABLE; // разрешение счёт
Настройка выводов ОМК
Большинство линий ввода-вывода в используемом ОМК работают в нескольких режимах. Перед использованием производим настройку этих линий, то есть задаем направление передачи данных и выполняемую функцию. ОМК содержит несколько 16-разрядных портов ввода-вывода, обозначенных буквами: порт «А» (РА), порт «В» (РВ). Отдельные линии каждого порта настраиваются с помощью 32-разрядных регистров GPIOx_CRL и GPIOx_CRH, где «х» - имя порта. Регистр GPIOА_CRL настраиваем 8 младших линий порта , регистр GPIOА_CRH – 8 старших линий порта. Для каждой линии порта в этих регистрах есть 4 управляющих бита: CNF[1:0] и MODE[1:0] (рис. 3.2).
Параметр MODE задаёт направление передачи данных, принимает следующие значения:
00 – ввод данных;
01 – вывод с максимальной частотой 10 МГц;
10 – вывод с максимальной частотой 2 МГц;
11 – вывод с максимальной частотой 50 МГц.
При настройке линии выход выбираем режим с минимально необходимой частотой, чтобы снизить уровни излучаемых помех.
Рисунок 3.2 Регистры настройки GPIO
Параметр CNF уточняет режим работы линии GPIO и имеет разный смысл для входов и для выходов. Если параметром MODE линия настроена на ввод, то CNF позволяет указать:
00 – аналоговый вход;
01 – «плавающий» цифровой вход (без подтягивающих резисторов);
10 – цифровой вход с подтягивающим резистором к Vdd или к GND;
11 – недопустимая комбинация.
Если линия настроена как выход, то CNF имеет следующий смысл:
00 – обычный выход общего назначения;
01 – выход общего назначения с открытым стоком;
10 – выход, выполняющий альтернативную функцию;
11 – выход с открытым стоком, выполняющий альтернативную функцию.
Линии GPIO обычно удобно настраивать индивидуально, поэтому в регистрах GPIOx_CRL и GPIOx_CRH приходится изменять только часть битов, а не всё содержимое сразу. Для этого все биты MODE[1:0] и CNF[1:0], относящиеся к выбранной линии, сначала обнуляют операцией «И», а затем устанавливают необходимые биты в единицу операцией «ИЛИ».
Для установки используем операции сдвига. Параметры настройки линии GPIO с номером К начинаются в регистре GPIOx_CRL с бита NL = 4×K, а в регистре GPIOx_CRH – с бита NH = 4×(K–8).
Настроим аналоговые входы РА0…PA3:
// Линия PА0
GPIOА->CRL &=
(0xF<<4*0);
GPIOА->CRL |= (0x0<<4*0);
// Линия PA1
GPIOА->CRL &=
(0xF<<4*1);
GPIOА->CRL |= (0x0<<4*1);
// Линия PА2
GPIOА->CRL &=
(0xF<<4*2);
GPIOА->CRL |= (0x0<<4*2);
// Линия PA3
GPIOА->CRL &=
(0xF<<4*3);
Разрешение работы встроенного оборудования
Разрешим работу встроенных блоков с помощью схемы управления сбросом и синхронизацией (Reset and Clock Control, RCC). Эта схема имеет управляющие регистры RCC_APB1ENR и RCC_APB2ENR, каждый бит которых разрешает или запрещает подачу тактовых импульсов на соответствующий блок.
Листинг разрешающей работу УАПП1, АЦП1, порта А и B:
RCC->APB2ENR |= (
RCC_APB2ENR_USART1EN; // разрешаем УАПП1
RCC_APB2ENR_ADC1EN // разрешаем таймер АЦП1
|RCC_APB2ENR_IOPAEN // разрешаем порт A
|RCC_APB2ENR_IOPBEN // разрешаем порт B
|RCC_APB2ENR_AFIOEN // разрешаем использование
); // альтернативных функций
Настройка системного таймера
Для определения периодичности опроса входов, то есть отсчёта временных интервалов, используем системный таймер, имеющийся во всех ОМК с ядром Cortex-M3. Таймер уменьшает свой значение на единицу с каждым тактовым импульсом, при достижении нуля устанавливает флаг перезагрузки COUNTFLAG, автоматически загружает в счётный регистр заранее заданное значение и продолжает работу. Изменяя перезагружаемое значение, можно задавать нужный период установки COUNTFLAG.
Для правильной настройки системного таймера прежде всего вычисляем перезагружаемое значение. Таймер должен устанавливать COUNTFLAG каждые миллисекунд.
Длительность такта определяется по формуле: =1/ ,
где – тактовая частота процессорного ядра (в нашем случае 36 МГц). Теперь для установки COUNTFLAG через миллисекунд, таймер должен начать счёт с величины:
504000.
Полученное значение, уменьшенное на единицу, записываем в регистр таймера STK_LOAD, после чего разрешаем работу таймера путём установки в единицу бита ENABLE (нулевой бит) в регистре STK_CTRL. Остальные биты регистра STK_CTRL обнуляем, тем самым запрещая формирование запросов прерываний и выбирая тактовую частоту таймера 36 МГц:
SysTick->LOAD = 504000-1; // перезагружаемое значение
SysTick->CTRL = SysTick_CTRL_ENABLE; // разрешение счёт
Настройка выводов ОМК
Большинство линий ввода-вывода в используемом ОМК работают в нескольких режимах. Перед использованием производим настройку этих линий, то есть задаем направление передачи данных и выполняемую функцию. ОМК содержит несколько 16-разрядных портов ввода-вывода, обозначенных буквами: порт «А» (РА), порт «В» (РВ). Отдельные линии каждого порта настраиваются с помощью 32-разрядных регистров GPIOx_CRL и GPIOx_CRH, где «х» - имя порта. Регистр GPIOА_CRL настраиваем 8 младших линий порта , регистр GPIOА_CRH – 8 старших линий порта. Для каждой линии порта в этих регистрах есть 4 управляющих бита: CNF[1:0] и MODE[1:0] (рис. 3.2).
Параметр MODE задаёт направление передачи данных, принимает следующие значения:
00 – ввод данных;
01 – вывод с максимальной частотой 10 МГц;
10 – вывод с максимальной частотой 2 МГц;
11 – вывод с максимальной частотой 50 МГц.
При настройке линии выход выбираем режим с минимально необходимой частотой, чтобы снизить уровни излучаемых помех.
Рисунок 3.2 Регистры настройки GPIO
Параметр CNF уточняет режим работы линии GPIO и имеет разный смысл для входов и для выходов. Если параметром MODE линия настроена на ввод, то CNF позволяет указать:
00 – аналоговый вход;
01 – «плавающий» цифровой вход (без подтягивающих резисторов);
10 – цифровой вход с подтягивающим резистором к Vdd или к GND;
11 – недопустимая комбинация.
Если линия настроена как выход, то CNF имеет следующий смысл:
00 – обычный выход общего назначения;
01 – выход общего назначения с открытым стоком;
10 – выход, выполняющий альтернативную функцию;
11 – выход с открытым стоком, выполняющий альтернативную функцию.
Линии GPIO обычно удобно настраивать индивидуально, поэтому в регистрах GPIOx_CRL и GPIOx_CRH приходится изменять только часть битов, а не всё содержимое сразу. Для этого все биты MODE[1:0] и CNF[1:0], относящиеся к выбранной линии, сначала обнуляют операцией «И», а затем устанавливают необходимые биты в единицу операцией «ИЛИ».
Для установки используем операции сдвига. Параметры настройки линии GPIO с номером К начинаются в регистре GPIOx_CRL с бита NL = 4×K, а в регистре GPIOx_CRH – с бита NH = 4×(K–8).
Настроим аналоговые входы РА0…PA3:
// Линия PА0
GPIOА->CRL &=
(0xF<<4*0);
GPIOА->CRL |= (0x0<<4*0);
// Линия PA1
GPIOА->CRL &=
(0xF<<4*1);Разрешение работы встроенного оборудования
Разрешим работу встроенных блоков с помощью схемы управления сбросом и синхронизацией (Reset and Clock Control, RCC). Эта схема имеет управляющие регистры RCC_APB1ENR и RCC_APB2ENR, каждый бит которых разрешает или запрещает подачу тактовых импульсов на соответствующий блок.
Листинг разрешающей работу УАПП1, АЦП1, порта А и B:
RCC->APB2ENR |= (
RCC_APB2ENR_USART1EN; // разрешаем УАПП1
RCC_APB2ENR_ADC1EN // разрешаем таймер АЦП1
|RCC_APB2ENR_IOPAEN // разрешаем порт A
|RCC_APB2ENR_IOPBEN // разрешаем порт B
|RCC_APB2ENR_AFIOEN // разрешаем использование
); // альтернативных функций
Настройка системного таймера
Для определения периодичности опроса входов, то есть отсчёта временных интервалов, используем системный таймер, имеющийся во всех ОМК с ядром Cortex-M3. Таймер уменьшает свой значение на единицу с каждым тактовым импульсом, при достижении нуля устанавливает флаг перезагрузки COUNTFLAG, автоматически загружает в счётный регистр заранее заданное значение и продолжает работу. Изменяя перезагружаемое значение, можно задавать нужный период установки COUNTFLAG.
Для правильной настройки системного таймера прежде всего вычисляем перезагружаемое значение. Таймер должен устанавливать COUNTFLAG каждые миллисекунд.
Длительность такта определяется по формуле: =1/ ,
где – тактовая частота процессорного ядра (в нашем случае 36 МГц). Теперь для установки COUNTFLAG через миллисекунд, таймер должен начать счёт с величины:
504000.
Полученное значение, уменьшенное на единицу, записываем в регистр таймера STK_LOAD, после чего разрешаем работу таймера путём установки в единицу бита ENABLE (нулевой бит) в регистре STK_CTRL. Остальные биты регистра STK_CTRL обнуляем, тем самым запрещая формирование запросов прерываний и выбирая тактовую частоту таймера 36 МГц:
SysTick->LOAD = 504000-1; // перезагружаемое значение
SysTick->CTRL = SysTick_CTRL_ENABLE; // разрешение счёт
Настройка выводов ОМК
Большинство линий ввода-вывода в используемом ОМК работают в нескольких режимах. Перед использованием производим настройку этих линий, то есть задаем направление передачи данных и выполняемую функцию. ОМК содержит несколько 16-разрядных портов ввода-вывода, обозначенных буквами: порт «А» (РА), порт «В» (РВ). Отдельные линии каждого порта настраиваются с помощью 32-разрядных регистров GPIOx_CRL и GPIOx_CRH, где «х» - имя порта. Регистр GPIOА_CRL настраиваем 8 младших линий порта , регистр GPIOА_CRH – 8 старших линий порта. Для каждой линии порта в этих регистрах есть 4 управляющих бита: CNF[1:0] и MODE[1:0] (рис. 3.2).
Параметр MODE задаёт направление передачи данных, принимает следующие значения:
00 – ввод данных;
01 – вывод с максимальной частотой 10 МГц;
10 – вывод с максимальной частотой 2 МГц;
11 – вывод с максимальной частотой 50 МГц.
При настройке линии выход выбираем режим с минимально необходимой частотой, чтобы снизить уровни излучаемых помех.
Рисунок 3.2 Регистры настройки GPIO
Параметр CNF уточняет режим работы линии GPIO и имеет разный смысл для входов и для выходов. Если параметром MODE линия настроена на ввод, то CNF позволяет указать:
00 – аналоговый вход;
01 – «плавающий» цифровой вход (без подтягивающих резисторов);
10 – цифровой вход с подтягивающим резистором к Vdd или к GND;
11 – недопустимая комбинация.
Если линия настроена как выход, то CNF имеет следующий смысл:
00 – обычный выход общего назначения;
01 – выход общего назначения с открытым стоком;
10 – выход, выполняющий альтернативную функцию;
11 – выход с открытым стоком, выполняющий альтернативную функцию.
Линии GPIO обычно удобно настраивать индивидуально, поэтому в регистрах GPIOx_CRL и GPIOx_CRH приходится изменять только часть битов, а не всё содержимое сразу. Для этого все биты MODE[1:0] и CNF[1:0], относящиеся к выбранной линии, сначала обнуляют операцией «И», а затем устанавливают необходимые биты в единицу операцией «ИЛИ».
Для установки используем операции сдвига. Параметры настройки линии GPIO с номером К начинаются в регистре GPIOx_CRL с бита NL = 4×K, а в регистре GPIOx_CRH – с бита NH = 4×(K–8).
Настроим аналоговые входы РА0…PA3:
// Линия PА0
GPIOА->CRL &=
GPIOА->CRL |= (0x0<<4*1);
// Линия PА2
GPIOА->CRL &=
GPIOА->CRL |= (0x0<<4*3);
Настроим выходы под ССИ РB0…РB6:
// Линия PB0
GPIOB->CRL &=
GPIOB->CRL |= (0x4<<4*1);
// Линия PB2
GPIOB->CRL &=
GPIOB->CRL |= (0x4<<4*3);
// Линия PB4
GPIOB->CRL &=
GPIOB->CRL |= (0x4<<4*5);
// Линия PB6
GPIOB->CRL &=
GPIOA->CRL |= (0x4<<4*4);
// Линия PA5
GPIOA->CRL &=
GPIOA->CRH |= (0xA<<4*(9-8));
Настраиваем линию РА10 на выполнение альтернативной функции (USART1_RX) в режиме выхода.
GPIOA->CRH &=
Теперь вычислим время выборки (sample time). После переключения входного коммутатора надо выдержать паузу для заряда ёмкости УВХ. Эту паузу АЦП формирует автоматически. Ее длительность выбирается из ряда возможных значений, связана с величиной емкости УВХ, выходным сопротивлением источника измеряемого сигнала и входным сопротивлением АЦП. При минимально возможном времени выборки, равном 1.5 цикла, выходное сопротивление источника сигнала (то есть нормирующего усилителя) не превышает 1.1 кОм. Выходное сопротивление используемых НУ меньше этой величины, так что время выборки 1.5 цикла, заданное по умолчанию в регистрах ADC_SMPR1 и ADC_SMPR2 не будем изменять.
Выберем тип и источник запуска аналого-цифрового преобразования. Настроим АЦП на внешний запуск от управляющего бита SWSTART; для запуска преобразования программа должна будет установить этот бит в единицу:
ADC1->CR2 =
ADC_CR2_EXTSEL // разрешить внешний запуск
| ADC_CR2_EXTTRIG; // источник запуска - бит SWSTART
Наконец, включим АЦП, после чего он готов к работе:
ADC1->CR2 |= ADC_CR2_ADON; // включить АЦП
Настройка УАПП
Настройки УАПП – это указание параметров последовательного асинхронного обмена: скорость приёма-передачи, количество информационных и стоповых битов, наличие и тип контроля чётности. После сброса ОМК эти параметры устанавливаются по умолчанию: восемь информационных и один стоповый бит, без контроля чётности, скорость обмена не задана. Значения по умолчанию удовлетворяют поставленной задаче, потому при настройке зададим лишь одну из стандартных скоростей приема-передачи, предварительно включив используемый УАПП установкой бита UE в регистре USART_CR1:
USART1->CR1 |= USART_CR1_UE; // включаем УАПП1
Скорость задаётся путём записи в регистр USART_BRR константы, вычисленной по формуле BRR = FУАПП / Baud, где FУАПП – тактовая частота УАПП (в нашем случае 36 МГц), Baud – требуемая скорость.
// задаём скорость приема/передачи 19200 бит/сек
USART1->BRR = 36000000.0/19200+0.5;
Число 0.5 в приведённой выше записи прибавляется для правильного округления результата деления: без этого дробная часть будет просто отброшена.
Настройка контроллера прерываний
Данные на ВУ передаются с использованием прерываний от последовательного передатчика, потому надо разрешить прерывания от задействованного УАПП. Контроллер прерываний, встроенный в выбранный ОМК STM32F101T8, обслуживает од 60 источников запросов (в дополнение к системным). Разрешение обслуживания каждого запроса выполняем в индивидуальном порядке путем установки нужного бита в регистрах NVIC_ISER0 (биты 0…31), NVIC_ISER1 (биты 32…59). Значит, для разрешение прерывания от УАПП1 (Position = 37) установим пятый бит в регистре NVIC_ISER1: