• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь STM32 + Esp8266

tishenko_vlad

New member
Некоторое время назад я пользовался онлайн компилятором mbed, для разработки приложений под stm32, однако некоторое время назад пришлось перейти на Keil, STMCubeMX и как следствие на библиотеку HAL. До этого я подключал Esp8266 и при программировании stm'ки данные нормально передавались и принимались. Теперь же, при использовании функций библиотеки HAL (в частности HAL_UART_Transmit/HAL_UART_Receive), у меня не получается получить в ответ каки-либо адекватные данные. В связи с этим прошу кого-нибудь скинуть хоть какой-нибудь работающий пример кода для STM32, где происходит обмен данными STM32-Esp8266.
 

Alex_82

New member
Вроде как без разницы с чем обмен вести. Вам надо usart завести на 115200 и ловить прерывания по нем. Слаживать байтики в массив и следить за контролем переполнения буффера. А если Вам нужен раблочий код со всей бизнес логикой то думаю ищете не тут.
 

Юрий Ботов

Moderator
Команда форума
Проверенная конфига UART1 под 103r8 , GCC

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

GPIO_InitTypeDef PORT; //Структура содержащая настройки порта
USART_InitTypeDef USART; //Структура содержащая настройки USART

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //Включаем тактирование порта USART1

//Пины PA9 и PA10 в режиме альтернативных функций – Rx и Tx USART’а
GPIO_StructInit(&PORT); //Инициализируем с дефолтными настройками
// задаем параметры
PORT.GPIO_Pin = GPIO_Pin_9;
PORT.GPIO_Mode = GPIO_Mode_AF_PP;
PORT.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA , &PORT);

PORT.GPIO_Pin = GPIO_Pin_10;
PORT.GPIO_Mode = GPIO_Mode_IN_FLOATING;
PORT.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA , &PORT);

//Настройка USART
USART_StructInit(&USART); //Инициализируем с дефолтными настройками
// задаем параметры
USART.USART_BaudRate = 9600; //Скорость обмена 9600 бод
USART.USART_WordLength = USART_WordLength_8b; //Длина слова 8 бит
USART.USART_StopBits = USART_StopBits_1; //1 стоп-бит
USART.USART_Parity = USART_Parity_No ; //Без проверки четности
USART.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //Без аппаратного контроля
USART.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //Включен передатчик и приемник USART2
USART_Init(USART1, &USART);

USART_Cmd(USART1, ENABLE); //Включаем UART

//Глобальное включение прерывания
__enable_irq();
//Прерывание по приему
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//Включаем прерывания от UART
NVIC_EnableIRQ(USART1_IRQn);

SysTick_Config(SystemCoreClock / 1000);
...

void USART1_IRQHandler() {
...
}
 

tishenko_vlad

New member
А позвольте еще один вопрос, как можно проверить не готовы ли какие-либо данные для чтения? Ранее, при программировании в mbed'e это можно было сделать вызвав у объекта класса Serial метод readable(); есть ли такая возможность в библиотеке HAL?
 

tishenko_vlad

New member
До меня дошло в чем была основная проблема: функция HAL_UART_Receive(); принимает данные только до "\r\n".
 

Alex_82

New member
Вам привели пример. Где есть прерывание по приему данных по уарт
Код:
void USART1_IRQHandler() {
...
}
Вот тут вся магия п приему и происходит. Хотите отслеживайте \r\n, хотите +. А можете смотеть только на один байт. Я так делал когда надо было принимать СМС от gsm модема на pic16f628a. Считал запятые и т.д.
 

Alex_82

New member
Вместимость приемного буффера задаете Вы сами. А как определить конец передачи или готовность данных определять Вам самим. Так что бизнес логику придется делать самому.
 
Сверху Снизу