СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №9/2013
ЭЛЕМЕНТЫ И КОМПОНЕНТЫ 26 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 9 2013 П РОГРАММНОЕ ИСПОЛЬЗОВАНИЕ ПОРТОВ USART После знакомства с назначением регистров порта USART рассмотрим пример его инициализации. Допустим необходимо настроить порт USART1 для связи с компьютером со скоростью обмена 9600 бод. Определим формат кадра порта с длиной посылки данных 8 бит, одним стоп-битом, без контро- ля паритета. Частоту тактового сигна- ла примем равной 24 МГц. Вначале необходимо включить так- тирование порта USART и портов GPIO с помощью следующего набора команд: RCC->APB2ENR | = RCC_APB2ENR_ USART1EN; // Включить тактирование порта USART1 RCC->APB2ENR | = RCC_APB2ENR_ IOPAEN; // Включить тактирование GPIO RCC->APB2ENR | = RCC_APB2ENR_ AFIOEN; // Включить тактирование альтернативных функций GPIO Далее следует рассчитать скорость обмена для порта и записать получен- ное значение в регистр USART1_BRR. Итак: USARTDIV = fck / (16 × baud) = = 24 000 000/(16 × 9600) = 156,25. Переменная DIV_Mantissa составляет 156 = 0x9C, а переменная DIV_Fraction = 0,25 × 16 = 4. Запись значения скорости в регистр USART1_BRR выполняется с помощью команды: USART1->BRR = 0x09с4; // Задать скорость обмена порта USART1 равную 9600 бод Количество стоп-битов задаётся командой: USART1->CR2 = ∼ USART_CR2_STOP; // Значение STOP = 00 соответствует 1 стоп-биту Разрешение работы приёмника, пере- датчика и порта можно задать одной командой: USART1->CR1 = USART_CR1_RE | USART_ CR1_TE | USART_CR1_UE Теперь инициализация порта выпол- нена. Для передачи данных через порт USART необходимо записать переда- ваемый байт в регистр USART_DR кон- кретного порта: USART1->DR = data; // Передать байт данных Прежде чем передавать следующий байт необходимо дождаться оконча- ния передачи предыдущего байта, ана- лизируя состояние разряда TC регистра USART_SR: while((USART1->SR USART_ SR_TC)==0) {} // Ждать окончания передачи USART1->SR = ∼ USART_SR_TC; // Очистить флаг окончания передачи Приём информации от порта мож- но осуществлять следующим образом: while((USART1->SR USART_SR_ RXNE)==0) {} // Ждать приёма информации temp = USART1->DR; // Считать принятый байт В данном случае сброс флага окон- чания приёма производится автомати- чески после чтения регистра данных. Обмен информацией через порт USART с помощью ожидания установ- ки флагов является неэффективным и приводит к значительным потерям производительности микроконтрол- лера, а порой и к зависанию програм- мы. Во избежание этих проблем реко- мендуется использовать работу с пор- том USART по прерываниям. Для работы по прерываниям необхо- димо написать функцию обработчика прерывания, в которой будет прово- диться анализ причины прерывания, а также будут выполняться необходи- мые операции для его обработки. Такая функция может иметь следу- ющий вид: void USART1_IRQHandler(void) { unsigned char temp; // Временная байтовая переменная if((USART1->SR USART_SR_RXNE)!=0) // Если приём завершен { temp = USART1->DR; // Считать принятый байт … // Выполнить необходимые действия } if((USART1->SR USART_SR_TC)!=0) // Если передача завершена { USART1->SR = ∼ USART_SR_TC; // Сбросить флаг … // Выполнить необходимые действия } } Для активации прерываний от пор- та USART необходимо сначала их раз- решить и затем задать события, кото- рые будут генерировать прерывания с помощью следующих команд: NVIC_EnableIRQ (USART1_IRQn); // Разрешить прерывания от USART1 USART1->CR1 | = USART_CR1_TCIE; // Разрешить прерывание по окончанию передачи USART1->CR1 | = USART_CR1_RXNEIE; // Разрешить прерывание по приёму данных Использование прерываний осво- бождает процессор микроконтролле- ра от необходимости постоянной про- верки флагов и позволяет высвободить его ресурсы для других действий. Помимо прерываний уменьшить нагрузку на процессор микроконтрол- лера позволяет использование DMA. Но это уже тема отдельной статьи… Л ИТЕРАТУРА 1. https://www.st.com 2. http://www.st.com/web/en/resource/ technical/document/reference_manual/ CD00246267.pdf Рис. 4. Структурная схема формирования прерываний от порта USART Прерывание USART TC TCIE TXE TXIE CTS CTSIE IDLE IDLEIE PE PEIE EIE DMAR FE NE ORE LBD LBDIE RXNEIE ORE RXNEIE RXNE © СТА-ПРЕСС
RkJQdWJsaXNoZXIy MTQ4NjUy