реклама на сайте
подробности

 
 
> STM32: регистровый CMSIS или высокоуровневый HAL ?, ПРосто выскажите аргументы за или против, пожалуйста, без холивара
Ruslan1
сообщение Nov 4 2015, 07:39
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Здравствуйте,

В очередной раз хочется что-то улучшить, попробовал взять от жизни от Куба и STM программистов побольше. Попробовал автоматом сгенерированный проект- На нужном мне (незнакомом до этого) STM32F0 камне поставить FreeRTOS и в одной из задач помигать светодиодом- заняло примерно пару часов вместе с установкой новой версии кейла и Куба.
Причем править ничего не пришлось, ну дописал в задачу функцию "HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);" для моргания и все. Причем задача тоже была создана из конфигуратора Куба.

Поспрашивал окружающих программеров, почему же все-таки CMSIS применяют? Были высказаны причины:
1. HAL заточен под Кейл и не работает с другими компиляторами.
2. если переходить от STM на другие, то придется переписывать, а CMSIS- он стандарт

Но, на мой взгляд- совсем не аргументы, если создается конкретное изделие или линейка. Если нужно будет переходить на нечто другое- то никакой CMSIS не поможет, все равно обновлять и переписывать какие-то куски придется. Ну а про заточенность под конкретный компилятор- ну так я одним пользуюсь при работе, а не создаю универсальный демо-проект для интернет-сообщества.

Найденные мной в интернете недостатки HAL (как и его предшественника, SPL):
1. Избыточность сгенерированного кода. Начитался в интернете про "бесконечные перепроверки", но в самом коде HAL увидел, что они зависят от дефайна "USE_FULL_ASSERT. Может, те кто пишет про перепроверки просто не знают о возможности их отключения?
Ну и в HAL многое через структуры делается, это как бы много лишнего кода. Но как по мне- совсем не минус при отладке, я структуры очень люблю, они мне и при использовании камней с считанными сотнями байт RAM не мешали, не то что с килобайтами.
2. Сложность и многоуровневость (и засчет этого низкое быстродействие) критических частей- например, при использовании прерываний. Вроде бы через коллбеки и так далеее и получается не просто, а наоборот запутанно.
3. Непереносимость. А что, CMSIS переносим между изготовителями и править в регистрах ничего не нужно?
4. Наличие большого количества глюков в HAL. Мда?
5. неполный доступ к ресурсам. Ну так всегда можно уйти на нижний уровень.

Из личного, достоинства HAL:
1. скорость написания работающего кода
2. малый размер пользовательской части программы
3. читабельность.


Так за что же не любят HAL?
Я не новичок в программировании МК, но не понимаю, почему нужно по старинке в каждый регистр лезть при выполнении стандартных процедур (CMSIS), а не пользоваться высокоуровневой оберткой этого же действа (HAL)?
Прошли те времена, когда на асме писали и биты (не байты!) экономили, железо подешевело, зато себестоимость времени разработчика увеличилась.

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


В-общем, кто что знает?
В основном, нужно отговорить от использования STM32 HAL, который я сейчас считаю очень удобным и полезным средством, но вдруг ошибаюсь.

Upd: позволю процитировать, очень близко к тому что я думаю (автор- hd44780, но прочитано на другом форуме)
Цитата
CMSIS - это не HAL, это та же прямая работа с регистрами. И если Вы через год начнёте читать, то CMSIS Вас не спасёт от чтения ДШ.
Поэтому вопрос переформулируется как SPL или регистры.
А это уже религия, по поводу которой вылита бездонная бочка разного холивара и даже личных оскорблений и всё равно каждый при своём.

Поэтому пишите на чём хотите. Как Вам удобнее.
Лично я люблю SPL. С её тормозами столкнулся всего лишь раз. Ну и переписал этот кусочек на регистрах sm.gif . Но это не повод "огульно охаивать" весь SPL.
Багов в ней пока не находил.
Ещё, за что ругают SPL, это большой объём результирующего кода. Да, это так. Согласен. Но если моя прошивка занимает 200 кил из мегабайта или двух флэша проца, то почему нет?

Это как девушки - кому брюнетки, кому блондинки. А кому и те и те sm.gif .
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
murmur
сообщение Nov 4 2015, 08:23
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 425
Регистрация: 30-04-11
Пользователь №: 64 708



подпишусь на тему.
Go to the top of the page
 
+Quote Post
ШСА
сообщение Nov 4 2015, 08:30
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 291
Регистрация: 11-04-14
Из: Саратов
Пользователь №: 81 335



Цитата(murmur @ Nov 4 2015, 11:23) *
подпишусь на тему.

Я тоже, но только если HAL годится не только для Keil. Я CooCos-ник.
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Nov 26 2015, 02:58
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Цитата(ШСА @ Nov 4 2015, 11:30) *
Я тоже, но только если HAL годится не только для Keil. Я CooCos-ник.

Я перенес с Кейла на Кокос. Единственное что было неочевидно сходу -- использование другого имени переменной начала стэка в линкер файле. Пришлось минут 15 поискать.
В стартап файле:
Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\gcc\startup_stm32f429xx.s


ldr sp, =_estack /* set stack pointer */
.word _estack

Заменить на

ldr sp, =_eram /* set stack pointer */
.word _eram

Иначе линкер ругается на то, что _estack неопределен.

По поводу темы. Полностью поддерживаю топик стартера. Я тоже достаточно опытный программист микроконтроллеров и не вижу больших проблем с автогенератором. Ну надо изучать структуру полученного кода. Так то что она есть это скорее достоинство. Г-код это когда бессистемное нагромождение кода без продуманных идей. А проблемы со скоростью критических прерываний если потребуется я решу. Да и то если понадобится. Какие основные проблемы с автогенерацией возможны?
1. Баги. А кто без греха?
2. Размер кода. Пока помещается никто с этим не заморачивается. Система интеграции мобильника в БМВ занимает 130 килобайт кода:
http://www.ebay.co.uk/itm/NEW-GENUINE-BMW-...0-/291387105166
Прикиньте насколько можно поджимать код, когда прижмет.
Кстати мой любимый Source Insight тоже не такой много места занимает.
3. Быстродействие. Пока не поджимает никому не важно, а начнутся проблемы -- легко решить.




Цитата(esaulenka @ Nov 4 2015, 13:03) *
Нафиг-нафиг это HAL.
В случае "что-то пошло не так" разобраться в этом наслоении абстракций довольно сложно.
Судя по слухам "в HAL используется Keil RTOS", "HAL поддерживается только в Keil" и т.д., это не только моя проблема :-)

Библиотеки уровня "подрыгать ножкой" и "включить ШИМ" пишутся под конкретные требования на коленке за полчаса.
Заодно и виновный во всех косяках доступен :-)


PS что присутствующие подразумевают под CMSIS, я не понял. Есть CMSIS core - набор функций/макросов для доступа к ядру и его периферии (NVIC, например). Это есть, и это удобно.
А идея "все производители чипов напишут единообразный CMSIS Driver API" не взлетела. Я, во всяком случае, не видел.
http://www.arm.com/products/processors/cor...ce-standard.php

Да ладно вам. Вы не видели кода для фрискейловского АРМа с зигби периферией. Не помню навскидку его имени. Там один хедер файл и из него ифдефами разные части программы получают разные его варианты. Натуральный шифрокод. Я даже и времени не стал тратить -- нашел обходной маневр.


Цитата(Ruslan1 @ Nov 4 2015, 20:49) *
Ну что же, немного прояснил кое-что для себя
1. Не могу работать в структуре Куба. хочу структуру файлов, которую раньше использовал и привык

Мне редко удавалось использовать то, что я привык. Даже не заморачиваюсь с этим.

Цитата(Ruslan1 @ Nov 4 2015, 20:49) *
2. Посмотрел USART. мда, как-то они намутили с проверками и коллбеками, через эту цепь вызовов даже в прерывании продираться нужно, причем вызовы с аргументами. А у меня есть интерфейсы, где таймауты жестко заданы (например, sdi-12, или modbus-rtu ), или прерывания от внешних сигналов. И даже если я засуну свой код в предусмотренное для этого место в исходнике, то вызов HAL_UART_IRQHandler() никуда не денется. А если его удалить, то при следующей генерации кода он опять


Мне UART нужен для дебага только. Я только передатчик использую. Если использовать DMA, то вызывается на все строку только прерывание конец DMA. Да и передача красиво происходит. Вызвал функцию передачи и забыл. Оне не блокирующая. Реалтайм не страдает.

На прием сообщений произвольной длины DMA использовать красиво не получится если надо их в реаьном времени обрабатывать. Но кто мешает переписать обработчик прерывания?

Цитата(rudy_b @ Nov 6 2015, 01:33) *
Вот именно про это я и писал - HAL по DMA запускает передачу последнего байта, а, затем, по прямому поллингу TC дожидается завершения передачи последнего байта - и это в функции обработки прерывания DMA.

На скорости 115 кбод это приводит к завешиванию равных и более низкопроиоритетных прерываний (ну и всего нижележащего) примерно на 12 мксек (длительность передачи одного байта). Соответственно завешивается приемник (если он на равном или низшем приоритете) и получаем ORE.

Это легко убирается либо коррекцией кода HAL, либо снижением приоритета прерываний DMA передачи ниже DMA приема (именно priority, а не subpriority).


Что-то не вижу ожиданий в коде. Можете поподробнее рассказать пожалуйста?
CODE
/**
* @brief Handles DMA interrupt request.
* @param hdma: pointer to a DMA_HandleTypeDef structure that contains
* the configuration information for the specified DMA Stream.
* @retval None
*/
void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma)

{
/* Transfer Error Interrupt management ***************************************/
if(__HAL_DMA_GET_FLAG(hdma, __HAL_DMA_GET_TE_FLAG_INDEX(hdma)) != RESET)
{
if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TE) != RESET)
{
/* Disable the transfer error interrupt */
__HAL_DMA_DISABLE_IT(hdma, DMA_IT_TE);

/* Clear the transfer error flag */
__HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_TE_FLAG_INDEX(hdma));

/* Update error code */
hdma->ErrorCode |= HAL_DMA_ERROR_TE;

/* Change the DMA state */
hdma->State = HAL_DMA_STATE_ERROR;

/* Process Unlocked */
__HAL_UNLOCK(hdma);

if(hdma->XferErrorCallback != NULL)
{
/* Transfer error callback */
hdma->XferErrorCallback(hdma);
}
}
}
/* FIFO Error Interrupt management ******************************************/
if(__HAL_DMA_GET_FLAG(hdma, __HAL_DMA_GET_FE_FLAG_INDEX(hdma)) != RESET)
{
if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_FE) != RESET)
{
/* Disable the FIFO Error interrupt */
__HAL_DMA_DISABLE_IT(hdma, DMA_IT_FE);

/* Clear the FIFO error flag */
__HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_FE_FLAG_INDEX(hdma));

/* Update error code */
hdma->ErrorCode |= HAL_DMA_ERROR_FE;

/* Change the DMA state */
hdma->State = HAL_DMA_STATE_ERROR;

/* Process Unlocked */
__HAL_UNLOCK(hdma);

if(hdma->XferErrorCallback != NULL)
{
/* Transfer error callback */
hdma->XferErrorCallback(hdma);
}
}
}
/* Direct Mode Error Interrupt management ***********************************/
if(__HAL_DMA_GET_FLAG(hdma, __HAL_DMA_GET_DME_FLAG_INDEX(hdma)) != RESET)
{
if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_DME) != RESET)
{
/* Disable the direct mode Error interrupt */
__HAL_DMA_DISABLE_IT(hdma, DMA_IT_DME);

/* Clear the direct mode error flag */
__HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_DME_FLAG_INDEX(hdma));

/* Update error code */
hdma->ErrorCode |= HAL_DMA_ERROR_DME;

/* Change the DMA state */
hdma->State = HAL_DMA_STATE_ERROR;

/* Process Unlocked */
__HAL_UNLOCK(hdma);

if(hdma->XferErrorCallback != NULL)
{
/* Transfer error callback */
hdma->XferErrorCallback(hdma);
}
}
}
/* Half Transfer Complete Interrupt management ******************************/
if(__HAL_DMA_GET_FLAG(hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma)) != RESET)
{
if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_HT) != RESET)
{
/* Multi_Buffering mode enabled */
if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != 0)
{
/* Clear the half transfer complete flag */
__HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma));

/* Current memory buffer used is Memory 0 */
if((hdma->Instance->CR & DMA_SxCR_CT) == 0)
{
/* Change DMA peripheral state */
hdma->State = HAL_DMA_STATE_READY_HALF_MEM0;
}
/* Current memory buffer used is Memory 1 */
else if((hdma->Instance->CR & DMA_SxCR_CT) != 0)
{
/* Change DMA peripheral state */
hdma->State = HAL_DMA_STATE_READY_HALF_MEM1;
}
}
else
{
/* Disable the half transfer interrupt if the DMA mode is not CIRCULAR */
if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
{
/* Disable the half transfer interrupt */
__HAL_DMA_DISABLE_IT(hdma, DMA_IT_HT);
}
/* Clear the half transfer complete flag */
__HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_HT_FLAG_INDEX(hdma));

/* Change DMA peripheral state */
hdma->State = HAL_DMA_STATE_READY_HALF_MEM0;
}

if(hdma->XferHalfCpltCallback != NULL)
{
/* Half transfer callback */
hdma->XferHalfCpltCallback(hdma);
}
}
}
/* Transfer Complete Interrupt management ***********************************/
if(__HAL_DMA_GET_FLAG(hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma)) != RESET)
{
if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_TC) != RESET)
{
if(((hdma->Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != 0)
{
/* Clear the transfer complete flag */
__HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma));

/* Current memory buffer used is Memory 1 */
if((hdma->Instance->CR & DMA_SxCR_CT) == 0)
{
if(hdma->XferM1CpltCallback != NULL)
{
/* Transfer complete Callback for memory1 */
hdma->XferM1CpltCallback(hdma);
}
}
/* Current memory buffer used is Memory 0 */
else if((hdma->Instance->CR & DMA_SxCR_CT) != 0)
{
if(hdma->XferCpltCallback != NULL)
{
/* Transfer complete Callback for memory0 */
hdma->XferCpltCallback(hdma);
}
}
}
/* Disable the transfer complete interrupt if the DMA mode is not CIRCULAR */
else
{
if((hdma->Instance->CR & DMA_SxCR_CIRC) == 0)
{
/* Disable the transfer complete interrupt */
__HAL_DMA_DISABLE_IT(hdma, DMA_IT_TC);
}
/* Clear the transfer complete flag */
__HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_TC_FLAG_INDEX(hdma));

/* Update error code */
hdma->ErrorCode |= HAL_DMA_ERROR_NONE;

/* Change the DMA state */
hdma->State = HAL_DMA_STATE_READY_MEM0;

/* Process Unlocked */
__HAL_UNLOCK(hdma);

if(hdma->XferCpltCallback != NULL)
{
/* Transfer complete callback */
hdma->XferCpltCallback(hdma);
}
}
}
}
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Ruslan1   STM32: регистровый CMSIS или высокоуровневый HAL ?   Nov 4 2015, 07:39
- - murmur   подпишусь на тему.   Nov 4 2015, 08:23
|- - Ruslan1   Цитата(ШСА @ Nov 4 2015, 10:30) Я тоже, н...   Nov 4 2015, 08:39
|- - rudy_b   Цитата(Tarbal @ Nov 26 2015, 05:58) ... Ч...   Nov 26 2015, 14:55
- - Сергей Борщ   Цитата(Ruslan1 @ Nov 4 2015, 10:39) 1. Из...   Nov 4 2015, 08:41
- - ViKo   Cube и его HAL никак не связаны с Keil, они создан...   Nov 4 2015, 09:07
|- - Ruslan1   Еще один минус HAL в голову пришел- время жизни (п...   Nov 4 2015, 09:45
- - esaulenka   Нафиг-нафиг это HAL. В случае "что-то пошло н...   Nov 4 2015, 10:03
|- - Corvus   Цитата(esaulenka @ Nov 4 2015, 13:03) Еще...   Nov 4 2015, 10:30
||- - Огурцов   в кубе докопаться до дна - сложнее, приходится вер...   Nov 4 2015, 10:37
|- - MiklPolikov   Цитата(esaulenka @ Nov 4 2015, 13:03) Наф...   Nov 9 2015, 01:19
|- - ViKo   Цитата(MiklPolikov @ Nov 9 2015, 04:19) Д...   Nov 9 2015, 05:31
- - Integro   Цитата1. HAL заточен под Кейл и не работает с друг...   Nov 4 2015, 11:51
|- - _Pasha   Цитата(Integro @ Nov 4 2015, 15:51) В люб...   Nov 4 2015, 15:05
|- - Огурцов   Цитата(_Pasha @ Nov 4 2015, 16:05) xml-...   Nov 4 2015, 15:51
|- - Ruslan1   Ну что же, немного прояснил кое-что для себя 1. Не...   Nov 4 2015, 17:49
- - rudy_b   HAL прекрасно работает с IAR, и, на мой взгляд, ве...   Nov 4 2015, 15:31
- - Эдди   Советую для начала взять libopencm3, а потом потих...   Nov 4 2015, 20:11
|- - AlexandrY   Цитата(Эдди @ Nov 4 2015, 22:11) Советую ...   Nov 4 2015, 21:08
||- - toweroff   Цитата(AlexandrY @ Nov 5 2015, 00:08) Дву...   Nov 4 2015, 22:18
|||- - Ruslan1   Извините, а libopencm3 под кейлом будет работать? ...   Nov 4 2015, 22:20
|||- - esaulenka   Цитата(Ruslan1 @ Nov 5 2015, 01:20) Извин...   Nov 5 2015, 06:19
||||- - Ruslan1   Цитата(esaulenka @ Nov 5 2015, 08:19) Бук...   Nov 5 2015, 07:03
|||- - _Pasha   Цитата(Ruslan1 @ Nov 5 2015, 02:20) Извин...   Nov 5 2015, 10:25
||- - Эдди   Цитата(AlexandrY @ Nov 5 2015, 00:08) Дву...   Nov 5 2015, 05:57
||- - AlexandrY   Цитата(Эдди @ Nov 5 2015, 07:57) При чем ...   Nov 5 2015, 07:33
||- - esaulenka   Цитата(AlexandrY @ Nov 5 2015, 10:33) А в...   Nov 5 2015, 08:03
|||- - AlexandrY   Цитата(esaulenka @ Nov 5 2015, 10:03) А в...   Nov 8 2015, 15:43
||- - Эдди   Цитата(AlexandrY @ Nov 5 2015, 10:33) А в...   Nov 5 2015, 12:05
|- - Ruslan1   Цитата(Эдди @ Nov 4 2015, 22:11) Советую ...   Nov 4 2015, 21:36
- - Genadi Zawidowski   В проекте с цифровой обработкой звука применяется ...   Nov 5 2015, 07:47
- - yes   про HAL в драйвере CAN-а HAL_UNLOCK не вызывается...   Nov 5 2015, 12:30
|- - rudy_b   Цитата(yes @ Nov 5 2015, 15:30) в драйвер...   Nov 5 2015, 22:33
|- - _Pasha   Цитата(rudy_b @ Nov 6 2015, 02:33) HAL по...   Nov 6 2015, 07:09
|- - Ruslan1   Цитата(_Pasha @ Nov 6 2015, 09:09) Ужас. ...   Nov 6 2015, 07:51
- - smalcom   Много написано, прочитал по диагонали, потому могу...   Nov 8 2015, 14:49
|- - Ruslan1   Цитата(smalcom @ Nov 8 2015, 16:49) холив...   Nov 8 2015, 16:19
|- - zltigo   QUOTE (Ruslan1 @ Nov 8 2015, 18:19) я зак...   Nov 8 2015, 18:58
|- - Ruslan1   Цитата(zltigo @ Nov 8 2015, 20:58) Вообще...   Nov 8 2015, 20:10
|- - zltigo   QUOTE (Ruslan1 @ Nov 8 2015, 22:10) Лично...   Nov 9 2015, 06:43
|- - ViKo   Цитата(zltigo @ Nov 9 2015, 09:43) Хороши...   Nov 9 2015, 07:17
|- - Ruslan1   В-общем, HAL я обошел стороной, но решил хоть ...   Nov 18 2015, 22:31
- - smalcom   забавно, а теперь покажите где там провокация. кро...   Nov 8 2015, 21:12
- - rudy_b   SPL тоже не подарок и ошибок в ней много. Мусора п...   Nov 19 2015, 04:01
|- - Ruslan1   Цитата(rudy_b @ Nov 19 2015, 06:01) SPL т...   Nov 19 2015, 11:22
|- - AHTOXA   Цитата(Ruslan1 @ Nov 19 2015, 16:22) Одна...   Nov 21 2015, 04:23
|- - ViKo   Цитата(AHTOXA @ Nov 21 2015, 07:23) Это 2...   Nov 21 2015, 06:18
|- - Ruslan1   Цитата(AHTOXA @ Nov 21 2015, 06:23) Это 2...   Nov 21 2015, 08:11
|- - AHTOXA   Цитата(Ruslan1 @ Nov 21 2015, 13:11) Как ...   Nov 21 2015, 08:37
|- - Ruslan1   Цитата(AHTOXA @ Nov 21 2015, 10:37) Да, я...   Nov 21 2015, 09:33
- - ViKo   USART_GetITStatus(USART2, USART_IT_TXE) - это функ...   Nov 21 2015, 12:59
- - Tarbal   Спасибо. Надо будет переписать. Получается по фла...   Nov 26 2015, 19:01
- - Tarbal   Не успел переписать Они уже сами починили. Кстати...   Nov 26 2015, 20:57
|- - rudy_b   Цитата(Tarbal @ Nov 26 2015, 23:57) Не ус...   Nov 27 2015, 02:47
|- - Tarbal   Цитата(rudy_b @ Nov 27 2015, 06:47) Выгля...   Nov 27 2015, 04:46
|- - rudy_b   Ох, не торопитесь апгрейтить Cube, в последней вер...   Nov 28 2015, 16:00
- - x893   Теоретики - как завидую Вам   Nov 26 2015, 22:07
|- - Tarbal   Цитата(x893 @ Nov 27 2015, 01:07) Теорети...   Nov 27 2015, 01:25
- - Jenya7   лично мои впечатления. ни с STM32 ни с HAL ни с SP...   Nov 29 2015, 12:20
- - Allregia   Цитатасобирал проект на HAL. два дня собирал. собр...   Nov 29 2015, 15:56
|- - Jenya7   Цитата(Allregia @ Nov 29 2015, 20:56) Это...   Nov 29 2015, 17:01
- - Bloom   Я в проектах часто использую Chibios и, соотвестве...   Dec 7 2015, 05:40
- - yanvasiij   Добавлю свои пять копеек. Как мне кажется использо...   Apr 16 2016, 11:08
- - x893   C HAL просто начать, но там нет нужных функций. Дл...   Apr 16 2016, 20:42
- - makser   Я свои проекты делаю на SPL, потеря в тактах и бай...   Apr 24 2016, 10:58
- - x893   Мне по барабану регистры, SPL, HAL - у меня код ап...   Apr 24 2016, 17:30
|- - zltigo   QUOTE (x893 @ Apr 24 2016, 20:30) Мне по ...   Apr 24 2016, 21:22
- - x893   Это легко сравнивается через DWT, таймером, профай...   Apr 24 2016, 23:13
- - alexp74   Ковырял stm32f4xx_hal_eth.c и нашел интересный мом...   May 14 2016, 09:22


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 02:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01487 секунд с 7
ELECTRONIX ©2004-2016