?️ Программный UART для STM32 HAL (использование библиотеки)

Немного накосячив в схеме регистратора-датчика влажности почвы (с освещенностью и температурой) с подключением блютуз-модуля JDY-23 к микроконтроллеру STM32F030F4P6 (указал не те выводы), чтобы не портить прототип (лень) решил использовать программный УАПП, вместо аппаратного. Быстренько нашел неплохую библиотеку с отличным описанием и легкостью использования:

Источник: https://github.com/liyanboy74/soft-uart

Настройка в STM32CubeIDE

Включаем отладчик (SYS -> Debug Serial Wire):

Устанавливаем частоту тактирования HCLK=48MHz (наибольшая):

Включаю Таймер 14, для скорости 9600 бод/с нужно установить один тик равный 20.83 мкс, то частоту 48 кГц. Запишем в предделитель (PCS) 0, а в регистр автоперезагрузки (ARR) 1000-1 (т.к. счёт с нуля) fCPU/Freq=48000000/48000=1000. Разрешаем прерывания от этого таймера:

Настраиваем один вывод как передающий (SOFT_TX) двухтактный выход, а другой как принимающий (SOFT_RX) на цифровой вход без подтяжки:

Готово, можно приступать к подключению библиотеки 

Копирование библиотеки

Можно через проводник скопировать файл softuart.c в Inc и softuart.h Src:

а далее нажать Обновить (Refresh). Файлы должны появиться (то же самое можно сделать копируя файлы в буфер обмена и вставляя прямо в окне Project Explorer):

Программирование

Подключаем заголовочный файл библиотеки программного UART:

/* USER CODE BEGIN Includes */ #include "softuart.h" /* USER CODE END Includes */

Открываем этот файл (Ctrl + ЛКМ по названию или выделение + F3), здесь можно поменять количество возможных UART (мне хватит и одного) и размеры массивов буферов (по умолчанию):

Перед главным циклом нужно настроить УАПП (их, кстати может быть аж восемь штук), правильно указав порты и выводы для передачи и приема (определенные ранее в кубе):

/* USER CODE BEGIN 2 */ /* For software UART */ SoftUartInit(0, SOFT_TX_GPIO_Port, SOFT_TX_Pin, SOFT_RX_GPIO_Port, SOFT_RX_Pin); /* USER CODE END 2 */

Запускаем прерывания от ранее настроенного таймера:

/* USER CODE BEGIN 2 */ /* For software UART */ SoftUartInit(0, SOFT_TX_GPIO_Port, SOFT_TX_Pin, SOFT_RX_GPIO_Port, SOFT_RX_Pin); HAL_TIM_Base_Start_IT(&htim14); /* USER CODE END 2 */

В обработчик прерывания (в данном случае для удобства используется функция обратного вызова) нужно прописать функцию-обработчик программного UART:

/* SOFT UART TIMER HANDLER */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance==TIM14) { SoftUartHandler(); } } /* USER CODE END 4 */

А далее в главном цикле с помощью функции передачи можно отправлять строку через промежутки времени:

/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { uint8_t Message[] = "Hola"; SoftUartPuts(0,(uint8_t *)Message, 4); HAL_Delay(100); /* USER CODE END WHILE */

Так как у меня этот программный UART подключен к BLE-модулю, то сообщения выводятся в приложении блютуз-терминале (должен быть включен GPS для подключения!). Что за мусор выводится в начале не знаю, пока он не мешает, но имейте ввиду.:

На осциллограмме, сделанной с помощью андроид-приставки HS101 всё хорошо:

Кому нужен проект для STM32CubeIDE, то вот (там еще АЦП настроен, если что) [пароль: cxemka.com]Software_UART_STM32_HAL.zip

629
RSS
Нет комментариев. Ваш будет первым!
Загрузка...