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

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Ещё один.:) Боишься биты попортить - напиши так

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

 RCC->PLLCKSELR = (RCC->PLLCKSELR & ~RCC_PLLCKSELR_DVMI1_MASK) |  RCC_PLLCKSELR_DIVM1_2;  
Потому что запись промежуточного состояния с занулеными битами в общем случае может дать побочный эффект.
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

И в чём принципиальное отличие от моего варианта, кроме того, что здесь это в виде одной длинной строки?
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

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

Сообщение dosikus »

[uquote="a5021",url="/forum/viewtopic.php?p=3491273#p3491273"]Занесение значения в регистр RCC_PLLCKSELR зачем-то разбито аж на шесть шагов. Никто не в курсе, зачем все это и почему нельзя было написать просто

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

RCC -> PLLCKSELR =  RCC_PLLCKSELR_DIVM1_2;
?[/uquote]

Тяжелое наследие 8ми биток.
AlDr70
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Вс ноя 13, 2016 18:04:13

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

Сообщение AlDr70 »

Ребята, скажите такой вопрос. В РМ на 103 контроллер есть таблица электрических параметров. Что такое инжектированный ток injected current?
Вложения
вопрос.pdf
current haracteristics
(364.81 КБ) 249 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение 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]
Разница, безусловно, не принципиальна, но смысла писать громоздким образом тоже никакого.
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3491563#p3491563"]И в чём принципиальное отличие от моего варианта, кроме того, что здесь это в виде одной длинной строки?[/uquote]Вы правда не видите разницу между "=" и последовательными "&=" и "|=" ?
Реклама
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Принципиальной - не вижу. Это не критичный к скорости участок кода, выполняется только один раз. Ну, будет read-modify-write дважды выполнен, а не один раз.. что с того? Читабельность кода зато отличается.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="AlDr70",url="/forum/viewtopic.php?p=3491661#p3491661"]Ребята, скажите такой вопрос. В РМ на 103 контроллер есть таблица электрических параметров. Что такое инжектированный ток injected current?[/uquote]
Входящий ток. Например, если ты светодиод анодом на плюс, а катодом на ножку контроллера. Подал "0" и можешь 5 мА на землю брякнуть.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение 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          
она же дает самый быстрый и компактный код. Только мой изначальный вопрос так и остается без ответа -- нафига ж сложно и громоздко, если можно просто и компактно?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение 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);
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

Магические числа, однако.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение 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. Куда уж понятней? Нафига их поразрядно задавать?
Последний раз редактировалось VladislavS Пт окт 26, 2018 11:11:35, всего редактировалось 1 раз.
viiv
Грызет канифоль
Сообщения: 289
Зарегистрирован: Чт ноя 06, 2014 13:09:06

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

Сообщение viiv »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3491695#p3491695"]Входящий ток. Например, если ты светодиод анодом на плюс, а катодом на ножку контроллера. Подал "0" и можешь 5 мА на землю брякнуть.[/uquote]
То, что ты описал, это называется "Output Current Sink"
СпойлерИзображение
"injection current" возникает когда ножка оказывается под потенциалом выше питания (или ниже земли)
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Согласен, проще это сформулировать как ток через защитный диод.
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3491764#p3491764"]Это не магические числа, а реальные коэффициенты деления. Можно подумать, задавая поразрядно эти магические числа ты много меняешь.[/uquote]
Неинформативность волшебных чисел -- только часть проблемы. Другая -- это неустойчивость к дефектам ввода (набора). Вместо 96 можно опечататься и ввести 95. Компилятор это проглотит молча, а в глаза такие опечатки не очень бросаются.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение 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 и при этом не будут уверены, что подобрали коэффициенты правильно :)
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение 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 скачивания
a5021
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

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

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3491850#p3491850"]С дуру и хрен сломать можно.[/uquote]
Хорошо бы еще и вы это себе отчетливо представляли.
Можно подумать вместо 0 нельзя 1 поставить в твоих битах. Ошибиться в 5 местах (битах) легче чем в одном!
Ошибиться, но не опечататься. А в вашей записи и ошибиться и опечататься.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3491850#p3491850"]Я вполне уверен в своих силах и способности просчитать вручную, но всё равно пользуюсь интерактивными тулзами для этого.
cl.jpg
[/uquote]
Я же тебе показывал функцию вызов которой выглядит следующим образом:

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

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

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

Сообщение 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 уже лежит в регистре :)
Ответить

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