Страница 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 зачем-то разбито аж на шесть шагов. Никто не в курсе, зачем все это и почему нельзя было написать просто

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

RCC -> PLLCKSELR =  RCC_PLLCKSELR_DIVM1_2;
?[/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]
Я же тебе показывал функцию вызов которой выглядит следующим образом:

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

initPll(PllSrc::Hse, 200);
которая еще и частоту USB задает с наименьшей погрешностью и компилируется это все в 3 инструкции. Вместо нее у тебя 3 макроса которыми можно задать 3 константы, но т.к. все равно не очевидно какие частоты получаются после их комбинации, то нужно еще их же прописать в кубе... Это точно проще? :)

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

Добавлено: Пт окт 26, 2018 13:45:22
VladislavS
[uquote="a5021",url="/forum/viewtopic.php?p=3491854#p3491854"]А в вашей записи и ошибиться и опечататься.[/uquote]
Изображение
ushi.jpg
(26.52 КБ) 755 скачиваний
[uquote="Reflector",url="/forum/viewtopic.php?p=3491878#p3491878"]Я же тебе показывал функцию вызов которой выглядит следующим образом:

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

initPll(PllSrc::Hse, 200);
[/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 уже лежит в регистре :)