Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Часть 2: Программирование USART.Стр 1 из 3Следующая ⇒
Лабораторная 4: USART Содержание: Задание расположено на стр 22.
Часть 1: USART. Краткое описание USART. Интерфейс USART — последовательный универсальный синхронно-асинхронный приемо-передатчик. Передача данных в USART осуществляется через равные промежутки времени. Этот временной промежуток определяется заданной скоростью USART и указывается в бодах (Для символов, которые могут принимать значения, равные только нулю или единице бод эквивалентен битам в секунду). Существует общепринятый ряд стандартных скоростей: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 бод. Помимо бит данных USART автоматически вставляет в поток синхронизирующие метки, так называемые стартовый и стоповый биты. При приёме эти лишние биты удаляются. Обычно стартовый и стоповый биты отделяют один байт информации (8 бит), однако встречаются реализации USART, которые позволяют передавать по 5, 6, 7, 8 или 9 бит. Биты, отделённые стартовым и стоповым сигналами, являются минимальной посылкой. USART позволяет вставлять два стоповых бита при передаче для уменьшения вероятности рассинхронизации приёмника и передатчика при плотном трафике. Приёмник игнорирует второй стоповый бит, воспринимая его как короткую паузу на линии. Принято соглашение, что пассивным (в отсутствие данных) состоянием входа и выхода USART является логическая «1». Стартовый бит всегда логический «0», поэтому приёмник USART ждёт перепада из «1» в «0» и отсчитывает от него временной промежуток в половину длительности бита (середина передачи стартового бита). Если в этот момент на входе всё ещё «0», то запускается процесс приёма минимальной посылки. Для этого приёмник отсчитывает 9 битовых длительностей подряд (для 8-бит данных) и в каждый момент фиксирует состояние входа. Первые 8 значений являются принятыми данными, последнее значение проверочное (стоп-бит). Значение стоп-бита всегда «1», если реально принятое значение иное, USART фиксирует ошибку. На рис 1.1 показана временная диаграмма передаваемых данных по USART.
Рис 1.1 Поскольку синхронизирующие биты занимают часть битового потока, то результирующая пропускная способность UART не равна скорости соединения. Например, для 8-битных посылок формата 8-N-1 синхронизирующие биты занимают 20 % потока, что для физической скорости 115 200 бод даёт битовую скорость данных 92160 бит/с или 11 520 байт/с. Контроль чётности В протоколе USART имеют возможность автоматически контролировать целостность данных методом контроля битовой чётности. Когда эта функция включена, последний бит данных («бит чётности») всегда принимает значение 1 или 0, так чтобы количество единиц в байте всегда было четным. Управление потоком В старые времена устройства с USART могли быть настолько медлительными, что не успевали обрабатывать поток принимаемых данных. Для решения этой проблемы модули USART снабжались отдельными выходами и входами управления потоком. При заполнении входного буфера логика принимающего USART выставляла на соответствующем выходе запрещающий уровень, и передающий USART приостанавливал передачу. Позже управление потоком возложили на коммуникационные протоколы, и надобность в отдельных линиях управления потоком постепенно исчезла. Область применения. USART обычно применяется для проводной связи между двумя устройствами, расстояние между которыми не превышает единиц метров. Увеличение дальности связи приводит к зашумлению сигнала и уменьшению вероятности его правильного приёма. Часть 2: Программирование USART. Настройка USART с помощью библиотеки StdPeriph. Программирование USART в STM32 происходит по следующему алгоритму: 1. Подключить файл, отвечающий за программирование USART в StdPeriph. 2. Выбрать один из доступных USART и определить номера выводов, на которые выведен данный USART. 3. Включить тактирование порта (портов), на который выведен USART. 4. Инициализировать выводы USART на работу в альтернативном режиме. 5. Включить тактирование USART. 6. Инициализировать USART. 7. Разрешить глобальные прерывания от USART. 8. Разрешить прерывания от USART по завершению приема байта. 9. Включить работу USART. На этом инициализация заканчивается. Рассмотрим подробнее каждый пункт. Подключение заголовочного файла Для подключения USART надо расскоментировать строку #include " stm32f4xx_usart.h" в файле stm32f4xx_conf.h. Определение номера выводов, на которые выведен USART Для определения номеров выводов, на которые выведен данный USART, используется таблица с определением всех выводов МК (см. файл stm32f4xx pinout.pdf, стр. 45- 57). Включение тактирования Для включения тактирования порта надо написать строку:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOx, ENABLE); Где х – буква, обозначающая порт. Включение тактирования USART Включение тактирования USART производится функцией: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTх, ENABLE); Где х – номер выбранного USART. Список устройств, которые включаются этой функцией можно найти в файле stm32f10x_rcc.h. Инициализация USART. Структура, инициализирующая USART, описана в файле stm32f4xx_usart.h и обозначается как USART_InitTypeDef. Примечание : Прежде всего, разберемся, как же заполнять подобные структуры. Сама структура описана, как уже было сказано в файле stm32f4xx_usart.h. Рядом с каждым параметром этой структуры дано описание, для чего нужен тот или иной параметр и как он инициализируется. Если для инициализации какого-то параметра нужно использовать определённые ниже define, то в комментариях к параметру указывается ссылка на этот define начинающаяся ключевым словом @ref. Далее следует слово, набив которое в поиск, можно без труда отыскать нужные define. Например, параметр USART_StopBits. У него в комментариях указана строка: @ref USART_Stop_Bits. Скопировав слово USART_Stop_Bits в поиск можно найти, что данный параметр принимает одно из 4-х значений: USART_StopBits_1, USART_StopBits_0_5, USART_StopBits_2, USART_StopBits_1_5. Последний define проверяет, является ли указанный define элементом USART_Stop_Bits. Для инициализации он не используется. Рассмотрим элементы этой структуры: В USART_BaudRate описывается скорость передачи и приёма данных. Микроконтроллер может выставить практически любую скорость передачи. Это значение ограничено только частотой тактирования. Причём ограничения касаются не только максимального диапазона, но и точности тактирования USART. Обычно скорость передачи USART принимает одно из следующих стандартных значений: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600. По-умолчанию это значение обычно принимается равным 9600. Задаётся в численном виде. USART_WordLength задаёт длину одной посылки. Stm32f4xx поддерживает только 2 длины в 8 и 9 бит, которые обозначаются соответственно USART_WordLength_8b и USART_WordLength_9b. По умолчанию это значение обычно принимается равным 8 бит. USART_StopBits – задаёт количество стоп бит. По умолчанию количество стоп-бит равно 1. USART_Parity – проверка на чётность для увеличения вероятности правильной передачи данных. По умолчанию проверка обычно отключается. USART_Mode определяет режим работы USART. Будет ли тот работать только на передачу, только на приём или сразу в обе стороны. Обозначается соответственно USART_Mode_Tx, USART_Mode_Rx и USART_Mode_Tx|USART_Mode_Rx. USART_HardwareFlowControl включает аппаратное управление потоком. Может принимать одно из следующих значений: USART_HardwareFlowControl_None USART_HardwareFlowControl_RTS USART_HardwareFlowControl_CTS USART_HardwareFlowControl_RTS_CTS По-умолчанию управление потоком обычно отключается. Инициализация производится функцией USART_Init. Например: USART_Init(USARTх, & USART_InitStructure); где х – номер используемого USART, USART_InitStructure – имя переменной, в которой содержится структура с параметрами.
Включение USART Включение USART производится следующей строкой: USART_Cmd(USARTх, ENABLE), где х – номер используемого USART.
Отправка байта по USART Перед отправкой байта необходимо дождаться завершения отправки предыдущего байта с помощью строки: while (! USART_GetFlagStatus(USART1, USART_SR_TXE)) {} Т.о. функцию отправки одного байта данных можно написать следующим образом: //------------------------------------------------------------------------------------- { while(! (USART2-> SR & USART_SR_TC)); //Ждем пока бит TC в регистре SR //станет равен 1 USART2-> DR=data; //Отсылаем байт через USART } Параметр функции data является байтом, отсылаемым через USART. Например, отправить через USART байт, в котором записано число 48, можно при помощи следующей строки: send_to_USART(48);
Часть 3: Протокол передачи. Протоколы передачи данных. Для общения между различными устройствами обычно используется стандартный формат передачи данных. Такой формат называется протоколом. Данные обычно разбиваются на пакеты, отдельные самодостаточные наборы данных. Протокол определяет содержимое этого пакета, его интерпретацию, местоположение различных данных в пакете и т.д. В этом методическом пособии будут рассматриваться только протоколы, описывающие непосредственное взаимодействие двух устройств. Пользователь может самостоятельно разработать протокол, который наиболее подходит под его задачи. Но существует ряд общих черт протоколов, знание которых позволяет организовывать более эффективное общение между двумя устройствами. Пакет данных может включать в себя следующие поля: стартовая последовательность, команда, длина данных, данные, CRC. Разумеется, ими список полей не ограничивается. Поля могу занимать любое заранее оговорённое количество байт. Рассмотрим упомянутые поля подробнее. Стартовая последовательность говорит о начале передачи. Зачастую её делают уникальной, т.е. такой, что она больше не может встречаться в пакете. Встретив её, устройство точно знает, что это начало пакета и начинает приём. Команда говорит устройству, что ему надо делать. Это может быть команда на запрос или пересылку данных, чтение настроек и т.д. В протоколе чётко определяется список команд, которые могут быть выполнены устройством. Зачастую в пакете передаётся не фиксированное число данных. Для того, чтобы устройство знало сколько именно данных ему передают, существует поле длина данных. Данные содержат в себе информацию, передаваемую устройству. Это может быть всё, что угодно, кроме команды этому устройству. CRC – это контрольная сумма. Обычно она считается последовательным сложением байт, входящих в пакет по модулю 256. При окончании приёма, устройство повторяет процедуру и, если значения совпали, значит, данные приняты правильно. Кроме перечисленных полей, в пакете могут присутствовать другие, связанные с особенностями построения сети. Например, при количестве устройств в сети больше 2-х, зачастую вводятся поля адресов, идентифицирующих как устройство передающее данные, так и устройство, которому эти данные предназначены. Приём данных Приём данных, переданных по протоколу, описанному выше, может быть осуществлён двумя способами: побайтный и приём в целом. Побайтный приём заключается в том, что каждый принятый байт тут же обрабатывается программой. Одновременно с приёмом идёт поиск начала пакета, выявление и запись в отдельные переменные полей команды, данных и т.д. По окончании приёма производится выполнение полученной команды. Принятые данные по прерыванию записываются в буфер приема и увеличивается счётчик количества необработанных байт. В бесконечном цикле проверяется этот счётчик и, если он отличен от нуля, производится обработка принятых байт, а счётчик необработанных данных уменьшается. Оба процесса приёма и обработки могут идти параллельно, т.к. приём, за исключением записи в буфер, идёт аппаратно и задействует АЛУ. Этот метод обычно используется, когда неизвестна точная длина пакета и нет никакой последовательности, которая говорит о его окончании. И, если поток данных почти непрерывный (период передачи пакетов сравним с его длительностью). Тогда надо производить обработку пакета предельно быстро. Это обеспечивается эти методом. К достоинствам этот метода стоит отнести высокую скоростью работы и возможность обработки данных без последовательности, говорящей об окончании передачи, т.к. во время приёма программа может по уже обработанным полям выяснить фактическое количество передаваемых данных. Недостатком данного алгоритма является его сложность и не применимость, если производится сложный программный алгоритм приёма пакета. Приём в целом заключается в том, что данные сначала полностью принимаются и только по приёму последовательности, говорящей об окончании передачи начинается обработка пакета. Данный алгоритм несколько проще в реализации, но требует длительного промежутка между передачами для обработки уже принятых данных. Буферы приёма Принимаемые данные перед обработкой должны сохраняться в отдельный, специально созданный для этого массив. Такой массив называется буфер. Есть два способа заполнения массива: Со сбросом в начало и «круглый» буфер. Алгоритм сброса в начало подразумевает, что после обработки принятого пакета следующий пакет опять записывается с начала массива. Этот способ прост в реализации, но менее надёжен. Алгоритм круглого буфера подразумевает, что принятые данные расписываются с начала до конца буфера вне зависимости от принятого пакета, а затем только сбрасываются с начало. Получается запись данных по кругу. Этот алгоритм сложнее, но позволяет принимать данные непрерывно. Примеры протоколов Протоколы, рассмотренные ниже, расположены по возрастанию сложности. Именно в таком порядке их лучше всего реализовывать для понимания основных принципов приёма данных. Однобайтная передача. Самый простой протокол. Он подразумевает передачу только одного поля – поля команды. Причём это поле длиной один байт. Этот байт передаёт необходимую информацию. Количество различных команд равно 255, чего хватает для решения простых задач управления. Данный протокол не подразумевает наличия стартовых и стоповых последовательностей. Реализовать его можно достаточно просто: void USART2_IRQHandler(void) { uint8_t Res_data=0; // Обработка события RXNE (приёма) if ( USART_GetITStatus(USART2, USART_IT_RXNE) ) { // очистка бита прерывания USART_ClearITPendingBit(USART2, USART_IT_RXNE); //Сюда пишется, что должно произойти приёме одного байта Res_data = USART_ReceiveData(USART2); //Приняли байт if (Res_data == 0x01)//Если принятый байт равен 1, … { RED_ON(); //… зажигаем светодиод. } }
При более сложных задачах, выполняемых достаточно долго. Рекомендуется их выносить в функцию main. Для этого при приёме байта выставляется флаг окончания приема, и этот флаг проверяется уже в функции main. Если флаг установлен, производится обработка принятого байта.
uint8_t receive_flag=0; uint8_t Res_data=0;
void USART2_IRQHandler(void) {
// Обработка события RXNE (приёма) if ( USART_GetITStatus(USART2, USART_IT_RXNE) ) { // очистка бита прерывания USART_ClearITPendingBit(USART2, USART_IT_RXNE); //Сюда пишется, что должно произойти приёме одного байта Res_data = USART_ReceiveData(USART2); //Приняли байт receive_flag = 1; }
int main() { if (receive_flag == 1) { receive_flag = 0; //Сбрасываем флаг. switch (Res_data){ case 0x01: {RED_ON(); }break; case 0x02: {RED_OFF(); }break; } } }
Но возможен вариант, когда обработка будет настолько долгая, что успеет прийти следующий байт. Но тогда предыдущий будет затёрт. Чтобы этого не случилось, создаётся буфер, представляющий из себя массив данных типа char. Определяемый, к примеру, следующим образом: uint8_t receive_buffer[256]; Для работы с этим буфером нам требуется ряд переменных: 1) Указатель (не путать с указателями в Си) на место записи принятых данных. 2) Указатель на место чтения обрабатываемых данных. 3) Количество необработанных данных в буфере. uint8_t receive_write=0, receive_read=0, receive_count=0; Заполнение буфера тогда выглядит так: receive_buffer[receive_write] = USART_ReceiveData(USART1); //Приняли байт receive_write++; receive_count++; О переполнении можно не беспокоиться благодаря выбранному размеру буфера. По достижении 255 все переменные будут обнуляться автоматически. Тогда, обработка это будет выглядеть так:
if (receive_count > 0) { switch (receive_buffer[receive_read]){ case 0x01: {RED_ON(); }break; case 0x02: {RED_OFF(); }break; } receive_count--; receive_read++; }
Задание 1. Написать программу, которая отправляет заданный байт на ПК с периодом 1 секунда. 2. Написать функцию, отправляющую на ПК строку. И на её основе написать передачу на ПК строки вида: «i=x», где х увеличивается на 1 каждую секунду. 3. Написать программу, которая по команде с ПК зажигает заданный светодиод. Порядок выполнения задания. Задание 1: 1. Запустить файл «lab5DMA.uvproj» в папке «lab4». 2. Разобраться в структуре программы и найти функцию main(). 3. Внутри цикла while(1) отправить любой байт с помощью функции send_to_USART (см. пункт «Отправка байта по USART»). 4. В следующей строке вызвать функцию задержки программы на 1 секунду: delay_ms(1000); 5. Проверить работоспособность программы. Для этого необходимо выполнить следующие действия: 5.1. Подключить соединительные провода от модуля USART к соответствующим выводам отладочной платы. Порт и номер ножки порта можно определить, посмотрев, какие выводы использованы для инициализации USART в функции «USART_ini(void)» в коде программы. 5.2. Запустить на ПК программу «ComMon.exe», которая находится в папке «ПО\Работа с COM портом\ComMon». Выбрать COM-порт и снять обе галочки «text».
Задание 2: 1. Написать функцию передачи строки по USART как описано в «Отправка строки с текстом по USART». 2. Написать счётчик, который увеличивает значение i на 1 каждую секунду. 3. С помощью функции sprintf из раздела «Использование функции sprintf» создайте строку вида «i=x», где вместо х вставляется значение i. 4. С помощью написанной функции по передаче строки, отправьте полученную строку на ПК. Задание 3: 1. Выяснить номера выводов, к которым подключены светодиоды, как описано в разделе «Определение подключения светодиодов» лабораторной работы 1. 2. В функцию main() после строки USART_ini(); добавить код инициализации выводов, к которым подключены светодиоды. Код скопировать из программы для лабораторной работы 1. 3. Найти в программе функцию обработки прерываний USART3_IRQHandler(void). После строки, которая реализует сохранение принятого байта в переменную Res_data, добавить проверку следующих условий (условную конструкцию if): если принятый байт равен 1, включить красный светодиод; если принятый байт равен 2, включить желтый светодиод; если принятый байт равен 3, включить зеленый светодиод; если принятый байт равен 4, включить синий светодиод. Если принят ноль, выключить все светодиоды. 4. Проверить работоспособность программы. Для этого необходимо выполнить следующие действия: 4.1. Подключить соединительные провода от модуля USART к соответствующим выводам отладочной платы. Порт и номер ножки порта можно определить, посмотрев, какие выводы использованы для инициализации USART в функции «USART_ini(void)» в коде программы. 4.2. Запустить на ПК программу «ComMon.exe», которая находится в папке «ПО\Работа с COM портом\ComMon». Выбрать COM-порт и снять обе галочки «text». Для отправки данных на МК необходимо ввести данные в строку внизу окна программы в виде шестнадцатеричных чисел и нажать кнопку «Send».
Лабораторная 4: USART Содержание: Задание расположено на стр 22.
Часть 1: USART. Краткое описание USART. Интерфейс USART — последовательный универсальный синхронно-асинхронный приемо-передатчик. Передача данных в USART осуществляется через равные промежутки времени. Этот временной промежуток определяется заданной скоростью USART и указывается в бодах (Для символов, которые могут принимать значения, равные только нулю или единице бод эквивалентен битам в секунду). Существует общепринятый ряд стандартных скоростей: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 бод. Помимо бит данных USART автоматически вставляет в поток синхронизирующие метки, так называемые стартовый и стоповый биты. При приёме эти лишние биты удаляются. Обычно стартовый и стоповый биты отделяют один байт информации (8 бит), однако встречаются реализации USART, которые позволяют передавать по 5, 6, 7, 8 или 9 бит. Биты, отделённые стартовым и стоповым сигналами, являются минимальной посылкой. USART позволяет вставлять два стоповых бита при передаче для уменьшения вероятности рассинхронизации приёмника и передатчика при плотном трафике. Приёмник игнорирует второй стоповый бит, воспринимая его как короткую паузу на линии. Принято соглашение, что пассивным (в отсутствие данных) состоянием входа и выхода USART является логическая «1». Стартовый бит всегда логический «0», поэтому приёмник USART ждёт перепада из «1» в «0» и отсчитывает от него временной промежуток в половину длительности бита (середина передачи стартового бита). Если в этот момент на входе всё ещё «0», то запускается процесс приёма минимальной посылки. Для этого приёмник отсчитывает 9 битовых длительностей подряд (для 8-бит данных) и в каждый момент фиксирует состояние входа. Первые 8 значений являются принятыми данными, последнее значение проверочное (стоп-бит). Значение стоп-бита всегда «1», если реально принятое значение иное, USART фиксирует ошибку. На рис 1.1 показана временная диаграмма передаваемых данных по USART.
Рис 1.1 Поскольку синхронизирующие биты занимают часть битового потока, то результирующая пропускная способность UART не равна скорости соединения. Например, для 8-битных посылок формата 8-N-1 синхронизирующие биты занимают 20 % потока, что для физической скорости 115 200 бод даёт битовую скорость данных 92160 бит/с или 11 520 байт/с. Контроль чётности В протоколе USART имеют возможность автоматически контролировать целостность данных методом контроля битовой чётности. Когда эта функция включена, последний бит данных («бит чётности») всегда принимает значение 1 или 0, так чтобы количество единиц в байте всегда было четным. Управление потоком В старые времена устройства с USART могли быть настолько медлительными, что не успевали обрабатывать поток принимаемых данных. Для решения этой проблемы модули USART снабжались отдельными выходами и входами управления потоком. При заполнении входного буфера логика принимающего USART выставляла на соответствующем выходе запрещающий уровень, и передающий USART приостанавливал передачу. Позже управление потоком возложили на коммуникационные протоколы, и надобность в отдельных линиях управления потоком постепенно исчезла. Область применения. USART обычно применяется для проводной связи между двумя устройствами, расстояние между которыми не превышает единиц метров. Увеличение дальности связи приводит к зашумлению сигнала и уменьшению вероятности его правильного приёма. Часть 2: Программирование USART. Популярное:
|
Последнее изменение этой страницы: 2017-03-11; Просмотров: 2559; Нарушение авторского права страницы