Страница 243 из 446
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 07:06:11
VladislavS
Ещё один.

Боишься биты попортить - напиши так
Код: Выделить всё
RCC->PLLCKSELR = (RCC->PLLCKSELR & ~RCC_PLLCKSELR_DVMI1_MASK) | RCC_PLLCKSELR_DIVM1_2;
Потому что запись промежуточного состояния с занулеными битами в общем случае может дать побочный эффект.
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 07:17:24
WiseLord
И в чём принципиальное отличие от моего варианта, кроме того, что здесь это в виде одной длинной строки?
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 07:32:04
dosikus
[uquote="a5021",url="/forum/viewtopic.php?p=3491273#p3491273"]Занесение значения в регистр RCC_PLLCKSELR зачем-то разбито аж на шесть шагов. Никто не в курсе, зачем все это и почему нельзя было написать просто
?[/uquote]
Тяжелое наследие 8ми биток.
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 08:53:37
AlDr70
Ребята, скажите такой вопрос. В РМ на 103 контроллер есть таблица электрических параметров. Что такое инжектированный ток injected current?
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 09:07:15
a5021
[uquote="WiseLord",url="/forum/viewtopic.php?p=3491563#p3491563"]И в чём принципиальное отличие от моего варианта, кроме того, что здесь это в виде одной длинной строки?[/uquote]
Код, который варит компилятор, между тем, получается разный. В первом случае:
Код: Выделить всё
86 RCC->PLLCKSELR &= ~(RCC_PLLCKSELR_DIVM1);
\ 0x6 0x.... LDR.N R0,??DataTable1 ;; 0x58024428
\ 0x8 0x6801 LDR R1,[R0, #+0]
\ 0xA 0xF421 0x717C BIC R1,R1,#0x3F0
\ 0xE 0x6001 STR R1,[R0, #+0]
87 RCC->PLLCKSELR |= RCC_PLLCKSELR_DIVM1_2;
\ 0x10 0x6802 LDR R2,[R0, #+0]
\ 0x12 0xF042 0x0240 ORR R2,R2,#0x40
\ 0x16 0x6002 STR R2,[R0, #+0]
88
и во втором:
Код: Выделить всё
86 RCC->PLLCKSELR = (RCC->PLLCKSELR & ~(RCC_PLLCKSELR_DIVM1)) | RCC_PLLCKSELR_DIVM1_2;
\ 0x6 0x.... LDR.N R0,??DataTable1 ;; 0x58024428
\ 0x8 0x6801 LDR R1,[R0, #+0]
\ 0xA 0xF421 0x717C BIC R1,R1,#0x3F0
\ 0xE 0xF041 0x0140 ORR R1,R1,#0x40
\ 0x12 0x6001 STR R1,[R0, #+0]
Разница, безусловно, не принципиальна, но смысла писать громоздким образом тоже никакого.
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 09:26:02
VladislavS
[uquote="WiseLord",url="/forum/viewtopic.php?p=3491563#p3491563"]И в чём принципиальное отличие от моего варианта, кроме того, что здесь это в виде одной длинной строки?[/uquote]Вы правда не видите разницу между "=" и последовательными "&=" и "|=" ?
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 09:32:45
WiseLord
Принципиальной - не вижу. Это не критичный к скорости участок кода, выполняется только один раз. Ну, будет read-modify-write дважды выполнен, а не один раз.. что с того? Читабельность кода зато отличается.
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 09:36:55
VladislavS
[uquote="AlDr70",url="/forum/viewtopic.php?p=3491661#p3491661"]Ребята, скажите такой вопрос. В РМ на 103 контроллер есть таблица электрических параметров. Что такое инжектированный ток injected current?[/uquote]
Входящий ток. Например, если ты светодиод анодом на плюс, а катодом на ножку контроллера. Подал "0" и можешь 5 мА на землю брякнуть.
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 10:17:11
a5021
[uquote="WiseLord",url="/forum/viewtopic.php?p=3491692#p3491692"]Принципиальной - не вижу. Это не критичный к скорости участок кода, выполняется только один раз. Ну, будет read-modify-write дважды выполнен, а не один раз.. что с того? Читабельность кода зато отличается.[/uquote]
По мне, так наиболее читабельной будет вот такая запись:
Спойлер
Код: Выделить всё
86 RCC->PLLCKSELR = (
87 0 * RCC_PLLCKSELR_PLLSRC_HSI |
88 0 * RCC_PLLCKSELR_PLLSRC_CSI |
89 1 * RCC_PLLCKSELR_PLLSRC_HSE |
90
91 0 * RCC_PLLCKSELR_DIVM1_0 |
92 0 * RCC_PLLCKSELR_DIVM1_1 |
93 1 * RCC_PLLCKSELR_DIVM1_2 |
94 0 * RCC_PLLCKSELR_DIVM1_3 |
95 0 * RCC_PLLCKSELR_DIVM1_4 |
96 0 * RCC_PLLCKSELR_DIVM1_5 |
97
98 0 * RCC_PLLCKSELR_DIVM2_0 |
99 0 * RCC_PLLCKSELR_DIVM2_1 |
100 0 * RCC_PLLCKSELR_DIVM2_2 |
101 0 * RCC_PLLCKSELR_DIVM2_3 |
102 0 * RCC_PLLCKSELR_DIVM2_4 |
103 1 * RCC_PLLCKSELR_DIVM2_5 |
104
105 0 * RCC_PLLCKSELR_DIVM3_0 |
106 0 * RCC_PLLCKSELR_DIVM3_1 |
107 0 * RCC_PLLCKSELR_DIVM3_2 |
108 0 * RCC_PLLCKSELR_DIVM3_3 |
109 0 * RCC_PLLCKSELR_DIVM3_4 |
110 1 * RCC_PLLCKSELR_DIVM3_5
111 );
\ 0x6 0x.... LDR.N R0,??DataTable1 ;; 0x2020042
\ 0x8 0x.... LDR.N R1,??DataTable1_1 ;; 0x58024428
\ 0xA 0x6008 STR R0,[R1, #+0]
112
она же дает самый быстрый и компактный код. Только мой изначальный вопрос так и остается без ответа -- нафига ж сложно и громоздко, если можно просто и компактно?
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 10:39:42
VladislavS
А я бы вот так написал
Код: Выделить всё
RCC->PLLCKSELR = RCC_PLLCKSELR_PLLSRC_HSE | _VAL2FLD(RCC_PLLCKSELR_DIVM1,4) | _VAL2FLD(RCC_PLLCKSELR_DIVM2,32) | _VAL2FLD(RCC_PLLCKSELR_DIVM3,32);
а ещё лучше вообще определить _RCC_PLLCKSELR_DIVM1() и вот так
Код: Выделить всё
RCC->PLLCKSELR = RCC_PLLCKSELR_PLLSRC_HSE | _RCC_PLLCKSELR_DIVM1(4) | _RCC_PLLCKSELR_DIVM2(32) | _RCC_PLLCKSELR_DIVM3(32);
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 10:53:14
a5021
Магические числа, однако.
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 11:01:51
VladislavS
Это не магические числа, а реальные коэффициенты деления. Можно подумать, задавая поразрядно эти магические числа ты много меняешь. В случае, если это не реальные коэффициенты, а магические числа, то конечно надо их задефайнить в реальные.
Вот, например, от 411-го.
Код: Выделить всё
RCC->PLLCFGR = _RCC_PLLCFGR_PLLQ(4) | RCC_PLLCFGR_PLLSRC_HSE | RCC_PLLCFGR_PLLP_div2 | _RCC_PLLCFGR_PLLN(96) | _RCC_PLLCFGR_PLLM(4);
Никакие это не магические числа, а Q=4, N=96 и M=4. Куда уж понятней? Нафига их поразрядно задавать?
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 11:10:39
viiv
[uquote="VladislavS",url="/forum/viewtopic.php?p=3491695#p3491695"]Входящий ток. Например, если ты светодиод анодом на плюс, а катодом на ножку контроллера. Подал "0" и можешь 5 мА на землю брякнуть.[/uquote]
То, что ты описал, это называется "Output Current Sink"
Спойлер

"injection current" возникает когда ножка оказывается под потенциалом выше питания (или ниже земли)
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 11:20:13
VladislavS
Согласен, проще это сформулировать как ток через защитный диод.
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 12:17:31
a5021
[uquote="VladislavS",url="/forum/viewtopic.php?p=3491764#p3491764"]Это не магические числа, а реальные коэффициенты деления. Можно подумать, задавая поразрядно эти магические числа ты много меняешь.[/uquote]
Неинформативность волшебных чисел -- только часть проблемы. Другая -- это неустойчивость к дефектам ввода (набора). Вместо 96 можно опечататься и ввести 95. Компилятор это проглотит молча, а в глаза такие опечатки не очень бросаются.
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 12:21:45
Reflector
[uquote="VladislavS",url="/forum/viewtopic.php?p=3491764#p3491764"]
Код: Выделить всё
RCC->PLLCFGR = _RCC_PLLCFGR_PLLQ(4) | RCC_PLLCFGR_PLLSRC_HSE | RCC_PLLCFGR_PLLP_div2 | _RCC_PLLCFGR_PLLN(96) | _RCC_PLLCFGR_PLLM(4);
Никакие это не магические числа, а Q=4, N=96 и M=4. Куда уж понятней? Нафига их поразрядно задавать?[/uquote]
Итого у нас есть Q, N, M, P и частота кварца на основе которых нужно получить пару частот. Думаю многие над такой задачкой зависнут минут на 10 и при этом не будут уверены, что подобрали коэффициенты правильно

Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 13:10:01
VladislavS
[uquote="a5021",url="/forum/viewtopic.php?p=3491825#p3491825"]Вместо 96 можно опечататься и ввести 95.[/uquote]С дуру и хрен сломать можно. Можно подумать вместо 0 нельзя 1 поставить в твоих битах. Ошибиться в 5 местах (битах) легче чем в одном!
[uquote="Reflector",url="/forum/viewtopic.php?p=3491827#p3491827"]Думаю многие над такой задачкой зависнут минут на 10 и при этом не будут уверены, что подобрали коэффициенты правильно

[/uquote]Я вполне уверен в своих силах и способности просчитать вручную, но всё равно пользуюсь интерактивными тулзами для этого.
- cl.jpg
- (57.43 КБ) 444 скачивания
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 13:20:01
a5021
[uquote="VladislavS",url="/forum/viewtopic.php?p=3491850#p3491850"]С дуру и хрен сломать можно.[/uquote]
Хорошо бы еще и вы это себе отчетливо представляли.
Можно подумать вместо 0 нельзя 1 поставить в твоих битах. Ошибиться в 5 местах (битах) легче чем в одном!
Ошибиться, но не опечататься. А в вашей записи и ошибиться и опечататься.
Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 13:44:24
Reflector
[uquote="VladislavS",url="/forum/viewtopic.php?p=3491850#p3491850"]Я вполне уверен в своих силах и способности просчитать вручную, но всё равно пользуюсь интерактивными тулзами для этого.
cl.jpg
[/uquote]
Я же тебе показывал функцию вызов которой выглядит следующим образом:
которая еще и частоту USB задает с наименьшей погрешностью и компилируется это все в 3 инструкции. Вместо нее у тебя 3 макроса которыми можно задать 3 константы, но т.к. все равно не очевидно какие частоты получаются после их комбинации, то нужно еще их же прописать в кубе... Это точно проще?

Re: STM32 новичку в ARM что к чему
Добавлено: Пт окт 26, 2018 13:45:22
VladislavS
[uquote="a5021",url="/forum/viewtopic.php?p=3491854#p3491854"]А в вашей записи и ошибиться и опечататься.[/uquote]
[uquote="Reflector",url="/forum/viewtopic.php?p=3491878#p3491878"]Я же тебе показывал функцию вызов которой выглядит следующим образом:
[/uquote]Это всё замечательно, если у тебя есть время на каждый чих функцию писать. На это надо далеко не 10 минут. А где в этой функции учтено, что выходов у PLL несколько? Мне частоту pll для этого проца надо один раз в жизни задать. Как раз 10 мин почитать RM, потыкать в кубе и перенести в код.
[uquote="Reflector",url="/forum/viewtopic.php?p=3491878#p3491878"]Вместо нее у тебя 3 макроса которыми можно задать 3 константы[/uquote]Макрос стандартный CMSIS-овский.
[uquote="Reflector",url="/forum/viewtopic.php?p=3491878#p3491878"]но т.к. все равно не очевидно какие частоты получаются после их комбинации, то нужно еще их же прописать в кубе... Это точно проще?

[/uquote]Ты путаешь последовательность. Сначала в кубе ставишь нужную частоту, он сам расставляет все делители. Тут же видишь точные частоты всех узлов и если они тебя устраивают - переносишь в код. И никак не наоборот.
[uquote="Reflector",url="/forum/viewtopic.php?p=3491878#p3491878"]которая еще и частоту USB задает с наименьшей погрешностью[/uquote]А вот как, кстати, ты определяешь что погрешность достаточная? Вот поставил я на PLL и проц 100 МГц. Твоя функция честно 50 МГц на USB поставила и что дальше?
[uquote="Reflector",url="/forum/viewtopic.php?p=3491878#p3491878"]и компилируется это все в 3 инструкции.[/uquote]У меня скомпилируется в две, потому что предыдущей командой я включал HSE и адрес RCC уже лежит в регистре
