Универсальная инициализацию usart

Кто любит RISC в жизни, заходим, не стесняемся.
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Универсальная инициализацию usart

Сообщение pokk »

Добрый день, задался я такой задачей написать функцию, через которую можно было просто инициализировать любой usart.

Сейчас у меня инициализация выглядит так:

Код: Выделить всё

//---------- выводов USART_RX-------------------------------------------------
   RCC_APB2PeriphClockCmd(RX_CLOCK(USART_PORT_RX),ENABLE);
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Pin = USART_RX;
   GPIO_Init(GPIO(USART_PORT_RX), &GPIO_InitStructure);
//---------- выводов USART_TX-------------------------------------------------
   RCC_APB2PeriphClockCmd(TX_CLOCK(USART_PORT_TX),ENABLE);
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Pin = USART_TX;
   GPIO_Init(GPIO(USART_PORT_TX), &GPIO_InitStructure);
//---------- USART----------------------------------------------------------
   USART_DeInit(USART(USER_USART));
   USART_Cmd(USART(USER_USART), DISABLE);
   USART_StructInit(&USART_InitStructure);
       
       
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
   USART_InitStructure.USART_BaudRate = baud;
   //USART_InitStructure.USART_BaudRate = 256000;
   //USART_InitStructure.USART_BaudRate = 9600;
   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
   USART_InitStructure.USART_StopBits = USART_StopBits_2;
   USART_InitStructure.USART_Parity = USART_Parity_No;
   USART_InitStructure.USART_Mode =USART_Mode_Rx|USART_Mode_Tx; // USART_Mode_Tx; //USART_Mode_Rx | USART_Mode_Tx;
   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
   USART_Init(USART(USER_USART), &USART_InitStructure);
   USART_Cmd(USART(USER_USART), ENABLE);


Код: Выделить всё

#define Remaping_Usart1 1 // 1-ремапинг 0-без ремапа

#define   USART_RX      GPIO_Pin_11
#define   USART_PORT_RX   C
#define   RX_CLOCK(x)      CONCAT(RCC_APB2Periph_GPIO,x)


#define   USART_TX      GPIO_Pin_10
#define   USART_PORT_TX   C
#define   TX_CLOCK(x)      CONCAT(RCC_APB2Periph_GPIO,x)

#define   USER_USART      3
#define   USART(x)          CONCAT(USART, x)
//#define   USART         USART1
#define   USART_CLOCK(x)  CONCAT(RCC_APB2Periph_USART,x)


Переключить функционал с одного usart на другой очень просто и быстро, но подключить второй такой же достаточно трудоёмко.
1) решил сделать функцию со входными параметрами usart,rx,tx,remap,baud, но входных параметров оказывается многовато так как туда притягиваются порт Rx,Tx, RCC......
2) Задумал все входные параметры занести в структуру (с соответствием usart1 и его выводам и портам), а в функцию передавать указатель, но отказался от этого подхода так как не хочу отбирать flash, озу для размещения этой структуры.

Есть ещё какие либо варианты ?

PS: Сейчас для проекта используется 1-2 Usart, а позже планируется использовать 4-6 вот и хочу написать функцию сейчас что бы позже к ним не возвращаться.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Универсальная инициализацию usart

Сообщение oleg110592 »

USARTы в STM32 многофункциональные, как в такой универсальной функции включить Continuous communications using DMA, Single-wire half-duplex communications, Hardware flow control for modem and RS-485 transceiver и т.д. Получается нужна кучка функций на все случаи жизни. Имхо функции делать лучше по документации типа:

Код: Выделить всё

/* (1) oversampling by 16, 9600 baud */
/* (2) 8 data bit, 1 start bit, 1 stop bit, no parity, reception mode */
USART1->BRR = 480000 / 96; /* (1) */
USART1->CR1 = USART_CR1_RXNEIE | USART_CR1_RE | USART_CR1_UE; /* (2) */

две строчки всего то, а USART на прием уже работает, по приему сработает прерывание, если разрешить...
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Универсальная инициализацию usart

Сообщение dosikus »

А любители SPL и калокубов все такие, им и невдомек что можно все сделать просто и прозрачно без говнооберток. Мало того , один немец написал свою обертку над SPL... :))))))
pokk
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Re: Универсальная инициализацию usart

Сообщение pokk »

Походу я размыто описал задачу, но теперь что-то устаканилось.
В общем хотелось бы сделать такое в h файле выбираем настройки для какого либо usart. И после как-то передаём настройки в функцию, которая производит инициализацию(запись в регистры).
Тогда что бы при необходимости использования ещё одного usart, мы могли просто скопировать настройки с первого, изменить их и передаём их опять в ту же функцию.
Без изменения сишного файла ну кроме как добавления ещё одной строки

Код: Выделить всё

UsartInit(usart1);
UsartInit(usart2);

где usart1,usart2 настройки сформированные в h файле.
Весь вопрос в том, что и как формировать в h файле и как это передать в функцию.
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: Универсальная инициализацию usart

Сообщение Pnjom-Penb »

dosikus писал(а):Мало того , один немец написал свою обертку над SPL... :))))))
Вот потому-то и расклад такой - они делают Мерседесы и БМВ, а мы - новые ведра... :)))
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Универсальная инициализацию usart

Сообщение oleg110592 »

в новом HAL такого уже нагородили, куб подобное генерит:

Код: Выделить всё

UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
UART_HandleTypeDef huart3;
.....
/* USART2 init function */
void MX_USART2_UART_Init (void)
{
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 19200;
  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;
  huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED;
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  HAL_UART_Init (&huart2);
}
......

только громоздко это все, и если что-то не будет работать, трудновато разобраться будет
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Универсальная инициализацию usart

Сообщение dosikus »

Pnjom-Penb писал(а): они делают Мерседесы и БМВ, а мы - новые ведра... :)))

Да брось. :))) Не от большого ума все это.

Олег, чем дальше в лес , тем больше дров.
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: Универсальная инициализацию usart

Сообщение Pnjom-Penb »

dosikus писал(а):Да брось. :))) Не от большого ума все это.
К сожалению, в моей шутке доля шутки даже меньше обычного. Я SPL не защищаю, но и против огульного отрицания. В частности, сам когда-то придумал некий специальный вид библиотек, чтобы выжимать из "мурзика" все, до последней капли... и уже через месяц-другой обнаружил, что это путь в никуда. Библиотеки, создающие АПИ высокого уровня - часто весьма оправданная вещь, так как время разработки/отладки гораздо дороже, чем скорострельность камушков и объемы памяти. А если это еще умножить на действительно многочисленный круг разработчиков ПО, то "часто" превращается в "практически всегда".

PS: "Тем толще партизаны", в данном случае. :)))
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Универсальная инициализацию usart

Сообщение dosikus »

Pnojm-Penb.ну собственно верно, каждый уважающий себя нуб просто обязан - написать макросы ногодрыга и обертки к SPL. Без велосипедов ну просто никуда. :)))
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: Универсальная инициализацию usart

Сообщение Pnjom-Penb »

dosikus писал(а):каждый уважающий себя нуб просто обязан - написать макросы ногодрыга и обертки к SPL.
Если у этого нуба столько же потребителей-программеров, сколько у STM, то да - обязан, иначе он такие деньжищи обречет на смерть, что никто не посмотрит, что он нуб, и получит он тогда - заслуженнейших звездюлей! :)))
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Универсальная инициализацию usart

Сообщение HHIMERA »

Pnjom-Penb писал(а):Я SPL не защищаю, но и против огульного отрицания. В частности, сам когда-то придумал некий специальный вид библиотек, чтобы выжимать из "мурзика" все, до последней капли... и уже через месяц-другой обнаружил, что это путь в никуда. Библиотеки, создающие АПИ высокого уровня - часто весьма оправданная вещь, так как время разработки/отладки гораздо дороже, чем скорострельность камушков и объемы памяти. А если это еще умножить на действительно многочисленный круг разработчиков ПО, то "часто" превращается в "практически всегда".

Ну вот нафига было... эту чушь вытаскивать на свет божий??? Уже всё это обсуждали-переобсуждали...
Всё это путь недоПиСишников с загаженными мозгами... типа... взял КУБ... за пять минут накнопал проект с ЮСБ, СД-картой и офигенным ТФТ... дюймов на 10... всё работает зашибись (типа я крутой)... помогите чтобы мигал светодиод при смене трека... ))))))))
Ну или... путь Мегадаунов из секты Кодэнедовижэн... типа... а где в Кубе прога с микросекундами... чтобы проект с Меги с адынвирэ перетянуть на СТМ32... а то семисегментник мигает некрасиво... и вообще всё тормозит... )))))))
"Я не даю готовых решений, я заставляю думать!"(С)
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Универсальная инициализацию usart

Сообщение HHIMERA »

dosikus писал(а):и тут такие ляпы.

Да у него эта хрень с головы не выветривается... обосновалась на постоянной основе...
Зацени разрыв шаблона... планетарного масштаба...

Код: Выделить всё

сам когда-то придумал некий специальный вид библиотек, чтобы выжимать из "мурзика" все, до последней капли... и уже через месяц-другой обнаружил, что это путь в никуда.

Как бы понятно... универсальность - зло!!!
И тут же...
Библиотеки, создающие АПИ высокого уровня - часто весьма оправданная вещь, так как время разработки/отладки гораздо дороже, чем скорострельность камушков и объемы памяти. А если это еще умножить на действительно многочисленный круг разработчиков ПО, то "часто" превращается в "практически всегда".

Оказывается... либы были не той системы... мушка была не спиляна... ))))))

Нарушение правил. п 2.2. Замечание. FAKIR. В следующий раз бан.
"Я не даю готовых решений, я заставляю думать!"(С)
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: Универсальная инициализацию usart

Сообщение Pnjom-Penb »

dosikus писал(а):вы принадлежите кагорте любителей го*нолиб?
Нет, просто я наблюдательный человек, допускающий отрицание на корню только одного - догматизма. Жизнь развивается далеко не в соответствии с чьими-либо пристрастиями к инструментам. :))) :dont_know:
dosikus писал(а):Весьма сожалею...
Это твой выбор, тебе с ним и работать.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Универсальная инициализацию usart

Сообщение dosikus »

Ну да , и работаем весьма плодотворно.
Пока нужды ни в SPL ни в калокубе не испытываем.
Даже Emwin с контроллером TFT, RAM и ускорителем графики пользуем на 429.
Счас USB стек на F0 чистим от г***на.
Pnjom-Penb
Мучитель микросхем
Сообщения: 469
Зарегистрирован: Вс авг 30, 2015 03:52:59

Re: Универсальная инициализацию usart

Сообщение Pnjom-Penb »

dosikus писал(а):Ну да , и работаем весьма плодотворно.
С чем - со своим сожалением? :))) Я о нем говорил, а не об ф429.
godz320
Родился
Сообщения: 19
Зарегистрирован: Пт янв 08, 2016 19:00:40

Re: Универсальная инициализацию usart

Сообщение godz320 »

pokk писал(а):Добрый день, задался я такой задачей написать функцию, через которую можно было просто инициализировать любой usart.




http://mikrocontroller.bplaced.net/wordpress/?page_id=1974

вот тут посмотрите, исходники.
Аватара пользователя
FAKIR
Друг Кота
Сообщения: 23520
Зарегистрирован: Пт дек 12, 2014 09:36:15
Откуда: Минск

Re: Универсальная инициализацию usart

Сообщение FAKIR »

Прекратили флуд - пишем по теме.

Подчистил...
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: Универсальная инициализацию usart

Сообщение dosikus »

godz320 писал(а):
вот тут посмотрите, исходники.

Спасибо, уважаемый, это именно тот фриц с его обертками.

FAKIR, вынужден вас просить - извините это вовсе не флуд. Просмотрите пожалуйста исходники по ссылке.
Такой бред может изобразить только выходец с PC , далекий от эмбедда. Тем же самым занимается ТС.
godz320
Родился
Сообщения: 19
Зарегистрирован: Пт янв 08, 2016 19:00:40

Re: Универсальная инициализацию usart

Сообщение godz320 »

dosikus писал(а):Такой бред


чайнику коротко не скажите в чем бред?
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Универсальная инициализацию usart

Сообщение HHIMERA »

Die Verbindungsstrecke sieht dann so aus :

PC <- USB -> STM32F4 <- UART -> Device (z.B. Mega8)

Да сама постановка задачи... уже бред... изначально... Исходники можно уже и не смотреть... даже...
"Я не даю готовых решений, я заставляю думать!"(С)
Ответить

Вернуться в «ARM»