Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/74: Рейтинг темы: голосов - 74, средняя оценка - 4.68
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331

STM32F103C8T6 HAL UART

26.09.2016, 23:13. Показов 14010. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер.
Ситуация такая, не могу понять как правильно реализовать прием данных по UART не использую к примеру прерывания.
У меня есть GSM модем m590e, необходимо принимать с него данные и обрабатывать.

Это отправка данных в модем
C++
1
2
3
4
5
6
7
8
9
10
11
unsigned char CR=0x0D;
unsigned char LF=0x0A;
void UART_Write(unsigned char *pack)
{
    int a = strlen((unsigned char *)pack);
    HAL_UART_Transmit(&huart1,(unsigned char *)pack,a,10000);
    HAL_UART_Transmit(&huart1,&CR,1,10000);
    HAL_UART_Transmit(&huart1,&LF,1,10000);
}
...
UART_Write("AT+CGSN");
Проблема с приемом, точнее как правильно принимать не используя прерывания!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.09.2016, 23:13
Ответы с готовыми решениями:

Сообщения для 2 UART выводятся в 1 UART, STM32F103C8T6
Почему может неправильно работать uart? Подключил 1 uart к пк через usb/uart переходник, а второй к gsm модему. В первый уарт вывожу инфу...

Одновременный прием и передача по uart в stm32f103c8t6
Вообщем есть задача создать устройство которое будет опрашивать счётчики (по 485-му интерфейсу) и передавать данные. Модем по простому....

STM32F407 + HAL + UART
Доброго времени суток! Изучаю основы работы UART. Отладочная плата STM32F407 Discovery. Библиотека HAL. Подключаю через UART...

47
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
26.09.2016, 23:22
Цитата Сообщение от GaFBich Посмотреть сообщение
Проблема с приемом, точнее как правильно принимать не используя прерывания!
сидеть и ждать в бесконечном цикле пока не выставится флаг приема
чем так прерывание то не угодило?
1
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
26.09.2016, 23:40  [ТС]
Просто изначально решил сделать без прерываний, потом сделаю с прерыванием! А вот насчет считывания флага приема, тут у меня была каша
C++
1
#define __HAL_UART_CLEAR_IDLEFLAG(__HANDLE__)   __HAL_UART_CLEAR_FLAG((__HANDLE__), UART_CLEAR_IDLEF)
сам флаг
C++
1
*            @arg UART_FLAG_RXNE:  Receive data register not empty flag
а вот как правильно проверить данный флаг, у меня не получилось!?
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
27.09.2016, 01:55
Добавлено через 12 минут
GaFBich,
C++
1
2
3
4
5
6
if (USORT_GetITStatus(USORTx, USORT_IT_RXNE) != RESET)
{
      USORT_ClearITPendingBit(USORTx, USORT_IT_RXNE);
      ....
      x = UARTx->DR;
}
На память вроде так, это в SPL, в HAL есть подобные функции посмотри в библиотеке. Можно на прямую через регистры
C++
1
2
3
4
5
6
if (USORTx->SR &USORT_FLAG_RXNE) != RESET)
{
      USORTx->SR &USORT_FLAG_RXNE) = RESET;
      ....
      x = UARTx->DR;
}
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
27.09.2016, 06:55
_SayHelli, бит сбрасывается когда происходит чтение
GaFBich, вот кусок реальной проги
C
1
2
3
4
5
6
uint8_t Usart3_Get_symbol ()
 {
   while((USORT3->SR & USORT_SR_RXNE)==0) {};//ожидание приема
    return USORT3->DR;       //прочитать принятый байт
 
}
0
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
27.09.2016, 09:28  [ТС]
а точно ли регистр SR, по даташиту вроде как ISR? То есть пока идет последовательность байтов, то данный флаг (RXNE: Read data register not empty) сброшен, как только в эфире "пусто" - флаг устанавливается в 1
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
27.09.2016, 09:51
GaFBich, а камень у вас какой?
Пардон с утра туплю.

Добавлено через 9 минут
GaFBich, честно говоря в даташите не нашел ничего про регистр ISR. Зато про регистр SR на странице 823 нашел.
ValeryS,
Да, спасибо, забыл что при чтении DR флаг очищается. Если не забирать данные то флаг не очищается

Добавлено через 3 минуты
GaFBich, Как только что-то попадает в регистр DR(Data Register) устанавливается бит RXNE в 1, как только вы считали регистр DR, флаг сбрасывается в 0
1
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
27.09.2016, 09:58
Цитата Сообщение от _SayHelli Посмотреть сообщение
Пардон с утра туплю.
та же фигня
сбило с толку HAL для 103 с ним не работал
вот кусок для 103
C
1
2
3
4
5
uint8_t Usart1_Get_symbol ()
 {
   while((USORT1->SR & USORT_SR_RXNE)==0) {}//ожидание приема
        return USORT1->DR;       //прочитать принятый байт
}
то же самое только порт другой
Цитата Сообщение от GaFBich Посмотреть сообщение
а точно ли регистр SR, по даташиту вроде как ISR?
там нет регистра ISR
вот его структура
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct
{
  __IO uint16_t SR;
  uint16_t  RESERVED0;
  __IO uint16_t DR;
  uint16_t  RESERVED1;
  __IO uint16_t BRR;
  uint16_t  RESERVED2;
  __IO uint16_t CR1;
  uint16_t  RESERVED3;
  __IO uint16_t CR2;
  uint16_t  RESERVED4;
  __IO uint16_t CR3;
  uint16_t  RESERVED5;
  __IO uint16_t GTPR;
  uint16_t  RESERVED6;
} USORT_TypeDef;
1
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
27.09.2016, 14:40  [ТС]
Прошу меня извинить, я сам читал даташит от stm32f051R8T6.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
27.09.2016, 15:17
GaFBich, на будущее, когда выбираешь камень для программирования, всегда подключаешь заголовочный файл
в данном случае stm32f10x.h
так вот в нем описаны все структуры периферии
мой кусок кода, с описанием структуры, оттуда
0
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
29.09.2016, 22:41  [ТС]
Ночи доброй! Подскажите, как правильно написать обработчик, чтобы отслеживал что данные приняты приемником(модемом), что можно отправлять новые! Или же правильнее отслеживать ответ от модема в виде OK?
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
29.09.2016, 22:52
GaFBich, Вообще у uart есть флаг, TC(Transfer completed) - передача завершена. Соответственно перед следующей передачей проверяем этот флаг. А так если вы знаете формат пакета который посылает модем при приеме сообщения, вы просто, когда принимаете от него посылки проверяете пакет на наличие ОК, и если ОК то ставите флажок какойнибудь и проверяете его в функции передачи вместе с флагом TC. после передачи соответственно скидываете его
1
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
29.09.2016, 22:57  [ТС]
Я такую проверку делал
C++
1
while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)==RESET){};
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
29.09.2016, 23:02
GaFBich, ну здесь вы крутитесь в бесконечном цикле пока TC = 0; То есть посылка отправляется. Как только флажок станет 1 выйдите из цикла. Вроде правильно. Но можно и просто if ом проверять, так вы не будете загонять программу в цикл
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
29.09.2016, 23:33
GaFBich, почему не хотите прерывание использовать?

Добавлено через 27 минут
Не знаете как сделать?
1. В кубике разрешаем прерывание на UART (я использую 1)
2. В файле stm32f1xx_it.c появиться обработчик void USORT1_IRQHandler(void){}
3. Пишем в него
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void USORT1_IRQHandler(void) 
{
 
    // Обработка события RXNE
    if ( USORT_GetITStatus(USORT1, USORT_IT_RXNE) ) 
   {
        USORT_ClearITPendingBit(USORT1, USORT_IT_RXNE);
        // ... Код обработчика ...
    };
 
    // Обработка события TXE
    if ( USORT_GetITStatus(USORT1, USORT_IT_TXE) ) 
   {
        USORT_ClearITPendingBit(USORT1, USORT_IT_TXE);
        // ... Код обработчика ...
    };
 
    // Обработка других событий... 
};
А с DMA еще веселей
ВНИМАНИЕ КОД НЕ РАБОЧИЙ ДЛЯ HAL!!!!!
Завтра поправлю.
2
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
01.10.2016, 01:05
В главном цикле написал вот так:
C
1
2
3
4
5
6
7
8
9
10
  while (1)
  {
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
    HAL_Delay(500);
 
    if(HAL_UART_Receive_IT(&huart6, receiveBuffer, 9) == HAL_OK)
    {
        HAL_UART_Transmit_IT(&huart6, transmitBuffer, 1);
    }
}
Хочу принять 9 байт как приму отправлю "H". Обратите внимание на функцию "HAL_Delay(500)" читал что это задержка в хале не на таймере. В видео голубенькое набираю с клавы красненькое отправляет плата.
https://www.youtube.com/watch?v=IUie3g_X-rg
Вывод:
Слушать порт без DMA это полная х***Я
Сделал вот так HAL_Delay(10000); 10сек задержка, мдя работает, осталось одна проблема как принимать если длинна пакета может быть разной. Завтра порешаем вопрос, если побежу будет класс, уж больно жалко DMA на эту ерунду.
0
Эксперт .NET
 Аватар для Rius
13156 / 7714 / 1679
Регистрация: 25.05.2015
Сообщений: 23,506
Записей в блоге: 14
01.10.2016, 10:09
Авось пригодится

Что было сделано в начале:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
commit *
Author: Rius
Date:   Wed Jul 29 18:30:50 2015 +0500
 
    Добавлен обработчик для uart, реализующий функцию эха.
 
diff --git a/.settings/org.eclipse.core.runtime.prefs b/.settings/org.eclipse.core.runtime.prefs
deleted file mode 100644
index 5a0ad22..0000000
--- a/.settings/org.eclipse.core.runtime.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-line.separator=\n
diff --git a/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h b/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h
index 7d65ca5..f5794c0 100644
--- a/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h
+++ b/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h
@@ -693,6 +693,7 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);
 void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
 void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);
 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
+void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart);
 void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
 void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);
 
diff --git a/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c b/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c
index 2c2bffd..05b0447 100644
--- a/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c
+++ b/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c
@@ -1238,6 +1238,15 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
     UART_EndTransmit_IT(huart);
   }  
 
+  tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE);
+  tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_IDLE);
+  /* UART in mode Receiver end (idle) ----------------------------------------*/
+  if((tmp_flag != RESET) && (tmp_it_source != RESET))
+  {
+    __HAL_UART_CLEAR_IDLEFLAG(huart);
+    HAL_UART_RxIdleCallback(huart);
+  }
+
   if(huart->ErrorCode != HAL_UART_ERROR_NONE)
   {
     /* Set the UART state ready to be able to start again the process */
@@ -1248,6 +1257,19 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
 }
 
 /**
+  * @brief  Rx Idle callbacks.
+  * @param  huart: Pointer to a UART_HandleTypeDef structure that contains
+  *                the configuration information for the specified UART module.
+  * @retval None
+  */
+__weak void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
+{
+ /* NOTE: This function should not be modified, when the callback is needed,
+          the HAL_UART_RxIdleCallback can be implemented in the user file
+  */
+}
+
+/**
   * @brief  Tx Transfer completed callbacks.
   * @param  huart: Pointer to a UART_HandleTypeDef structure that contains
   *                the configuration information for the specified UART module.
diff --git a/Src/freertos.cpp b/Src/freertos.cpp
index 4ca68c6..63be96b 100644
--- a/Src/freertos.cpp
+++ b/Src/freertos.cpp
@@ -38,6 +38,8 @@
 
 /* USER CODE BEGIN Includes */     
 #include "freertos_main.h"
+#include "stm32f1xx_hal.h"
+#include "../Application/application.h"
 /* USER CODE END Includes */
 
 /* Variables -----------------------------------------------------------------*/
@@ -46,7 +48,7 @@ osThreadId taskDisplayHandle;
 osThreadId taskKeyboardHandle;
 
 /* USER CODE BEGIN Variables */
-
+extern UART_HandleTypeDef huart1;
 /* USER CODE END Variables */
 
 /* Function prototypes -------------------------------------------------------*/
@@ -135,13 +137,26 @@ void taskKeyboardFunc(void const * argument)
   /* Infinite loop */
   for(;;)
   {
-    osDelay(1);
+    app.protocols()->process(&huart1);
   }
   /* USER CODE END taskKeyboardFunc */
 }
 
 /* USER CODE BEGIN Application */
-     
+void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
+{
+  app.protocols()->callbackTxCompleted(huart);
+}
+
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
+{
+  app.protocols()->callbackRxCompleted(huart);
+}
+
+void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
+{
+  app.protocols()->callbackRxCompleted(huart);
+}
 /* USER CODE END Application */
 
 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
И после обновления версии HAL, что затёрло часть моих изменений:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
commit *
Author: Rius
Date:   Thu Jan 21 18:04:40 2016 +0500
 
    Восстановлено завершение приёма по прерыванию IDLE
 
diff --git a/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c b/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c
index a901f0a..128f5e5 100644
--- a/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c
+++ b/Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c
@@ -179,6 +179,7 @@ static void UART_SetConfig (UART_HandleTypeDef *huart);
 static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart);
 static HAL_StatusTypeDef UART_EndTransmit_IT(UART_HandleTypeDef *huart);
 static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart);
+static HAL_StatusTypeDef UART_EndReceive_IT(UART_HandleTypeDef *huart);
 static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma);
 static void UART_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
 static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
@@ -913,6 +914,9 @@ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData,
     /* Enable the UART Data Register not empty Interrupt */
     __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
 
+    /* Enable the UART Idle line detection Interrupt */
+    __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);
+
     return HAL_OK;
   }
   else
@@ -1044,6 +1048,9 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData
     tmp = (uint32_t*)&pData;
     HAL_DMA_Start_IT(huart->hdmarx, (uint32_t)&huart->Instance->DR, *(uint32_t*)tmp, Size);
 
+    /* Clear the IDLE flag in the SR register by writing 0 to it */
+    __HAL_UART_CLEAR_FLAG(huart, UART_FLAG_IDLE);
+
     /* Enable the DMA transfer for the receiver request by setting the DMAR bit 
        in the UART CR3 register */
     SET_BIT(huart->Instance->CR3, USORT_CR3_DMAR);
@@ -1224,6 +1231,14 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
     UART_Receive_IT(huart);
   }
   
+  tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE);
+  tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_IDLE);
+  /* UART in mode Receiver ---------------------------------------------------*/
+  if((tmp_flag != RESET) && (tmp_it_source != RESET))
+  {
+    UART_EndReceive_IT(huart);
+  }
+
   tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_TXE);
   tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_TXE);
   /* UART in mode Transmitter ------------------------------------------------*/
@@ -1856,6 +1871,44 @@ static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
   }
 }
 
+static HAL_StatusTypeDef UART_EndReceive_IT(UART_HandleTypeDef *huart)
+{
+  uint32_t tmp_state = 0;
+
+  /* Disable the UART RXNE Interrupt */
+  __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
+  /* Disable the UART Idle Interrupt */
+  __HAL_UART_DISABLE_IT(huart, UART_IT_IDLE);
+
+  tmp_state = huart->State;
+
+  if((tmp_state == HAL_UART_STATE_BUSY_RX) || (tmp_state == HAL_UART_STATE_BUSY_TX_RX))
+  {
+    /* Check if a transmit process is ongoing or not */
+    if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
+    {
+      huart->State = HAL_UART_STATE_BUSY_TX;
+    }
+    else
+    {
+      /* Disable the UART Parity Error Interrupt */
+      __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
+
+      /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
+      __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
+
+      huart->State = HAL_UART_STATE_READY;
+    }
+    HAL_UART_RxCpltCallback(huart);
+
+    return HAL_OK;
+  }
+  else
+  {
+    return HAL_BUSY;
+  }
+}
+
 /**
   * @brief  Configures the UART peripheral. 
   * @param  huart: Pointer to a UART_HandleTypeDef structure that contains
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
void ProtocolHandler::callbackTxCompleted(UART_HandleTypeDef *huart)
{
  osSemaphoreRelease(this->mSemSerialCommTxCompletedHandle);
}
 
void ProtocolHandler::callbackRxCompleted(UART_HandleTypeDef *huart)
{
  __HAL_UART_DISABLE_IT(huart, UART_IT_IDLE);
  osSemaphoreRelease(this->mSemSerialCommRxIdleHandle);
}
 
void ProtocolHandler::process(UART_HandleTypeDef *huart)
{
  while (true) {
    __HAL_UART_CLEAR_IDLEFLAG(huart);
    __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);
 
    this->mDirection485.set(Drivers::Direction::Receive);
 
    if (HAL_UART_Receive_DMA(huart, this->mRxBuffer, sizeof(this->mRxBuffer)) != HAL_OK) {
      // error
    }
 
    int retval = osSemaphoreWait(this->mSemSerialCommRxIdleHandle, osWaitForever);
    int rcvdCount = sizeof(this->mRxBuffer) - huart->hdmarx->Instance->CNDTR;
    HAL_UART_DMAStop(huart);
 
    int sendCount;
 
    if (this->processPacket(
          this->mRxBuffer,
          rcvdCount,
          this->mTxBuffer,
          sizeof(this->mTxBuffer) - ProtocolHandler::MinimamOutputPacketLength,
          &sendCount) == HandlerResult::Handled) {
      this->mDirection485.set(Drivers::Direction::Transmit);
 
      HAL_UART_Transmit_DMA(huart, this->mTxBuffer, sendCount);
      retval = osSemaphoreWait(this->mSemSerialCommTxCompletedHandle, osWaitForever);
      HAL_UART_DMAStop(huart);
    }
 
    osDelay(1);
  }
}
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
01.10.2016, 16:03
Вообщем разобрался с UART в HAL, прерывания работают, правда есть отличии от SPL, по мне, так как до этого только на SPL писавшему, в худшею сторону, а вот кто сразу начал с HAL наверное так удобнее, но не мне судить.
ТС, мой совет, создайте новую тему, ибо в этой в вперемешку идут советы про HAL и SPL и много всего неверно сказано и от меня в том числе (каюсь). Тему назовите примерно так "Как в HAL сделать обмен данными с (компьютером, прибором итд) далее что и как хотите пересылать" Попробуем помочь.
P.S. Сам еще не во всех функциях разобрался, остановился когда смог поговорить с "железкой", а это половина судя по файлу На HAL_UART_IRQHandler встал.
Миниатюры
STM32F103C8T6 HAL UART  
2
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
01.10.2016, 20:55  [ТС]
Почитаю затащит еще раз, попробую заново написать обработчик(пока опять же, без прерывания). Огромное спасибо за помощь.
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
01.10.2016, 21:20
На скриншоте мой стенд.
if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == 1) если нажата кнопка, то отправляю 4 байта в порт и перевожу его в режим приёма.
status_UART6 - флаг прерывания. Взводиться в файле с право.
В майне крутиться его ожидание, как он пришел збрасываю его и буфер приёма копирую в буфер отправки, проверяю работу повторным нажатием кнопки, то что принял должен отправить.
Думаю поможет.
Миниатюры
STM32F103C8T6 HAL UART  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.10.2016, 21:20
Помогаю со студенческими работами здесь

UART, HAL, stm32
Здравствуйте, только недавно узнал о существовании библиотеки HAL. Решил попробовать отправлять по блютуз модулю данные. Получается что-то...

STM32 HAL UART прерывания
Здравствуйте. Пытаюсь осуществить контакт с устройством по UART. Логика такая: c STM32 по UART в режиме прерываний посылаю определенную...

HAL UART, прошу совет
Добрый вечер. Помогите новичку. Пытаюсь соединить два контроллера по uart (второй - авр). STM32f10* по прерыванию таймера раз в 1 секунду...

правильное использование HAL и UART
в структуре инициализации для UART (UART_HomdleTypeDef) есть такие поля uint8_t *pRxBuffPtr; /*!< Pointer...

stm32 HAL UART - не могу понять
Здравствуйте, в STM32 я начинающий, приходится просить помощи. Суть вот в чём. Надо принимать из последовательного порта строки. Строки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru