• Система автоматизации с открытым исходным кодом на базе 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
Вместимость приемного буффера задаете Вы сами. А как определить конец передачи или готовность данных определять Вам самим. Так что бизнес логику придется делать самому.
 
Сверху Снизу