π ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ 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