Подписаться на получение новых статей на почту:

Stm32. Протокол USART/UART на CMSIS. Шаг №85

Всем привет. В прошлый раз мы с Вами использовали библиотеку HAL и CubeMX, настраивая модуль UART, для передачи и приема информации. Сегодня мы с вами проделаем тоже, но уже используя библиотеку CMSIS, т.е. будем непосредственно работать с регистрами.

Для этого нам понадобится Reference manual STM32F303xB/C/D/ advanced ARM®-based MCU, архив stdperiph_lib в котором содержится библиотеки CMSIS, для работы с регистрами, и SPL где параметры периферии описаны в виде структур и др., в общем скачиваем все это с с сайта st.com.

std_periph

Также библиотеки CMSIS содержатся в репозитории куба. Но мы сегодня не будем работать с ним. Создадим пустой проект в CooCox и перенесем интересующие нас библиотеки в него. Ниже рисунок, где видно какие файлы мы перемещаем из скаченного архива. Единственно что мы создаем так это файлы main.c and main.h и раскоментируем строку с нашим контроллером.

project

Также проделываем остальные шаги по настройке  CooCox CoIDE. Подключаем stm32f303x.h, создаем пустую функцию, компилируем. Проект работает. Теперь можно приступать к настройке UART.

Coocox_CMSIS

Для начала определим на какой шине сидит наш интерфейс.

bus_uart4

Напишем функцию инициализации UART4 для микроконтроллера stm32f303vct6, где затактируем шины и сконфигурируем регистры. Настройки частоты находятся в файле system_stm32f30x.c. У меня идет тактирование от внешнего кварца на 8Мгц System Clock source | PLL (HSE), далее частота умножается на 9 и на шину AHB приходит 72 Мгц, где мы затактируем GPIOC, а на APB1 у нас приходит 36 Мгц, максимально возможная в данной модели на этой шине.
void UART_Init (void){
       RCC->APB1ENR |= RCC_APB1ENR_UART4EN; //Подаем тактирование на уарт — 36Мгц
       RCC->AHBENR|=RCC_AHBENR_GPIOCEN; //Включаем тактирование порта GPIOC — 72Мгц
Ниже я приведу таблицу, которая взята с следующего ресурса (https://hubstub.ru/stm32/151-stm32f3-i-stm32f4-gpio.html) и облегчает конфигурацию ножки.

1484757037_screenshot_1

MODER определяет режим работы вывода
00: режим входа(после сброса)
01: режим выхода
10: режим альтернативных функций
11: аналоговый режим
OTYPER определяет тип выхода
0: двухтактный выход или push-pull сокращено PP (после сброса)
1: открытый сток или open-drain сокращено OD
OSPEEDR определяет частоту переключения выхода
x0: 2 MHz
01: 10 MHz
11: 50 MHz
PUPDR определяет подтяжку вывода
00: без подтяжки
01: подтяжка к плюсу питания или pull-up сокращено PU
10: подтяжка к земле или pull-down сокращено PD
11: зарезервирован

//Настраиваем порт Tx
GPIOC->MODER |= GPIO_MODER_MODER10_1; //10 — режим альтернативной функции.
GPIOC->OTYPER &= ~GPIO_OTYPER_OT_10; /*0 — 0: двухтактный выход или push-pull сокращено PP (после сброса)*/
GPIOC->PUPDR &= ~GPIO_PUPDR_PUPDR10_0; /*01 — подтяжка к плюсу питания или pull-up сокращено PU*/
GPIOC->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR10; /*11 — 50 MHz, высокочастотный выход*/
GPIOC->AFR[1]|=(0×05<<(4*2)); /*Назначаем 10 выводу альтернативную функцию*/
Здесь небольшое пояснение.  У микроконтроллеров этих серий надо конкретно указывать какая альтернативная функция будет соответствовать данному выводу. Настраиваются альтернативные функции с помощью двух регистров AFRL и AFRH. AFRL отвечает за настройку 8 младших выводов порта, AFRH за настройку 8 старших выводов порта, то есть с 8 по 15. Альтернативные функции вывода можно найти в даташите на МК: STM32F303xB STM32F303xC.

Alterate-functions

Нам необходимо выводу PС10 назначить функцию uart4tx. Для этого мы должны записать номер альтернативной функции в AFRH3 (AFR[1]).(т. к. выводы с 0 по 7 настраиваются в AFRL, то за настройку 10 вывода отвечает AFRH3 (10 — 7 = 3) (AFR10[3:0]). Номер альтернативной функции соответствует номеру столбца, в данном случае AF5, значит в AFRH3 надо записать 5. Следующая запись (0×05<<(4*2)) говорит ,  что первый операнд тетрады это значение AF, второй сама тетрада, третий порядковый номер пина.  Ниже еще два примера выбора альтернативной функции:

/* (3) Select AF2 on PA5 in AFRL for TIM2_CH1 */
/* (4) Select AF2 on PA8 and PA9 in AFRH for TIM1_CH1 and TIM1_CH2 */
GPIOA->AFR[0] |= 0×02 << (5 * 4); /* (3) */
GPIOA->AFR[1] |= 0×02 | (0×02 << ((9 — 8) * 4)); /* (4) */

AFR_uart

//Настаиваем Rx PC11
GPIOC->MODER |= GPIO_MODER_MODER11_1; //10 — режим альтернативных функций
GPIOC->PUPDR &= ~GPIO_PUPDR_PUPDR11; //00 — состояние после сброса, no pull up, pull down
GPIOC->AFR[1]|=(0×05<<(4*3)); //Назначаем 11 выводу альтернативную функцию

Выводы настроили. Следующий шаг – это настройка скорости. Т.к я использую свой самодельный usb-uart и модули wi-fi у меня также настроены на скорость 9600, то рассчитываем коэффициент под частоту 36 Мгц. Этот регистр может быть записан только при отключении USART.

     UART4->BRR=0xea6; //(16)(36000000+4800)/9600 = 0xea6 (3750)
     UART4->CR1|=USART_CR1_UE|USART_CR1_TE|USART_CR1_RE; //Вкл. uart, приема и передачи    
     UART4->CR1|=USART_CR1_RXNEIE; //Разрешаем генерировать прерывание по приему
     NVIC_EnableIRQ (UART4_IRQn); //Включаем прерывание, указываем вектор
}

Тепер напишеш обработчик прерывания.

void UART4_IRQHandler (void) {
      if (UART4->ISR & USART_CR1_RXNEIE) { /*следим за состоянием даннго флага 1 — данные пришли, 0- пусто*/
           t = UART4->RDR;
           if (t == '0'){ // Если отправляем ноль, включаем светодиод 10
                 GPIOE->ODR|=GPIO_ODR_10;
           }
           if (t == '1'){ 
                 GPIOE->ODR|=GPIO_ODR_11;
           }
           GPIOE->ODR|=GPIO_ODR_9;
      }
}
int main (void) {
..........................................
UART4_Send_String («Ok\r\n»);
}

/*Функции отправки символа и строки*/
void UART4_Send (char chr){
      while (!(UART4->ISR & USART_ISR_TC)); /*Сравниваем регистр статуса с разрядом установки флага об окончании прерывания*/
               UART4->TDR = chr;
}
void UART4_Send_String (char* str){
       uint8_t i = 0;
       while (str[i])
              UART4_Send (str[i++]);
}

Ниже выложен исходник и рисунок результата работы. Где по приему 0 зажигается светодиод 10, 1- 11. И постоянно происходит отправка «Ok».

Исходник:

Передача/прием UART используя CMSIS ( Скачали: 97 чел. ) 

stm32_uart_cmsis

Сегодня мы рассмотрели  UART, рассмотрели регистры для настройки, использовали прерывания. Интегрировали библиотеку CMSIS в IDE Coocox. В следующей статье подключим модуль wi-fi esp8266 к данному микроконтроллеру. Как только мы увидим в списке устройств наш модуль то перейдем к Android – приложению и добавим функцию переключения wi-fi. На этом сегодня и остановимся. Всем пока.

Просмотрено 2745 раз.

Я на Google+

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting