Так меня и интересовало, как найти на родном сайте. Что спросить у ST-шного поисковика, чтобы сразу получить ссылку на нужный материал, а не 2 с лишним тысячи ссылок на 163 страницах, среди которых нужный материал точно есть, только найди его...oleg110592 писал(а):а родном сайте, например UM1725 User Manual Description of STM32F4 HAL and LL drivers
STM32 новичку в ARM что к чему
- afz
- Опытный кот
- Сообщения: 744
- Зарегистрирован: Сб дек 22, 2012 08:17:42
- Откуда: Караганда, Казахстан
Re: STM32 новичку в ARM что к чему
Последний раз редактировалось afz Ср авг 22, 2018 16:44:40, всего редактировалось 1 раз.
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
- Реклама
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: STM32 новичку в ARM что к чему
[uquote="afz",url="/forum/viewtopic.php?p=3441680#p3441680"]Так меня и интересовало, как найти на родном сайте. Что спросить у ST-шного поисковика, чтобы сразу получить ссылку на нужный материал, а не на 2 с лишним тысячи ссылок на 163 страницах, среди которых нужный материал точно есть, только найди его...[/uquote]
Надо сделать куб для документации
Надо сделать куб для документации
Re: STM32 новичку в ARM что к чему
Ну начнем с того, что то что озвучивают как документация на калокуб, хрень собачья сгенерированная доксигеном.
Re: STM32 новичку в ARM что к чему
[uquote="dosikus",url="/forum/viewtopic.php?p=3441611#p3441611"]может все -таки на F1?[/uquote]неа.
[uquote="dosikus",url="/forum/viewtopic.php?p=3441611#p3441611"]А " грабли" были единственные - к CRC_DR надо обращаться как к байту...[/uquote]да если бы)

БОльшая часть документации на разнообразные библиотеки примерно так и выглядит. Это ж не RM или даташит.
[uquote="dosikus",url="/forum/viewtopic.php?p=3441611#p3441611"]А " грабли" были единственные - к CRC_DR надо обращаться как к байту...[/uquote]да если бы)
обыкновенный справочникdosikus писал(а):то что озвучивают как документация на калокуб, хрень собачья сгенерированная доксигеном
- Реклама
Re: STM32 новичку в ARM что к чему
https://github.com/speedcontrols/ac_sc_ ... librator.h
Как можно покрасивее записать бизнес-логику? В процессе калибровки надо проделать линейную последовательность действий. Местами иногда бывают циклы, но без фанатизма. Снаружи это все дергается через метод ".tick()", а дальше "крутись как хочешь".
Не нравится мне как выглядит код. Ни когда это был единый switch, ни после разбивки на мелкие функции. Суть простого алгоритма тонет в особенностях реализации. Что можно придумать, чтобы улучшить читаемость?
PS. Тащить ради этого RTOS как-то не хочется.
Как можно покрасивее записать бизнес-логику? В процессе калибровки надо проделать линейную последовательность действий. Местами иногда бывают циклы, но без фанатизма. Снаружи это все дергается через метод ".tick()", а дальше "крутись как хочешь".
Не нравится мне как выглядит код. Ни когда это был единый switch, ни после разбивки на мелкие функции. Суть простого алгоритма тонет в особенностях реализации. Что можно придумать, чтобы улучшить читаемость?
PS. Тащить ради этого RTOS как-то не хочется.
- Ярослав555
- Поставщик валерьянки для Кота
- Сообщения: 2081
- Зарегистрирован: Пт май 31, 2013 17:14:38
- Откуда: Украина, Винница
Re: STM32 новичку в ARM что к чему
Автомат конечных состояний. Уже все придумано. ИМХО без свичей нормального ничего не получится, пройденный этап.
Есть еще такой интересный высокоуровневый "язык программирования" как SFC - использует методику описания состояния машины и условия переходов от состояния к состоянию.
Есть еще такой интересный высокоуровневый "язык программирования" как SFC - использует методику описания состояния машины и условия переходов от состояния к состоянию.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18546
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
мне остался не понятным способ вызова .tick() - что ли вызывается чаще, чем успеет отработать весь алгоритм калибровки, из таймера? ну так я бы ввел флаг, и, пока он стоит, из tick() сразу бы выходил, что дало бы возможность спокойно работать сколько надо логике, не взирая на попытки повторного входа...
ну, то есть, в калибровке поставил флаг, откалибровал и сбросил флаг...
ну, то есть, в калибровке поставил флаг, откалибровал и сбросил флаг...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: STM32 новичку в ARM что к чему
Я в курсе что такое FSM. Вопрос именно по красивой записи - как сделать чтобы читалась именно суть (бизнес-логика), а не особенности языка.
Например на жабаскрипте/питоне через async/await получается очень приятно - ничего лишнее не отвлекает, когда код читаешь.
Например на жабаскрипте/питоне через async/await получается очень приятно - ничего лишнее не отвлекает, когда код читаешь.
Re: STM32 новичку в ARM что к чему
Pvit, не нужно делать все методы встроенными, они неявно инлайнятся, а некоторые из них на целый экран и вызываются в разных местах. И поубирай void у ничего не принимающих методов, половина пишущих на С++ в эмбедде страдает подобным, еще typedef любят везде добавлять, сразу видно, что не так давно на чистом С писали 
Re: STM32 новичку в ARM что к чему
О каких именно встроенных методах речь? Можно ссылку на строчку кода?
Я вообще не писатель на сях/плюсах. Это временная мера, пока rust не допилят
. Поэтому сейчас проработана архитектура, чтобы модули были хорошо изолированы и связный код не лез. А то что конкретно на С/C++ это сранновато выглядит - не велика печаль. Мусорное ведро через пол года справится
.
Я вообще не писатель на сях/плюсах. Это временная мера, пока rust не допилят
Re: STM32 новичку в ARM что к чему
[uquote="pvit",url="/forum/viewtopic.php?p=3442169#p3442169"]О каких именно встроенных методах речь? Можно ссылку на строчку кода?[/uquote]
Это встроенный инлайнящийся метод, по крайней мере если включена оптимизация, с -O0 инлайн для всего отключен.
А это нет, для больших функций компилятор наверняка подставит вызовы функции, если их больше одного:

Это встроенный инлайнящийся метод, по крайней мере если включена оптимизация, с -O0 инлайн для всего отключен.
Код: Выделить всё
class TriacDriver
{
void tick() {.... }
}Код: Выделить всё
class TriacDriver
{
void tick();
}
void TriacDriver::tick()
{
}
Можно ждать очень долго и все равно С++ будут допиливать быстрееЯ вообще не писатель на сях/плюсах. Это временная мера, пока rust не допилят.
Re: STM32 новичку в ARM что к чему
Спасибо за пояснения. Честно говоря, я писал тело функций "по месту объявления" просто потому что так читать проще - не надо постоянно скролиться или мотаться между файлами.
[uquote="Reflector",url="/forum/viewtopic.php?p=3442182#p3442182"]Можно ждать очень долго и все равно С++ будут допиливать быстрее
[/uquote]
Флаг в руки допильщикам
. Я вполне нейтрален к синтаксису плюсов, но там до сих пор нет стандартного пакетного менеджера. IMHO именно из-за этого в коде эмбедов до сих пор творится ад.
Вроде в последних плюсовых спеках запланировали хедеры выпилить. Это очень правильно, но отсутствия пакетного менеджера не компенсирует.
[uquote="Reflector",url="/forum/viewtopic.php?p=3442182#p3442182"]Можно ждать очень долго и все равно С++ будут допиливать быстрее
Флаг в руки допильщикам
Вроде в последних плюсовых спеках запланировали хедеры выпилить. Это очень правильно, но отсутствия пакетного менеджера не компенсирует.
Re: STM32 новичку в ARM что к чему
Можно и без 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;
}
}
Иван Сусанин - первый полупроводник 
Re: STM32 новичку в ARM что к чему
[uquote="pvit",url="/forum/viewtopic.php?p=3442154#p3442154"]как сделать чтобы читалась именно суть (бизнес-логика), а не особенности языка[/uquote]
можно попытаться это сделать чисто стилистическими путями. Например, не стесняться давать любым объектам длинные имена, непосредственно из которых понятно, чего это такое. Вот knob - крутилка, dial - циферблат, а что означают их значения? Из UP_CHECK видно, что это - состояние и где в линейной последовательности это состояние должно быть?
ну и по вертикали более наглядно группировать логически связанные действия. Традиционное "фигурные скобки на новой строке" мешает.
можно попытаться это сделать чисто стилистическими путями. Например, не стесняться давать любым объектам длинные имена, непосредственно из которых понятно, чего это такое. Вот knob - крутилка, dial - циферблат, а что означают их значения? Из UP_CHECK видно, что это - состояние и где в линейной последовательности это состояние должно быть?
ну и по вертикали более наглядно группировать логически связанные действия. Традиционное "фигурные скобки на новой строке" мешает.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: STM32 новичку в ARM что к чему
[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)Скачиваем нужное
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 что к чему
По поводу RN42 и UART:
В общем все дело было в задержках.
1) Между командами нужно подавать около 10мс. При 5 мс настройки модуля не устанавливаются.
2) Сброс до заводских настроек надо делать отдельно, после него надо перезагружать модуль и ждать около 2с, прежде чем снова входить в режим команд и устанавливать другие настройки. При задержке 1 с, у меня остальные настройки не устанавливались. Хотя при конфигурации модуля через компьютер (через UART или bluetooth) все вроде как устанавливалось нормально.
3)Дефолтные установки немного не соответствовали документации. После сброса устанавливался профиль APL, а не SPP. Кроме того, подключения на выводе GPIO5 почему-то частота сигнала 2 Гц, что тоже не соответствует документации. В таком состоянии должен быть 1 Гц, но все работает. На модуле написано RN42-I/RM, никакой доп маркировки нет.
В общем все дело было в задержках.
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);
}Я конечно все понимаю, но этого я не понимаю.
Re: STM32 новичку в ARM что к чему
Можно команды в одну кучу сгрести
Код: Выделить всё
#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]));
Иван Сусанин - первый полупроводник 
Re: STM32 новичку в ARM что к чему
[uquote="arkhnchul",url="/forum/viewtopic.php?p=3442253#p3442253"]можно попытаться это сделать чисто стилистическими путями.[/uquote]
Вытащил проверялку дерганья ручкой во вложенный FSM (все равно вложенные еще понадобятся, для различных этапов калибровки) . Ну и названия подправил где мог.
https://github.com/speedcontrols/ac_sc_ ... librator.h
Вроде перестало взрывать мозг так сильно как раньше.
Вытащил проверялку дерганья ручкой во вложенный FSM (все равно вложенные еще понадобятся, для различных этапов калибровки) . Ну и названия подправил где мог.
https://github.com/speedcontrols/ac_sc_ ... librator.h
Вроде перестало взрывать мозг так сильно как раньше.
Re: STM32 новичку в ARM что к чему
я значениям энумов всегда добавляю общие префиксы, чтобы при их использовании было понятно, возможные значения чего именно они такое. Ну и к константам/дефайнам часто тоже.
Спойлер
Код: Выделить всё
#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

