Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 54
1

Не получается с HAL_UART_Transmit_DMA на stm32f103

27.06.2020, 12:49. Просмотров 1062. Ответов 13

Здравствуйте, возникла проблема с передачей данных с помощью UART с контроллера stm32f103c8t6.

C
1
2
3
4
5
6
7
8
9
10
11
char str[6];
uint16_t i=0;
 
while (1)
  {
    HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_6);
    i++;
    sprintf(str,"%d",i);
    HAL_UART_Transmit_DMA(&huart2,(uint8_t *) str, sizeof(str)-1);
    HAL_Delay(250);
  }
Все, в коде больше ничего нет кроме халовских инициализаций.
По идее он должен передавать циклично увеличение значения i.
Такой же способ но посложнее делал на f407 там с ацп снимались данные преобразовывались и отправлялись,и все работало.
А тут он передает только при первом цикле значение а потом останавливается, специально для этого поставил светодиод на пин PA6 чтоб видеть как цикл работает, светодиод моргает, а значение не идут, только когда reset нажимаю он отправляет одно значение и все.

Что не так?
0
Миниатюры
Не получается с HAL_UART_Transmit_DMA на stm32f103  
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2020, 12:49
Ответы с готовыми решениями:

HAL_UART_Transmit_DMA возвращает HAL_BUSY
Здравствуйте! Разбираюсь с передачей UART+DMA и наткнулся на следующую проблему: После запуска...

STM32F103 + XPT2046
Буду признателен если поделитесь рабочей библиотекой для touch на контроллере XPT2046 Отладочная...

STM32F103 и CAN HAL
Здравствуйте уважаемые форумчане! Уже неделю бьюсь над проблемой CAN`а в МК STM32F103C8T6....

USB на STM32F103
Всем привет :) Наконец-то решил разобраться с USB на контроллере ST32F103VCT6. Взял пример Virtual...

13
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
27.06.2020, 13:24 2
Цитата Сообщение от Rustam98 Посмотреть сообщение
HAL_UART_Transmit_DMA
A DMA то где?
0
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 54
27.06.2020, 13:32  [ТС] 3
Не понял что вы имеете ввиду.
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
27.06.2020, 13:47 4
Rustam98, где настройки DMA?
0
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 54
27.06.2020, 13:58  [ТС] 5
Вам это необходимо?
В самом коде куб отинициализировал и UART и DMA
0
Миниатюры
Не получается с HAL_UART_Transmit_DMA на stm32f103  
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
27.06.2020, 14:41 6
Цитата Сообщение от Rustam98 Посмотреть сообщение
Вам это необходимо?
конечно
и не картинки с куба а код инициализации
пока вижу только режим Normal а не Circular
отработал одну посылку и заткнулся
0
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 54
27.06.2020, 16:25  [ТС] 7
Ну так он вызывается в бесконечном цикле, и поэтому отображает посылки с частотой камня. если уже Circular делать то наверное так:

C
1
2
3
4
5
6
7
    HAL_UART_Transmit_DMA(&huart2,(uint8_t *) str, sizeof(str)-1);
 while (1)
{
        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_6);
    i++;
    sprintf(str,"%d",i);
}
Но в таком случае я не могу принять информацию на ПК через Терминал, он у меня тупо зависает.
Но так как мне надо завести на другой контроллер то это тоже подойдет, но все-таки мне еще кучу преобразований надо сделать и отследить работу их я так не смогу.

Вот код инициализаций:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void MX_USART2_UART_Init(void)
{
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }
}
 
static void MX_DMA_Init(void) 
{
  __HAL_RCC_DMA1_CLK_ENABLE();
  HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);
}
Это то что внутри:
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
#define __HAL_RCC_DMA1_CLK_ENABLE()   do { \
                                        __IO uint32_t tmpreg; \
                                        SET_BIT(RCC->AHBENR, RCC_AHBENR_DMA1EN);\
                                        /* Delay after an RCC peripheral clock enabling */\
                                        tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_DMA1EN);\
                                        UNUSED(tmpreg); \
                                      } while(0U)
 
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
{ 
  uint32_t prioritygroup = 0x00U;
  
  /* Check the parameters */
  assert_param(IS_NVIC_SUB_PRIORITY(SubPriority));
  assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority));
  
  prioritygroup = NVIC_GetPriorityGrouping();
  
  NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority));
}
 
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
{
  /* Check the parameters */
  assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
 
  /* Enable interrupt */
  NVIC_EnableIRQ(IRQn);
}
 
DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt                      */
И в общем спасибо что пытаетесь помочь)

Добавлено через 1 час 13 минут
Я тут подумал что в принципе можно и через Circular, а настройку алгоритма буду делать через обычный HAL_UART_Transmit с задержкой. Так как я так и не понял почему в бесконечном цикле оно не работает.
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
27.06.2020, 19:15 8
Цитата Сообщение от Rustam98 Посмотреть сообщение
Ну так он вызывается в бесконечном цикле,
тогда зачем тебе DMA?
при твоем алгоритме нужно запустить посылку с DMA
подождать пока отработает
остановить DMA
а смысл?
просто посылай в цикле и все

Добавлено через 3 минуты
Цитата Сообщение от Rustam98 Посмотреть сообщение
HAL_UART_Transmit_DMA(&huart2,(uint8_t *) str, sizeof(str)-1);
Цитата Сообщение от Rustam98 Посмотреть сообщение
sprintf(str,"%d",i);
вот здесь при i=1(2,3,4....) будет посылаться "1" "\0" и 4 байта мусора
делай вот так

C
1
HAL_UART_Transmit(&huart2,(uint8_t *) str, strlen(str));
0
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 54
28.06.2020, 01:19  [ТС] 9
Та я уже так попробовал. У меня один f103 управляет tft по spi, сам алгоритм отображения символов цветов и тд очень большей и поэтому я решил разделить это между двумя f103, но когда я отправлял значения с f407 на f103 по DMA он оч хорошо работал, а с f103 которая без DMA отправляет на экране видно как будто данные формируются, вообщем это трудно описать.
Попробую еще, может что-то смогу сделать. Но или уже на CMSIS попробую написать, чего я не очень хочу делать, один проект разделять на разные библиотеки.
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
28.06.2020, 08:10 10
Цитата Сообщение от Rustam98 Посмотреть сообщение
а с f103 которая без DMA отправляет на экране видно как будто данные формируются,
создай теневой буфер

Добавлено через 3 минуты
Цитата Сообщение от Rustam98 Посмотреть сообщение
вообщем это трудно описать.
уж попытайся
пока судя по твоему описанию, DMA тебя не спасет, подготовка к передаче будет больше идти
0
2 / 1 / 1
Регистрация: 07.04.2015
Сообщений: 11
28.06.2020, 13:20 11
Лучший ответ Сообщение было отмечено Rustam98 как решение

Решение

Для передачи USART DMA необходимо включить прерывания.
При первой передачи устанавливается статус Busy TX и не сбрасывается.
При последующей передаче ничего передаваться не будет так как канал занят.
Не буду детально расписывать, покопайся в этом направлении.
1
Миниатюры
Не получается с HAL_UART_Transmit_DMA на stm32f103  
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 54
28.06.2020, 15:57  [ТС] 12
Большое спасибо вам, в итоге просто добавил сброс статуса после отправки с дма.

C
1
2
HAL_UART_Transmit_DMA(&huart2,(uint8_t *) str, sizeof(str)-1);
huart2.gState = HAL_UART_STATE_READY;
Не знаю правильно ли так делать, но значения на втором f103 который с tft отображаются как родные).
0
2 / 1 / 1
Регистрация: 07.04.2015
Сообщений: 11
28.06.2020, 20:23 13
Самому сбрасывать статус не верно.
Поставь галочку на USART Global interrupt и все.
0
0 / 0 / 0
Регистрация: 24.10.2019
Сообщений: 54
28.06.2020, 20:41  [ТС] 14
Я так пробовал изначально, не работало.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.06.2020, 20:41

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

USART1 и stm32f103
Нужно по USORT1 получить отклик от нажатия PE6, но я не могу понять почему не получается, помогите...

мистика stm32f103
купил мк stm32f103 распаял его на плате, подвел питания,землю, risit подвесил на VDD через резюк,...

STM32F103 и NRF24L01+
Доброго времени суток, коллеги. Назрел вопрос, т.к. уже пару недель не могу разобраться в сути...

STM32F103 + FatFS
Доброго времени суток! Макет диктофона, SD-Card. Дискретизация 6.250кГц. Буфер 512, через DMA. В...

UART и STM32F103
Здравствуйте, уважаемые! Начал тут заниматься STM32, перейдя на него с AtMega. Возник вопрос - как...

stm32f103 + ILI9325D
помогите мне пожалуйста. Я впервые работаю с дисплеем и возможно делаю какие-то очевидные ошибки...


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

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

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