STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
afz
Опытный кот
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Re: STM32 новичку в ARM что к чему

Сообщение afz »

oleg110592 писал(а):а родном сайте, например UM1725 User Manual Description of STM32F4 HAL and LL drivers
Так меня и интересовало, как найти на родном сайте. Что спросить у ST-шного поисковика, чтобы сразу получить ссылку на нужный материал, а не 2 с лишним тысячи ссылок на 163 страницах, среди которых нужный материал точно есть, только найди его...
Последний раз редактировалось afz Ср авг 22, 2018 16:44:40, всего редактировалось 1 раз.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Реклама
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Re: STM32 новичку в ARM что к чему

Сообщение Ярослав555 »

[uquote="afz",url="/forum/viewtopic.php?p=3441680#p3441680"]Так меня и интересовало, как найти на родном сайте. Что спросить у ST-шного поисковика, чтобы сразу получить ссылку на нужный материал, а не на 2 с лишним тысячи ссылок на 163 страницах, среди которых нужный материал точно есть, только найди его...[/uquote]
Надо сделать куб для документации :)))
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Ну начнем с того, что то что озвучивают как документация на калокуб, хрень собачья сгенерированная доксигеном.
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: STM32 новичку в ARM что к чему

Сообщение arkhnchul »

[uquote="dosikus",url="/forum/viewtopic.php?p=3441611#p3441611"]может все -таки на F1?[/uquote]неа.
[uquote="dosikus",url="/forum/viewtopic.php?p=3441611#p3441611"]А " грабли" были единственные - к CRC_DR надо обращаться как к байту...[/uquote]да если бы)
Изображение Изображение
dosikus писал(а):то что озвучивают как документация на калокуб, хрень собачья сгенерированная доксигеном
обыкновенный справочник :dont_know: БОльшая часть документации на разнообразные библиотеки примерно так и выглядит. Это ж не RM или даташит.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32 новичку в ARM что к чему

Сообщение dosikus »

Реклама
pvit
Нашел транзистор. Понюхал.
Сообщения: 191
Зарегистрирован: Вт июн 05, 2018 00:18:01

Re: STM32 новичку в ARM что к чему

Сообщение pvit »

https://github.com/speedcontrols/ac_sc_ ... librator.h

Как можно покрасивее записать бизнес-логику? В процессе калибровки надо проделать линейную последовательность действий. Местами иногда бывают циклы, но без фанатизма. Снаружи это все дергается через метод ".tick()", а дальше "крутись как хочешь".

Не нравится мне как выглядит код. Ни когда это был единый switch, ни после разбивки на мелкие функции. Суть простого алгоритма тонет в особенностях реализации. Что можно придумать, чтобы улучшить читаемость?

PS. Тащить ради этого RTOS как-то не хочется.
Реклама
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Re: STM32 новичку в ARM что к чему

Сообщение Ярослав555 »

Автомат конечных состояний. Уже все придумано. ИМХО без свичей нормального ничего не получится, пройденный этап.
Есть еще такой интересный высокоуровневый "язык программирования" как SFC - использует методику описания состояния машины и условия переходов от состояния к состоянию.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: STM32 новичку в ARM что к чему

Сообщение ARV »

мне остался не понятным способ вызова .tick() - что ли вызывается чаще, чем успеет отработать весь алгоритм калибровки, из таймера? ну так я бы ввел флаг, и, пока он стоит, из tick() сразу бы выходил, что дало бы возможность спокойно работать сколько надо логике, не взирая на попытки повторного входа...
ну, то есть, в калибровке поставил флаг, откалибровал и сбросил флаг...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
pvit
Нашел транзистор. Понюхал.
Сообщения: 191
Зарегистрирован: Вт июн 05, 2018 00:18:01

Re: STM32 новичку в ARM что к чему

Сообщение pvit »

Я в курсе что такое FSM. Вопрос именно по красивой записи - как сделать чтобы читалась именно суть (бизнес-логика), а не особенности языка.

Например на жабаскрипте/питоне через async/await получается очень приятно - ничего лишнее не отвлекает, когда код читаешь.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

Pvit, не нужно делать все методы встроенными, они неявно инлайнятся, а некоторые из них на целый экран и вызываются в разных местах. И поубирай void у ничего не принимающих методов, половина пишущих на С++ в эмбедде страдает подобным, еще typedef любят везде добавлять, сразу видно, что не так давно на чистом С писали :)
pvit
Нашел транзистор. Понюхал.
Сообщения: 191
Зарегистрирован: Вт июн 05, 2018 00:18:01

Re: STM32 новичку в ARM что к чему

Сообщение pvit »

О каких именно встроенных методах речь? Можно ссылку на строчку кода?

Я вообще не писатель на сях/плюсах. Это временная мера, пока rust не допилят :). Поэтому сейчас проработана архитектура, чтобы модули были хорошо изолированы и связный код не лез. А то что конкретно на С/C++ это сранновато выглядит - не велика печаль. Мусорное ведро через пол года справится :).
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: STM32 новичку в ARM что к чему

Сообщение Reflector »

[uquote="pvit",url="/forum/viewtopic.php?p=3442169#p3442169"]О каких именно встроенных методах речь? Можно ссылку на строчку кода?[/uquote]
Это встроенный инлайнящийся метод, по крайней мере если включена оптимизация, с -O0 инлайн для всего отключен.

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

class TriacDriver
{
  void tick() {.... }
}
А это нет, для больших функций компилятор наверняка подставит вызовы функции, если их больше одного:

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

class TriacDriver
{
  void tick();
}
void TriacDriver::tick()
{
}
Я вообще не писатель на сях/плюсах. Это временная мера, пока rust не допилят :).
Можно ждать очень долго и все равно С++ будут допиливать быстрее :)
pvit
Нашел транзистор. Понюхал.
Сообщения: 191
Зарегистрирован: Вт июн 05, 2018 00:18:01

Re: STM32 новичку в ARM что к чему

Сообщение pvit »

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

[uquote="Reflector",url="/forum/viewtopic.php?p=3442182#p3442182"]Можно ждать очень долго и все равно С++ будут допиливать быстрее :)[/uquote]

Флаг в руки допильщикам :). Я вполне нейтрален к синтаксису плюсов, но там до сих пор нет стандартного пакетного менеджера. IMHO именно из-за этого в коде эмбедов до сих пор творится ад.

Вроде в последних плюсовых спеках запланировали хедеры выпилить. Это очень правильно, но отсутствия пакетного менеджера не компенсирует.
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: STM32 новичку в ARM что к чему

Сообщение Myp3ik »

Можно и без Switch:

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

typedef bool (* StateFunc)(void);

StateFunc stateFuncArray[] = { idle, up_check, down_check, pre_pause, calibrate_static };
И вызов:

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

tick()
{
    if (cal_state < sizeof(stateFuncArray) / sizeof(stateFuncArray[0]))
    {
        return stateFuncArray[cal_state]();
    }
    else
    {
        reset();
        return false;
    }
}
:)))
Иван Сусанин - первый полупроводник :solder:
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: STM32 новичку в ARM что к чему

Сообщение arkhnchul »

[uquote="pvit",url="/forum/viewtopic.php?p=3442154#p3442154"]как сделать чтобы читалась именно суть (бизнес-логика), а не особенности языка[/uquote]
можно попытаться это сделать чисто стилистическими путями. Например, не стесняться давать любым объектам длинные имена, непосредственно из которых понятно, чего это такое. Вот knob - крутилка, dial - циферблат, а что означают их значения? Из UP_CHECK видно, что это - состояние и где в линейной последовательности это состояние должно быть?
ну и по вертикали более наглядно группировать логически связанные действия. Традиционное "фигурные скобки на новой строке" мешает.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: STM32 новичку в ARM что к чему

Сообщение oleg110592 »

[uquote="afz",url="/forum/viewtopic.php?p=3441680#p3441680"]Так меня и интересовало, как найти на родном сайте. Что спросить у ST-шного поисковика, чтобы сразу получить ссылку на нужный материал[/uquote]
1) Идем сюда
https://www.st.com/en/embedded-software.html
2) нажимаем
<Resources>
выбираем
<User Manual>
3) В поле
<Filter by Resource Title>
Вводим
<HAL>
Нажимаем
<Apply Filters>
Получаем всего 11 ссылок
4)Скачиваем нужное
Аватара пользователя
bezzabotna
Встал на лапы
Сообщения: 134
Зарегистрирован: Пн ноя 07, 2016 12:14:14

Re: STM32 новичку в ARM что к чему

Сообщение bezzabotna »

По поводу RN42 и UART:
В общем все дело было в задержках.
1) Между командами нужно подавать около 10мс. При 5 мс настройки модуля не устанавливаются.
2) Сброс до заводских настроек надо делать отдельно, после него надо перезагружать модуль и ждать около 2с, прежде чем снова входить в режим команд и устанавливать другие настройки. При задержке 1 с, у меня остальные настройки не устанавливались. Хотя при конфигурации модуля через компьютер (через UART или bluetooth) все вроде как устанавливалось нормально.
3)Дефолтные установки немного не соответствовали документации. После сброса устанавливался профиль APL, а не SPP. Кроме того, подключения на выводе GPIO5 почему-то частота сигнала 2 Гц, что тоже не соответствует документации. В таком состоянии должен быть 1 Гц, но все работает. На модуле написано RN42-I/RM, никакой доп маркировки нет.

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

const uint8_t cmd[]={"$$$"};								 	
const uint8_t def_settings[]={"SF,1\r\n"};						
const uint8_t spp_profile[]={"S~,0\r\n"};			
const uint8_t slave_mode[]={"SM,0\r\n"};
const uint8_t name[]={"SN,Name\r\n"};						
const uint8_t reboot[]={"R,1\r\n"};

//---------------------------------------------------------------------------------------//
//Инициализация модуля
//---------------------------------------------------------------------------------------//
void RN42_Ini(void){
	BT_ON;	
	BT_RES_OFF;
	HAL_Delay(600);
}
//---------------------------------------------------------------------------------------//
//Сброс настроек модуля
//---------------------------------------------------------------------------------------//
void RN42_SetDefSettins(void){
	UART_TransmitData((uint8_t*)cmd, strlen(cmd));						//вход в режим команд
	HAL_Delay(10);
	UART_TransmitData((uint8_t*)def_settings, strlen(def_settings));				//сброс модуля до заводских настроек 
	HAL_Delay(10);
	UART_TransmitData((uint8_t*)reboot, strlen(reboot));						//перезагрузка модуля
	HAL_Delay(2000);	
	
	UART_TransmitData((uint8_t*)cmd, strlen(cmd));						//вход в режим команд
	HAL_Delay(10);		
	UART_TransmitData((uint8_t*)spp_profile, strlen(spp_profile));				//установить профиль SPP
	HAL_Delay(10);	
	UART_TransmitData((uint8_t*)slave_mode, strlen(slave_mode));				//установить режим Slave
	HAL_Delay(10);
	UART_TransmitData((uint8_t*)name, strlen(name));						//установить имя 
	HAL_Delay(10);	
	UART_TransmitData((uint8_t*)reboot, strlen(reboot));						//перезагрузка модуля
	HAL_Delay(10);
}
Я конечно все понимаю, но этого я не понимаю.
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: STM32 новичку в ARM что к чему

Сообщение Myp3ik »

Можно команды в одну кучу сгрести :))

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


#define CMD_MODE        ((uint8_t)0)
. . .
#define REBOOT          ((uint8_t)5)

static const char *const commands[] =
{
    "$$$",
    "SF,1\r\n",
    "S~,0\r\n",
    "SM,0\r\n",
    "SN,Name\r\n",
    "R,1\r\n"
};

UART_TransmitData((uint8_t*)commands[CMD_MODE], strlen(commands[CMD_MODE]));

Иван Сусанин - первый полупроводник :solder:
pvit
Нашел транзистор. Понюхал.
Сообщения: 191
Зарегистрирован: Вт июн 05, 2018 00:18:01

Re: STM32 новичку в ARM что к чему

Сообщение pvit »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3442253#p3442253"]можно попытаться это сделать чисто стилистическими путями.[/uquote]
Вытащил проверялку дерганья ручкой во вложенный FSM (все равно вложенные еще понадобятся, для различных этапов калибровки) . Ну и названия подправил где мог.

https://github.com/speedcontrols/ac_sc_ ... librator.h

Вроде перестало взрывать мозг так сильно как раньше.
arkhnchul
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Re: STM32 новичку в ARM что к чему

Сообщение arkhnchul »

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

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

#if defined(MB_HAS_FUNCTION_READ_HOLDING_REGISTERS)||defined(MB_HAS_FUNCTION_READ_INPUT_REGISTERS)
void mb_function_read_registers(void) {
    const uint16_t register_start_address = MB_ADU_GET_UINT16(2);
    /* Modbus spec says that register count is 2-byte field,
     * but simultaneously it has to be less or equal 125 (decimal)
     * so we can take just LSB */
    const uint8_t register_count = MB.buffer[5];
 
    if (register_count == 0) {
        mb_raise_exception(MB_EXCEPTION_WRONG_ADDRESS);
        return;
    }
    /* check if we have enough space for response in MB.buffer */
    if (register_count > (MB_BUFFER_SIZE - 5) / 2) {
        mb_raise_exception(MB_EXCEPTION_INTERNAL_FAILURE);
        return;
    }
 
    /* response "byte count" field; each register value consumes two bytes */
    MB.buffer[2] = register_count * 2;
    /* as for now, ADU buffer contains 3 bytes - slave address, function code and byte count */
    MB.ADU_length = 3;
    /* now fill rest of buffer with registers values */
    for (uint16_t i = register_start_address;
            i < register_start_address + register_count; i++) { 
        uint16_t register_value;
 
        // TODO: implement device-specific read actions
        register_value = mb_port_read_register(i);
 
        /* check if exception had been raised */
        if (MB.state == MB_STATE_RESPONSE_READY)
            break;
 
        MB_ADU_SET_UINT16(MB.ADU_length, register_value);
        MB.ADU_length += 2;
    }
}
#endif
Ответить

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