Главная » Статьи » Уроки по программированию stm32fxxx » Уроки по программированию stm32f1xx |
Урок 6: USART на StdPeriph
В данном уроке мы не будем подробно рассматривать сам интерфейс UART. Подразумевается, что вы его и так хорошо знаете. Если это не так, то можете почитать про него скажем тут. Программирование UART в STM32 происходит по тому же алгоритму, что и раньше: 0) Подключить USART в StdPeriph. 1) Включаем тактирование порта, на который выведен UART. 2) Инициализируем выводы UART на работу в альтернативном режиме. 3) Включаем тактирование UART. 4) Инициализируем UART. 5) Разрешаем глобальные прерывания прерывания. 6) Разрешаем прерывания от UART. 7) Включаем работу UART. На этом инициализация заканчивается. Пройдёмся по всему по порядку. 0) Для подключения надо просто расскоментировать строку #include "stm32f10x_usart.h" в файле stm32f10x_conf.h 1) Включение тактирования порта вам должно быть знакомо: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 2) Настройка портов имеет только оду тонкость. Нужно настроить вывод TX (передача) как выход Push/Pull, а RX (приём) как вход с открытым коллектором. //Настраиваем порт на выход Push/Pull PORTA_init_struct.GPIO_Pin = GPIO_Pin_9; PORTA_init_struct.GPIO_Speed = GPIO_Speed_50MHz; PORTA_init_struct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &PORTA_init_struct); //Настраиваем порт на вход с открытым коллектором PORTA_init_struct.GPIO_Pin = GPIO_Pin_10; PORTA_init_struct.GPIO_Speed = GPIO_Speed_50MHz; PORTA_init_struct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &PORTA_init_struct); 3) Включение тактирования UART делается аналогично: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); APB2PeriphClockCmd - Список устройств, которые включаются этой функцией можно найти в файле stm32f10x_rcc.h. 4) Собственно сама инициализация: Для инициализации с помощью библиотеки StdPeriph как обычно надо.. Извините, потом допишу статью как надо. Вот код: USART_InitTypeDef USART_InitStructure; // конфигурируем USART1 USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_Init(USART1, &USART_InitStructure); 5) NVIC_EnableIRQ(USART1_IRQn); 6) разрешаем прерывания по приёму USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); 7) USART_Cmd(USART1, ENABLE); Функция прерывания от UART, которая возвращает принятый байт. Только тут стоит учитывать 2 момента: 1) Флаг прерывания зачастую аппаратно не сбрасывается. 2) У USART все прерывания вызывают одну и ту же функцию. Т.е. нам надо различать различные прерывания и самим сбрасывать флаг прерывания. В итоге функция, вызываемая USART выглядит так: void USART1_IRQHandler(void) { // Обработка события RXNE if ( USART_GetITStatus(USART1, USART_IT_RXNE) ) { USART_ClearITPendingBit(USART1, USART_IT_RXNE); //Сюда пишется, что должно произойти приёме одного байта USART_SendData(USART1, USART_ReceiveData(USART1)); }; // Обработка события TXE if ( USART_GetITStatus(USART1, USART_IT_TXE) ) { USART_ClearITPendingBit(USART1, USART_IT_TXE); //Сюда пишется, что должно произойти после передачи байта. }; } } И последнее, перед посылкой ожидайте отправки предыдущего байта с помощью строки: while (!USART_GetFlagStatus(USART1, USART_SR_TXE)) {} Т.е. выглядит это так: //------------------------------------------------------------------------------------- //Функция отправляющая байт в UART //------------------------------------------------------------------------------------- void send_to_uart(uint8_t data) { while(!(USART1->SR & USART_SR_TC)); //Ждем пока бит TC в регистре SR станет 1 USART1->DR=data; //Отсылаем байт через UART } | |
Просмотров: 10265 | Комментарии: 7 | |
Всего комментариев: 6 | |||||
| |||||