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

Как переконфигурировать пин на лету из уарт в output и обратно?

14.07.2020, 22:08. Просмотров 1134. Ответов 12
Метки нет (Все метки)

Исходные данные: STM L053R8
библиотеки 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
char start_posilka_abs = 0x81;//начало посылки для абс?
char abs_addr = 0x28; //скорость с abs примерно 10242
char diag_addr = 0xF0;
char _addr = 0x1A;
GPIO_InitTypeDef GPIO_InitStruct={0}; //для переконфигурирования пинов ниже
 
      /*Configure GPIO pins : PA9 */
      GPIO_InitStruct.Pin = GPIO_PIN_9;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
      HAL_Delay (100);
 
 
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_RESET);
HAL_Delay (582);// это будет 582 задержка
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_SET);
HAL_Delay (158);// это будет 158 задержка
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_RESET);
HAL_Delay (24); // это будет 24 задержка очень чувствительно. ставлю 25 перестает работать.
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_SET);
HAL_Delay (14);// это будет 24 задержка
 
 
// ниже конфигурирую пин PA9 опять как уарт
//HAL_UART_MspInit(&huart1);
HAL_Delay (10);
 
GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
//теперь можно начать отправлять первый пакет
timer=0;
 
//HAL_UART_Abort_IT (&huart1);//запрет прерываний по приему.
 
//для абс
HAL_UART_Transmit(&huart1, &start_posilka_abs, 1, 30);  //начало посылки
HAL_UART_Transmit(&huart1, &abs_addr, 1, 30); //направление к блоку АБС (0x28)
HAL_UART_Transmit(&huart1, &diag_addr, 1, 30); // от кого (0xF0) от диагностического оборудования, от нас.
HAL_UART_Transmit(&huart1, &start_posilka_abs, 1, 30);
HAL_UART_Transmit(&huart1, &_addr, 1, 30);
 
 
HAL_UART_Receive_IT(&huart1, (uint8_t*)buffers_first, 7);//запускает прием по уарту как токо придут все байты будут приняты сработает прерывание каллбэк
HAL_Delay (1000);
 
}
В итоге вроде я все переконфигурировал, пин сначала дергает ногой потом шлет по уарту.
Но перестают работать прерывания по приему. Не прыгает в каллбэк по RX.
Если убираю конфигурацию пинов, и оставляю как сконфигурировал CubeMX под уарт. То отправляются сообщения и реагирует на прием. Прыгает на каллбэк.
Этот код крутиться в цикле.
Где я накосячил? Как узнать в чем ошибка? Просто дебагом смысла бегать нет если прерывания не работают ) Ну я вообщем дилетант.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.07.2020, 22:08
Ответы с готовыми решениями:

16 пин разъем питания на материнке Fujitsu D2990-A Можно ли как-то запитать от БП с 20(24) пин?
Собственно в названии темы сам вопрос и есть. Достался мне тут системный блок, но нужно поменять...

Можно ли воспользоваться 8 пин разъемом БП, как 6 пин того же БП ?
Здравствуйте. Скажите такое. Можно ли использовать 8-ми пиновые разъемы БП Seasonic Prime...

как сделать в MS VS 2010 express output не в консоль в output windows
сабж заранее спасибо

Плохо ли для ryzen 5 3400g, на материнке с 8 пин разъемом, только на 4 пин вставленным
Хорошо посмотрю, отпишу. Если вдруг вам не сложно ответить, по другой теме- плохо ли для ryzen 5...

12
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
14.07.2020, 23:45 2
Цитата Сообщение от Zombie47 Посмотреть сообщение
Как переконфигурировать пин на лету из уарт в output и обратно?
наплевать на HAL и работать чисто с регистрами
вот например мой код для STM32F103
переконфигурируются ножки PB8 PB9 из I2c в GPIO и обратно
C
1
2
3
4
5
6
7
GPIOB->CRH ^=(0x70 | 0xC); // настраиваю порты: 8 - выход(SCL) ОК, 9 - вход(SDA)
.........................
 GPIOB->CRH ^=(0x0B0); // PB9 ОК
.....................................
 
 
    GPIOB->CRH |=0xFF; // возвращаю настройки порта (аппаратный I2C)
0
31 / 20 / 12
Регистрация: 23.01.2019
Сообщений: 59
15.07.2020, 01:32 3
А абонент, который вас по UART слушает, на это "левое" дрыганье ноги нормально реагирует?
Может быть он виснет и ничего не отвечает и поэтому вы не получаете прерывания.
0
2 / 2 / 0
Регистрация: 14.05.2012
Сообщений: 56
15.07.2020, 03:32  [ТС] 4
А абонент, который вас по UART слушает, на это "левое" дрыганье ноги нормально реагирует?
Может быть он виснет и ничего не отвечает и поэтому вы не получаете прерывания.
Я анализатором смотрю, с ответом все хорошо ответ идет.

Добавлено через 1 минуту
наплевать на HAL и работать чисто с регистрами
вроде говорят так не оч хорошо делать половину HAL половину самому регистры трогать.
0
Модератор
8195 / 6067 / 809
Регистрация: 14.02.2011
Сообщений: 21,034
15.07.2020, 09:16 5
Цитата Сообщение от Zombie47 Посмотреть сообщение
вроде говорят так не оч хорошо делать половину HAL половину самому регистры трогать.
кто говорит? ну и пусть говорят( могу еще кучу эпитетов насыпать)
HAL создан для удобства разработки и для портирования написал для 1хх а пользуешься на 7хх
но для быстродействия нужно лезть в регистры
но не абы как, а с "чувством с толком с расстановкой"
выносишь все низкоуровневые функции в отдельный файл\файлы и обзываешь как нибудь MyHard.c
тогда в случае портирования просто подменяешь файл на другую реализацию
0
31 / 20 / 12
Регистрация: 23.01.2019
Сообщений: 59
15.07.2020, 13:12 6
Я анализатором смотрю, с ответом все хорошо ответ идет.
Вообще странно. Ответ ведь должен идти на вывод RX, который ты не трогаешь. Ты не забыл проинициализировать под UART вывод PA10?
0
2 / 2 / 0
Регистрация: 14.05.2012
Сообщений: 56
16.07.2020, 03:50  [ТС] 7
Вообще странно. Ответ ведь должен идти на вывод RX, который ты не трогаешь. Ты не забыл проинициализировать под UART вывод PA10?
если для вас странно то для меня вообще темный лес. Я очень в общих чертах знаю про микроконтроллеры регистры и тд. А тут для меня сложновато налету перенастроить ногу. тем более попытался это сделать и такая фигня.
Если отрубаю код с 7 по 13 строку и с 30 по 35 который тут отвечает за перенастройку ноги то все норм работает на прием срабатывают прерывания. Но естественно перестает дергать ногой.
0
3 / 1 / 2
Регистрация: 02.06.2020
Сообщений: 6
16.07.2020, 13:16 8
Доброго дня! Вот точно работающий вариант, правда для STM32F10x:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
GPIO_InitTypeDef GPIO_InitStruct = {0};
 
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9);
 
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
// Use pin as GPIO
    
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9);
    
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
// Use pin as UART Tx
Проблем с приемом не возникает. Работа с UART'ом, в целом, аналогично как у Вас.
0
2 / 2 / 0
Регистрация: 14.05.2012
Сообщений: 56
18.07.2020, 22:48  [ТС] 9
А где у вас вот эта строчка? GPIO_InitStruct.Alternate = GPIO_AF4_USART1;

Добавлено через 11 минут
Вставил ваш код уарт вообще не работает. добавил эту строчку уарт заработал как раньше. на прием не реагирует.
Я еще думаю как быстро он вообще должен реагировать?
Спрашиваю потому что вот в чем дело:
у меня драйвер имеет эхо. и все что я отправляю по уарту, у меня дублируется на ногу RX моего МК.
Вообщем вот отрубил дерганье ногой и переконфигурацию пина.
Прога выполняется покругу:
отправка 5 байт
C
1
2
3
4
5
HAL_UART_Transmit(&huart1, &start_posilka_abs, 1, 30);  //начало посылки
HAL_UART_Transmit(&huart1, &abs_addr, 1, 30); //направление к блоку АБС (0x28)
HAL_UART_Transmit(&huart1, &diag_addr, 1, 30); // от кого (0xF0) от диагностического оборудования, от нас.
HAL_UART_Transmit(&huart1, &start_posilka_abs, 1, 30);
HAL_UART_Transmit(&huart1, &_addr, 1, 30);
и запуск функции приема по прерываниям СЕМИ байт:
C
1
2
HAL_UART_Receive_IT(&huart1, (uint8_t*)buffers_first, 7);//запускает прием по уарту как токо придут все байты будут приняты сработает прерывание каллбэк
HAL_Delay (1000);
Вообщем анализатором вот что вижу:
первый прогон отправлено 5 байт
второй прогон отправлено 5 байт
третий прогон отправлено 5 байт
четвертый прогон отправлено 2 байта и сработало прерывание на прием. вызвался каллбэк:
C
1
2
3
4
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//каллбэк вызывается прерывание после приема по уарт
{
          if(huart == &huart1)
          {
То-есть по какой-то причине первые три цикла выполнения программы ему было пофигу, или тупил. я не пойму.
А потом прогнало третий раз 5 байт и четвертый раз 2 байта, итого СЕМЬ байт и сработало прерывание.
0
3 / 1 / 2
Регистрация: 02.06.2020
Сообщений: 6
19.07.2020, 00:11 10
У меня для F1, а эта строка для F4:
C
1
GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
0
2 / 2 / 0
Регистрация: 14.05.2012
Сообщений: 56
19.07.2020, 00:13  [ТС] 11
так и где она у вас эта строка?
0
31 / 20 / 12
Регистрация: 23.01.2019
Сообщений: 59
19.07.2020, 03:59 12
Цитата Сообщение от Zombie47 Посмотреть сообщение
Прога выполняется покругу:
отправка 5 байт
Я так понимаю ты в каждом прохождении цикла отравляешь 5 байт и сразу вызываешь HAL_UART_Receive_IT на получение 7 байтов.
При первом прохождении колбэк не сработает потому, что обратно прилетит только 5 байтов.
А дальше уже как повезет.
Каждый вызов HAL_UART_Receive_IT обнуляет счетчик.
Предположим у тебя в буфере приема 5 байт от предыдущего цикла. Ты отсылаешь очередные 5 байт. Если до вызова HAL_UART_Receive_IT, хотя бы 2 байта успеют вернуться, то колбэк сработает, если нет, то счетчик обнулиться и колбэка не будет.
0
3 / 1 / 2
Регистрация: 02.06.2020
Сообщений: 6
19.07.2020, 11:57 13
Лучший ответ Сообщение было отмечено Zombie47 как решение

Решение

Цитата Сообщение от Zombie47
так и где она у вас эта строка?
У меня код для контроллера F1, поэтому этой строки нет.
Если использовать контроллер F4, то добавляется эта строка.

Цитата Сообщение от yatrim
Я так понимаю ты в каждом прохождении цикла отравляешь 5 байт и сразу вызываешь HAL_UART_Receive_IT на получение 7 байтов.
При первом прохождении колбэк не сработает потому, что обратно прилетит только 5 байтов.
А дальше уже как повезет.
Каждый вызов HAL_UART_Receive_IT обнуляет счетчик.
Предположим у тебя в буфере приема 5 байт от предыдущего цикла. Ты отсылаешь очередные 5 байт. Если до вызова HAL_UART_Receive_IT, хотя бы 2 байта успеют вернуться, то колбэк сработает, если нет, то счетчик обнулиться и колбэка не будет.
Я так понял, что 7 байт должно выслать то устройство, которое принимает 5 байт запроса.

Добавлено через 25 минут
Если цель - принять отправленные данные, то тогда да, проблема именно в том, что описал yatrim. Логика работы этих функций такая:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
HAL_UART_Receive_IT(&huart1, (uint8_t*)buffers_first, 7); // Старт приема 7-ми байт
 
// Отправка 7-ми байт
HAL_UART_Transmit(&huart1, &start_posilka_abs, 1, 30);
HAL_UART_Transmit(&huart1, &abs_addr, 1, 30);
HAL_UART_Transmit(&huart1, &diag_addr, 1, 30);
HAL_UART_Transmit(&huart1, &start_posilka_abs, 1, 30);
HAL_UART_Transmit(&huart1, &_addr, 1, 30);
 
// Для того, чтобы принять 7 байт, отправить нужно также 7, поэтому добавлены 2 байта, для примера
HAL_UART_Transmit(&huart1, &_addr, 1, 30);
HAL_UART_Transmit(&huart1, &_addr, 1, 30);
 
// Вот на этом этапе сработает callback
В данном случае отправляются 5 байт, поэтому callback не срабатывает. А срабатывает он в том случае, если два из 5-ти отправленных байт принимаются после вызова HAL_UART_Receive_IT(&huart1, (uint8_t*)buffers_first, 7);. Затем на следующем цикле к этим 2-ум добавляются еще 5 новых отправленных, в итоге получаем 7 - срабатывает callback.

Резюмируя, callback срабатывает в том случае, когда между(!) вызовами HAL_UART_Receive_IT() были приняты 7 байт.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.07.2020, 11:57

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

4 или 6 пин,вместо 8 пин-это возможно?
Материна требует 8 пин питание к цп,у меня на бп есть 2 6 пин,1 4 пин и 1 6 пин через...

Можно ли вставить 4 пин джек в 3 пин?
Вопрос, конечно, довольно банальный, но нужно знать точно. Мне кажется, что можно, конечно микрофон...

Особенности подключений БП 20 и 24 пин к материнкам 24 пин
Есть мать asus P8H77V. Разъём 24 пин и 8 пин возле процессора. есть БП 20 пин. Отдельными...

На Бп 4 пин для проца а на мамке 8 пин
На Бп 4 пин для проца а на мамке 8 пин. Что делать?

Переконфигурировать php
Доброе время суток! Есть сервер ubuntu 11.10. На нем работают apache2, php, mysql. Всё это добро...

Проверка пин кода и в соответствии с ним заполнить поля после ввода пин-кода на другой форме
Здраствуйте!Люди проблема в следующем, есть задача где мне надо сделать проверку пин кода и в...


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

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

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