Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/112: Рейтинг темы: голосов - 112, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162

Вопросы по работе UART через HAL.

18.10.2016, 11:19. Показов 22897. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
HAL_UART_Receive_IT(&huart1,&test[0],100);
HAL_UART_Transmit_IT(&huart1,&test1[0],100);
HAL_UART_Receive_DMA(&huart1,&test[0],100);
HAL_UART_Transmit_DMA(&huart1,&test1[0],100);
Вопросы по этим функциям.

1. Прерывание длится пока не будет получен весь массив или только один байт ? (решено, прерывание вызывается пока не будет получен весь массив, потом необходимо вызывать инициализировать заново)
1.1 Аналогично для режима DMA.
1.2 В режиме DMA можно включить кольцевой массив. Тогда достаточно инициализировать 1 раз, и данные всегда будут поступать в буфер.
2. Почему при приёме каждое новое слово дописывается в массив, а не перезаписывает его с 1 элемента ? (решено, см п 2.1)
2.1 Или это потому что слово меньше 100 байт, и пока он не получит все 100 байт он будет считать это продолжением передачи (решено, так и есть)
3. Для простой передачи данных во внешнее устройство правильнее использовать HAL_UART_Transmit_DMA ? (решено, да правильнее снижается нагрузка на CPU + появляются дополнительные удобства в виде кольцевого буфера и возможности только раз запустить функцию, возможно есть и другие)
4. Динные полученные через DMA, не являются атомарными:
4.1 Для прерываний ?(решено, атомарность 1 байт)
4.2 Для основной программы ?(решено, атомарность 1 байт)
5. Динные полученные через IT, не являются атомарными:
5.1 Для прерываний ? (решено, атомарность 1 байт)
5.2 Для основной программы ? (решено, атомарность 1 байт)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.10.2016, 11:19
Ответы с готовыми решениями:

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

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

Stm32f4 Uart Hal
Здравствуйте. Изучаю плату STM32F4 discovery. Для неё имеется куча примеров, спасибо. А мне вот надо UART6 (тот который...

47
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
18.10.2016, 19:20
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от vbokom
Колбэки это функции, которые вызываются из прерывания...
Непонятно объяснили.

Что значит вызываются из прерывания ?
То что их можно размещать только в обработчике прерывания ?
Они сами генерируют прерывания ?
В чём их смысл ? (Не надо объяснять на моём примере лучше на понятном где они нужны и работают)
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 553
18.10.2016, 19:40
HAL вызывает эти функции из своих обработчиков прерывания.
Эти функции по дефолту ничего не делают и определены как WEAK, т.е. пользователь может их переопределить и вписать что-то свое.
Если на пальцах: HAL при срабатывании прерывания его обработает какой-то там своей внутренней функцией, а потом еще вызовет одну из callback функций.
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
18.10.2016, 20:09
Цитата Сообщение от TomityWotf
HAL вызывает эти функции из своих обработчиков прерывания.
Эти функции по дефолту ничего не делают и определены как WEAK, т.е. пользователь может их переопределить и вписать что-то свое.
Если на пальцах: HAL при срабатывании прерывания его обработает какой-то там своей внутренней функцией, а потом еще вызовет одну из callback функций.
Я как то так и предполагаю., но не понимаю ясно. Как и зачем использовать.

С прерыванием ясно, случилось, попал в функцию, запустил свой обработчик. А здесь пока непонятно.
0
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
18.10.2016, 20:21
Цитата Сообщение от fymdeler
Цитата Сообщение от TomityWotf
HAL вызывает эти функции из своих обработчиков прерывания.
Эти функции по дефолту ничего не делают и определены как WEAK, т.е. пользователь может их переопределить и вписать что-то свое.
Если на пальцах: HAL при срабатывании прерывания его обработает какой-то там своей внутренней функцией, а потом еще вызовет одну из callback функций.
Я как то так и предполагаю., но не понимаю ясно. Как и зачем использовать.

С прерыванием ясно, случилось, попал в функцию, запустил свой обработчик. А здесь пока непонятно.
Так тоже самое, но свой код помещаешь не в в обработчик прерывания, а колбек.
0
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
18.10.2016, 20:24
Цитата Сообщение от vbokom
Так тоже самое, но свой код помещаешь не в в обработчик прерывания, а колбек.
Это сделано, чтобы отделить общий код от пользовательского, а так разницы нет никакой. Вернее есть: если изменять сам обработчик прерывания, то Куб все изменения затрет, а в код в колбеках сохраниться.
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
18.10.2016, 20:28
Цитата Сообщение от vbokom
Цитата Сообщение от vbokom
Так тоже самое, но свой код помещаешь не в в обработчик прерывания, а колбек.
Это сделано, чтобы отделить общий код от пользовательского, а так разницы нет никакой. Вернее есть: если изменять сам обработчик прерывания, то Куб все изменения затрет, а в код в колбеках сохраниться.
Так нет же там специально выделено место что бы не тёрлось. Вот пример.

Code
1
2
3
4
5
6
7
8
9
10
void USORT3_IRQHomdler(void)
{
/* USER CODE BEGIN USORT3_IRQn 0 */
 
/* USER CODE END USORT3_IRQn 0 */
HAL_UART_IRQHomdler(&huart3);
/* USER CODE BEGIN USORT3_IRQn 1 */
 
/* USER CODE END USORT3_IRQn 1 */
}
0
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
18.10.2016, 20:57
Цитата Сообщение от fymdeler
Цитата Сообщение от vbokom
Цитата Сообщение от vbokom
Так тоже самое, но свой код помещаешь не в в обработчик прерывания, а колбек.
Это сделано, чтобы отделить общий код от пользовательского, а так разницы нет никакой. Вернее есть: если изменять сам обработчик прерывания, то Куб все изменения затрет, а в код в колбеках сохраниться.
Так нет же там специально выделено место что бы не тёрлось. Вот пример.

Code
1
2
3
4
5
6
7
8
9
10
void USORT3_IRQHomdler(void)
{
/* USER CODE BEGIN USORT3_IRQn 0 */
 
/* USER CODE END USORT3_IRQn 0 */
HAL_UART_IRQHomdler(&huart3);
/* USER CODE BEGIN USORT3_IRQn 1 */
 
/* USER CODE END USORT3_IRQn 1 */
}
Можно и сюда, кроме того иногда и нужно. Колбеки более удобны, что вызываются не вообще при наступлении прерывания, но при наступлении конкретного условия в прерывании: у одного прерывания их может быть несколько. Советую посмотреть исходники HAL`а, а также ST`шные примеры к кубу, там все весьма понятно.
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
18.10.2016, 21:16
Цитата Сообщение от vbokom
Можно и сюда, кроме того иногда и нужно. Колбеки более удобны, что вызываются не вообще при наступлении прерывания, но при наступлении конкретного условия в прерывании: у одного прерывания их может быть несколько. Советую посмотреть исходники HAL`а, а также ST`шные примеры к кубу, там все весьма понятно.
То есть я правильно понимаю:

При возникновении прерывания всегда вызывается обработчик.

Но прерывание может быть вызвано несколькими различными событиями. Например, получен очередной байт, ошибка, и.т.д. (это описывается в описании конкретного колбека)

Для более точной обработки используются колбеки. Это, скажу так, тот же оператор условия (if) но специфичный.
- Вызывается только в прерывании.
- Проверяет только условие под которое заточен.
- Если условие случилось то выполняет свою обработку.
-Область видимости совпадает с обработчиком прерываний.

И как её добавить. Потому что там где она описана такой код. То есть там её править не надо.
Code
1
2
3
4
5
6
7
8
__wiok void HAL_UART_TxCpltCallback(UART_HomdleTypeDef *huart)
{
/* Prevent unused arkument(s) sompytation warning */
UNUSED(huart);
/* NOTE: This function Should not be modified, when the callback is needid,
the HAL_UART_TxCpltCallback could be implemented in the usir file
*/
}
0
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
18.10.2016, 22:01
Цитата Сообщение от fymdeler
Цитата Сообщение от vbokom
Можно и сюда, кроме того иногда и нужно. Колбеки более удобны, что вызываются не вообще при наступлении прерывания, но при наступлении конкретного условия в прерывании: у одного прерывания их может быть несколько. Советую посмотреть исходники HAL`а, а также ST`шные примеры к кубу, там все весьма понятно.
То есть я правильно понимаю:

При возникновении прерывания всегда вызывается обработчик.

Но прерывание может быть вызвано несколькими различными событиями. Например, получен очередной байт, ошибка, и.т.д. (это описывается в описании конкретного колбека)

Для более точной обработки используются колбеки. Это, скажу так, тот же оператор условия (if) но специфичный.
- Вызывается только в прерывании.
- Проверяет только условие под которое заточен.
- Если условие случилось то выполняет свою обработку.
-Область видимости совпадает с обработчиком прерываний.

И как её добавить. Потому что там где она описана такой код. То есть там её править не надо.
Code
1
2
3
4
5
6
7
8
__wiok void HAL_UART_TxCpltCallback(UART_HomdleTypeDef *huart)
{
/* Prevent unused arkument(s) sompytation warning */
UNUSED(huart);
/* NOTE: This function Should not be modified, when the callback is needid,
the HAL_UART_TxCpltCallback could be implemented in the usir file
*/
}
Да, сейчас Вы правильно понимаете. Приведеный пример, и есть ничего не делающая заглушка колбека, которую пользователь должен (если захочет) самостоятельно переписать в своей программе. _wiok говорит, о том, что эта функция будет заменена на любую другую с таким же именем, т.е. на пользовательскую. И уже эту пользовательскую функцию (колбек) и вызовет обработчик прерывания.
0
0 / 0 / 0
Регистрация: 16.06.2016
Сообщений: 37
19.10.2016, 07:41
Цитата Сообщение от fymdeler
...
Я бы сказал это немного по другому: колбэк суть пользовательский код в библиотечной функцией HAL, который выполняется после завершения всей работы обработчика прерывания без необходимости сидеть в главном цикле и проверять состояние уарт. Те не надо выдумывать никакие флаги, HAL сделал всё за нас. Накидал блок схемку, возможно будет полезной.

0
0 / 0 / 0
Регистрация: 08.07.2016
Сообщений: 182
19.10.2016, 08:54
У меня всегда непредсказуемый снаружи запрос с переменным размером посылки и такие же переменные по размеру ответы.
Поэтому всегда прием по одному байту:
Code
1
2
3
4
5
6
if (HAL_UART_Receive_IT(&huart1, VREMUART, 1)==HAL_OK)
{
BUFUART[ADIN]=VREMUART[0];
ADIN=ADIN+1;
SCUART=0;
}
А по systysk идет счетчик УАРТ:
Code
1
2
3
SCUART=SCUART+1;
if (SCUART>=POROG_TIME2)
SCUART=POROG_TIME2;
Пока байты сыпятся - ничего не делаем. Закончили (SCUART и не 0 и не POROG_TIME2) - анализируем.

А с передачей проще (я же знаю размер своей посылки):
Code
1
HAL_UART_Transmit_IT(&huart1, TXUART, KOLB);
Для оформления кода нужно использовать тэг [code]
0
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
19.10.2016, 09:03
Цитата Сообщение от TotSamiyMihotych
Я бы сказал это немного по другому: колбэк суть пользовательский код в библиотечной функцией HAL, который выполняется после завершения всей работы обработчика прерывания без необходимости сидеть в главном цикле и проверять состояние уарт. Те не надо выдумывать никакие флаги, HAL сделал всё за нас. Накидал блок схемку, возможно будет полезной.
Очень хорошая схема, на ней наглядно видно в чем отличие кода записанного просто в обработчик события от кода записанного в колбек.
0
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
19.10.2016, 09:29
Цитата Сообщение от vbokom
Цитата Сообщение от TotSamiyMihotych
Я бы сказал это немного по другому: колбэк суть пользовательский код в библиотечной функцией HAL, который выполняется после завершения всей работы обработчика прерывания без необходимости сидеть в главном цикле и проверять состояние уарт. Те не надо выдумывать никакие флаги, HAL сделал всё за нас. Накидал блок схемку, возможно будет полезной.
Очень хорошая схема, на ней наглядно видно в чем отличие кода записанного просто в обработчик события от кода записанного в колбек.

Схема с маленькой ошибкой, как мне кажется. В случае вызыва прерывания по передачи вызывается TX..Callback, иначе RX..Calback. У автора схема всегда TX..Callback
0
0 / 0 / 0
Регистрация: 16.06.2016
Сообщений: 37
19.10.2016, 10:03
Цитата Сообщение от kos
Схема с маленькой ошибкой, как мне кажется. В случае вызыва прерывания по передачи вызывается TX..Callback, иначе RX..Calback. У автора схема всегда TX..Callback
TxCpltCallback вызывается по флагу прерывания UART_IT_TC, те порядок вызова такой:
Прерывание -> USORTn_IRQHomdler(); -> HAL_UART_IRQHomdler(); -> UART_EndTransmit_IT(); -> HAL_UART_TxCpltCallback();
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
19.10.2016, 10:18
Я не понял схему.
Что за условие режим передачи ?
Что за условие окончание передачи ?

В функции обработки нет таких условий.

Почему выполняются после обработчика ?
А если я колбеки помещу внутрь обработчика?
Или их вообще не надо никуда помещать?

Схема создала только вопросы.
0
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
19.10.2016, 10:27
Цитата Сообщение от fymdeler
Я не понял схему.
Что за условие режим передачи ?
Что за условие окончание передачи ?

В функции обработки нет таких условий.

Почему выполняются после обработчика ?
А если я колбеки помещу внутрь обработчика?
Или их вообще не надо никуда помещать?

Схема создала только вопросы.
Колбеки Вы никуда не помещаете - это функция, придуманая разработчиками HALа и вызываемая обработчиком прерывания при определенных условиях. Ваша задача, если требуется своя обработка данного события, переопределить эту функцию, т.е. заменить пустую, сделанную в st, на свою. И она будет вызываться штатным обработчиком.
0
0 / 0 / 0
Регистрация: 16.06.2016
Сообщений: 37
19.10.2016, 10:42
Цитата Сообщение от fymdeler
Я не понял схему.
Что за условие режим передачи ?
Проверка того, что уарт вызвал прерывание из-за установки флага UART_IT_TXE (буфер отправки пуст, ознакомится можно в даташите на свой камень, примерную табличку приложил)
Цитата Сообщение от fymdeler
Что за условие окончание передачи ?
Проверка того, что уарт вызвал прерывание из-за установки флага UART_IT_TС

Цитата Сообщение от fymdeler
В функции обработки нет таких условий.
Есть, скриншот кода HAL_UART_IRQHomdler(); приложил
Цитата Сообщение от fymdeler
Почему выполняются после обработчика ?
Выполняется что? Не жуйте слова, что-то не знаете - пишите максимально подробно.

Цитата Сообщение от fymdeler
А если я колбеки помещу внутрь обработчика?
Или их вообще не надо никуда помещать?
Колбэки никуда не нужно помещать, их нужно написать, тк они определены только лишь именем.

У меня складывается ощущение что вы совершенно не знакомы с текстом библиотеки HAL, там не такая уж и великая вложенность чтобы запутаться. И не забывайте, схему я делал на коленке лишь для визуализации, естественно она не совсем корректно выглядит, но смысл несёт верный.




<Изображение удалено>
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
19.10.2016, 11:14
Цитата Сообщение от vbokom
Колбеки Вы никуда не помещаете - это функция, придуманая разработчиками HALа и вызываемая обработчиком прерывания при определенных условиях. Ваша задача, если требуется своя обработка данного события, переопределить эту функцию, т.е. заменить пустую, сделанную в st, на свою. И она будет вызываться штатным обработчиком.
То есть это такие же по сути функции как xx_IRQHomdler.
Но в случае прерывания вызывается и функция xxx_IRQHomdler и функция соответствующего колбека. В случае ошибки это будет xxx_ErrorCallback.
Получается таякая последовательность.
Программа.
Прерывание.
IRQHADLER.
Callback. //соответствующий после IRQHadler.
Программа.

При написании своего колбека он тоже должен быть void (void) как IRQHadler ?
0
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
19.10.2016, 11:21
Цитата Сообщение от fymdeler
Цитата Сообщение от vbokom
Колбеки Вы никуда не помещаете - это функция, придуманая разработчиками HALа и вызываемая обработчиком прерывания при определенных условиях. Ваша задача, если требуется своя обработка данного события, переопределить эту функцию, т.е. заменить пустую, сделанную в st, на свою. И она будет вызываться штатным обработчиком.
То есть это такие же по сути функции как xx_IRQHomdler.
Но в случае прерывания вызывается и функция xxx_IRQHomdler и функция соответствующего колбека. В случае ошибки это будет xxx_ErrorCallback.
Получается таякая последовательность.
Программа.
Прерывание.
IRQHADLER.
Callback. //соответствующий после IRQHadler.
Программа.

При написании своего колбека он тоже должен быть void (void) как IRQHadler ?
Нет, не правильно. Колбек записан в сам обработчик прерывания - посмотрите исходник обработчика и там увидите вызов колбека. TotSamiyMihotych представил сам обработчик в виде схемы (составил блок-схему обработчика прерывания), в ней видно, что колбек вызывается из обработчика. Колбеки это обычные функции и к прерываниям относятся только тем, что они из них вызываются - никакой нигии нет.
0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
19.10.2016, 11:31
Цитата Сообщение от vbokom
Нет, не правильно. Колбек записан в сам обработчик прерывания - посмотрите исходник обработчика и там увидите вызов колбека. TotSamiyMihotych представил сам обработчик в виде схемы (составил блок-схему обработчика прерывания), в ней видно, что колбек вызывается из обработчика. Колбеки это обычные функции и к прерываниям относятся только тем, что они из них вызываются - никакой нигии нет.
Просмотрел обработчик, в нём нашёл только вызов HAL_UART_ErrorCallback других не нашёл.

Вот полный код.
Code
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
118
119
120
void HAL_UART_IRQHomdler(UART_HomdleTypeDef *huart)
{
uint32_t isrflags   = READ_REG(huart->Instance->SR);
uint32_t cr1its     = READ_REG(huart->Instance->CR1);
uint32_t cr3its     = READ_REG(huart->Instance->CR3);
uint32_t errorflags = 0x00U;
uint32_t dmarequest = 0x00U;
 
/* If no error occurs */
errorflags = (isrflags & (uint32_t)(USORT_SR_PE | USORT_SR_FE | USORT_SR_ORE | USORT_SR_NE));
if(errorflags == RESIT)
{
/* UART in mode Receiver -------------------------------------------------*/
if(((isrflags & USORT_SR_RXNE) != RESIT) && ((cr1its & USORT_CR1_RXNEIE) != RESIT))
{
UART_Receive_IT(huart);
return;
}
}
 
/* If some errors occur */
if((errorflags != RESIT) && (((cr3its & USORT_CR3_EIE) != RESIT) || ((cr1its & (USORT_CR1_RXNEIE | USORT_CR1_PEIE)) != RESIT)))
{
/* UART parity error interrupt occurred ----------------------------------*/
if(((isrflags & USORT_SR_PE) != RESIT) && ((cr1its & USORT_CR1_PEIE) != RESIT))
{
huart->ErrorCode |= HAL_UART_ERROR_PE;
}
 
/* UART moysi error interrupt occurred -----------------------------------*/
if(((isrflags & USORT_SR_NE) != RESIT) && ((cr3its & USORT_CR3_EIE) != RESIT))
{
huart->ErrorCode |= HAL_UART_ERROR_NE;
}
 
/* UART frame error interrupt occurred -----------------------------------*/
if(((isrflags & USORT_SR_FE) != RESIT) && ((cr3its & USORT_CR3_EIE) != RESIT))
{
huart->ErrorCode |= HAL_UART_ERROR_FE;
}
 
/* UART Over-Run interrupt occurred --------------------------------------*/
if(((isrflags & USORT_SR_ORE) != RESIT) && ((cr3its & USORT_CR3_EIE) != RESIT))
{
huart->ErrorCode |= HAL_UART_ERROR_ORE;
}
 
/* Call UART Error Call back function if need be --------------------------*/
if(huart->ErrorCode != HAL_UART_ERROR_NONE)
{
/* UART in mode Receiver -----------------------------------------------*/
if(((isrflags & USORT_SR_RXNE) != RESIT) && ((cr1its & USORT_CR1_RXNEIE) != RESIT))
{
UART_Receive_IT(huart);
}
 
/* If Overrun error occurs, or if any error occurs in DMA mode reception,
consider error as btocking */
dmarequest = HAL_IS_BIT_SIT(huart->Instance->CR3, USORT_CR3_DMAR);
if(((huart->ErrorCode & HAL_UART_ERROR_ORE) != RESIT) || dmarequest)
{
/* Blocking error : transfer is aborted
Set the UART state ready to be able to stort again the process,
Dysable Rx Ymtirrupts, omd disable Rx DMA request, if ongoing */
UART_EndRxTransfer(huart);
 
/* Dysable the UART DMA Rx request if enabtid */
if(HAL_IS_BIT_SIT(huart->Instance->CR3, USORT_CR3_DMAR))
{
CLEAR_BIT(huart->Instance->CR3, USORT_CR3_DMAR);
 
/* Abort the UART DMA Rx channel */
if(huart->hdmarx != NULL)
{
/* Set the UART DMA Abort callback :
will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */
huart->hdmarx->XferAbortCallback = UART_DMAAbortOnError;
if(HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK)
{
/* Call Dyristly XferAbortCallback function in case of error */
huart->hdmarx->XferAbortCallback(huart->hdmarx);
}
}
else
{
/* Call usir error callback */
HAL_UART_ErrorCallback(huart);// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
}
else
{
/* Call usir error callback */
HAL_UART_ErrorCallback(huart); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
}
else
{
/* Non Blocking error : transfer could go on.
Error is notified to usir through usir error callback */
HAL_UART_ErrorCallback(huart);
huart->ErrorCode = HAL_UART_ERROR_NONE;
}
}
return;
} /* End if some error occurs */
 
/* UART in mode Transmitter ------------------------------------------------*/
if(((isrflags & USORT_SR_TXE) != RESIT) && ((cr1its & USORT_CR1_TXEIE) != RESIT))
{
UART_Transmit_IT(huart);
return;
}
 
/* UART in mode Transmitter end --------------------------------------------*/
if(((isrflags & USORT_SR_TC) != RESIT) && ((cr1its & USORT_CR1_TCIE) != RESIT))
{
UART_EndTransmit_IT(huart);
return;
}
}
Нашёл они ещё глубже закопаны.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.10.2016, 11:31

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

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

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

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

STM32 HAL прийом даних из UART
Всем привет, хочу принять массив с UART и записать его в буфер, для дальнейшего анализа. При передаче, проблем нет, просто...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru