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

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

18.10.2016, 11:19. Просмотров 12107. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2016, 11:19
Ответы с готовыми решениями:

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

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

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

правильное использование HAL и UART
в структуре инициализации для UART (UART_HomdleTypeDef) есть такие поля uint8_t ...

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

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

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

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

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

Код
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
vbokom
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
18.10.2016, 20:57 27
Цитата Сообщение от fymdeler
Цитата Сообщение от vbokom
Цитата Сообщение от vbokom
Так тоже самое, но свой код помещаешь не в в обработчик прерывания, а колбек.
Это сделано, чтобы отделить общий код от пользовательского, а так разницы нет никакой. Вернее есть: если изменять сам обработчик прерывания, то Куб все изменения затрет, а в код в колбеках сохраниться.
Так нет же там специально выделено место что бы не тёрлось. Вот пример.

Код
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
fymditir
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
18.10.2016, 21:16 28
Цитата Сообщение от vbokom
Можно и сюда, кроме того иногда и нужно. Колбеки более удобны, что вызываются не вообще при наступлении прерывания, но при наступлении конкретного условия в прерывании: у одного прерывания их может быть несколько. Советую посмотреть исходники HAL`а, а также ST`шные примеры к кубу, там все весьма понятно.
То есть я правильно понимаю:

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

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

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

И как её добавить. Потому что там где она описана такой код. То есть там её править не надо.
Код
__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
vbokom
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
18.10.2016, 22:01 29
Цитата Сообщение от fymdeler
Цитата Сообщение от vbokom
Можно и сюда, кроме того иногда и нужно. Колбеки более удобны, что вызываются не вообще при наступлении прерывания, но при наступлении конкретного условия в прерывании: у одного прерывания их может быть несколько. Советую посмотреть исходники HAL`а, а также ST`шные примеры к кубу, там все весьма понятно.
То есть я правильно понимаю:

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

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

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

И как её добавить. Потому что там где она описана такой код. То есть там её править не надо.
Код
__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
TotSomyyMyhotysh
0 / 0 / 0
Регистрация: 16.06.2016
Сообщений: 37
19.10.2016, 07:41 30
Цитата Сообщение от fymdeler
...
Я бы сказал это немного по другому: колбэк суть пользовательский код в библиотечной функцией HAL, который выполняется после завершения всей работы обработчика прерывания без необходимости сидеть в главном цикле и проверять состояние уарт. Те не надо выдумывать никакие флаги, HAL сделал всё за нас. Накидал блок схемку, возможно будет полезной.

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

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

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

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

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

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

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

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

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

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

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

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




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

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

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

Вот полный код.
Код
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
19.10.2016, 11:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.10.2016, 11:31

Тонкости UART+DMA+HAL... Кто-нибуть разбирался подробно?
Собственно все работает почти нормально.. Удивляет логика работы. Вот и хочется понять это я...

LTDC HAL, вопросы по использованию
Подключаю дисплей, выбор хала обусловлен тем, что мне скоро переходить на F7 и надо бы привыкать,...

О работе с мануалом HAL
Здравствуйте! Изучаю STM32F4Dyscovery c HAL, но иногда имею сложности с документацией на функции....


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru