то есть вы тоже сторонник SPL?
года два назад когда я писал программы с использованием SPL мне постоянно говорили что это как то по детски и профессионалы всегда пишут в регистры напрямую без всяких прокладок :-)))
а на счет инициализации — у меня она вообще теперь выглядит как список, для мигалки так:
Настройка GPIOH PH2/3
@ ***************************************************************************
@ * Список конфигурации для мигалки *
@ ***************************************************************************
@ * для порта GPIOH выводов PH2, PH3 *
@ ***************************************************************************
.word 0x00000011 @ Bitband 1
.word PERIPH_BB_BASE+(RCC_BASE+RCC_AHB1ENR)*32+RCC_AHB1ENR_GPIOHEN_N*4
.word 0x00000003 @ value ORR (mask AND [adress])
.word PERIPH_BASE + GPIOH_BASE + GPIO_MODER
.word ~(GPIO_MODER_MODER3+GPIO_MODER_MODER2)
.word GPIO_MODER_MODER2_0 + GPIO_MODER_MODER3_0
@ — Дальше настроек нет!!! — @ значение для загрузки в RCC_PLLCFGR
.equ MOD_INIT_SYSCLK_168STD_PLLCFGR, MOD_INIT_SYSCLK_168STD_PLL_M|(MOD_INIT_SYSCLK_168STD_PLL_N<<6)+(((MOD_INIT_SYSCLK_168STD_PLL_P>>1)-1)<<16)+RCC_PLLCFGR_PLLSRC_HSE+(MOD_INIT_SYSCLK_168STD_PLL_Q<<24)
один раз написана, сохранена как модуль. При необходимости вызываю настройку с указанием адреса списка и все готово… сейчас все используемые иниты периферии перевожу в этот формат…
p.s. как в первом сообщении верно указал Dark purple: «это как гречневую кашу пинцетом по одному зёрнышку», и если есть правильно, то каша очень вкусная получается :-)
не знаю как у вас, но у меня дедлайн еще никогда не ускорял проект… скорее даже наоборот — необдуманные решения примененные из-за спешки способны убить проект впоследствии возникающими «родовыми» травмами…
На счет абстракции: на ассемблере вполне можно написать отдельные подпрограммы, с тем или иным функционалом, и потом объединить в каком то алгоритме… да на Си выходит проще, да на СИ проще писать переносимый код (хотя я не видел переносимого кода, кроме случаев когда он состоит из операторов самого языка СИ), проще работать в команде (возможно! но не факт), очень много сред с различными возможностями... — не хочу холивара, я пояснил свою позицию — я не зарабатываю денег написанием программ, и могу себе позволить разбираться с тем языком который мне нравиться (сегодня придумал способ простой инициализации микроконтроллера, в ближайшее время попробую написать). Если будут люди которым это интересно (именно для этого я здесь) — то с удовольствием объединю усилия (есть у меня пара задач которые нужно решить)… пока (судя по количеству комментариев ко второй части публикации — таковых нет :-(… так что буду «развлекать» вас только собственной персоной…
ну в общем то у каждого семейства процессоров свои команды, мне после Z80 с его LD по всем случаям ассемблер I8080 казался больно мудреным :-) потом ассемблер x86 — опять другие команды, потом AVR — и все более менее знакомо (уже как говориться все повидал, все попробовал) хотя конечно после первых трех уже особо не грузишься, просто запоминаешь новые мнемоники…
а вот ассемблер ARM — это что то действительно новое… на счет сложности — сложно пока не начинаешь разбираться… вообще по моему мнению некоторые вещи очень и очень правильны
На счет разных систем команд — все не так страшно, команды одни и те же, просто есть их 32ух битное и 16ти битное кодирование… в принципе по началу об этом можно не задумываться, при желании потом можно провести оптимизацию кода…
но поскольку у меня это занятие хобби и ничего более (по крайней мере пока) — поэтому пишу и на ассемблере…
с ассемблером я с 1993 года, и честно говоря ни на что его менять не хочу, тем более что ассемблер ARM мне очень нравиться набором инструкций
еще раз повторюсь — у меня не стоит дедлайнов по срокам, не нужно работать в команде, и т.д.
он показывает информацию по секциям…
в этой публикации цель простота и понятность (до сложного дойдем еще), а так вы правы, например, может быть такая «конструкция»:
кстати, в комментариях правильно написали: программа не из одной инструкции, а из 1024 ! :-) так как первая инструкция включает/выключает светодиод, а остальные служат для организации задержки :-)))
нет, к сожалению в Си я слабак :-(
а вот в асме всегда любил «по извращаться», а сколько исходников было потеряно (у меня тут винда-10 «обновила» комп до состояния нового..:-( а архивы как раз на компьютер сбросил чтобы отсортировать...)
какой размер получился? (по файлу binary)
у меня оптимизированная мигалка одним светодиодом заняла 68 байт (та что во второй части статьи, написана «в лоб» для понимания, имеет размер — 116 байт)
в виде ссылки на яндекс.диск подойдет? там не просто обновлять придется — у меня плата отладочная не stm32f4 discovery — так что без желания и активных действий мигать «из коробки» ничего не будет.
p.s. вторая статья уже написана и лежит в черновиках, но еще не вычитал :-( обычно когда печатаю допускаю много оЧеПяток, стыдно такое выкладывать… постараюсь завтра разместить, а там уж как модерацию пройдет (эта статья висела 5 дней на модерации в песочницу, я ее потихоньку правил пока админы собирались смотреть)
Управляющий Закрытыми паевыми фондами недвижимости в Управляющей компании (это из области доверительного управления имуществом)…
В провинции программисты не нужны (нужны только настройщики 1С, администраторы (да и то это все крупные компании админят из Москвы/Питера, удел местных «администраторов» обеспечить канал для настройки), установщики Windows, «сниматели» банеров — и все это вряд ли способно дать более менее заметный доход… ну или дает конечно доход, но единицам и пробиться в эти «круги» не так просто и к сожалению собственный профессионализм при этом роли не играет)
К слову, что мне пока не очень удобно в документации ST — так это очень большая фрагментированность документации… не всегда понятно где же все таки будет написано искомое :-) потом, когда найдешь, вроде бы начинаешь логику понимать, но вот с «нуля» — очень не удобно искать иголку в стоге сена…
Про таблицу прерываний в курсе, первая программа в статье — это просто проверка возможности написания и компиляции…
Полностью с Вами согласен ! именно пинцетом, и именно по одному зернышку!!!
Я любитель, и написание программ на ассемблере это мое хобби (на жизнь зарабатываю совершенно другим, к программированию, компьютерам, микроконтроллерам отношения не имеющем) Мне очень нравиться ассемблер, тем более с системой команд ARM!
года два назад когда я писал программы с использованием SPL мне постоянно говорили что это как то по детски и профессионалы всегда пишут в регистры напрямую без всяких прокладок :-)))
а на счет инициализации — у меня она вообще теперь выглядит как список, для мигалки так:
@ * Список конфигурации для мигалки *
@ ***************************************************************************
@ * для порта GPIOH выводов PH2, PH3 *
@ ***************************************************************************
.word 0x00000011 @ Bitband 1
.word PERIPH_BB_BASE+(RCC_BASE+RCC_AHB1ENR)*32+RCC_AHB1ENR_GPIOHEN_N*4
.word 0x00000003 @ value ORR (mask AND [adress])
.word PERIPH_BASE + GPIOH_BASE + GPIO_MODER
.word ~(GPIO_MODER_MODER3+GPIO_MODER_MODER2)
.word GPIO_MODER_MODER2_0 + GPIO_MODER_MODER3_0
.word 0x000000FF @ конфигурация завершенa
а например для настройки тактирования так:
@ * Список конфигурации SYSCLK 168 MHz Standard *
@ ***************************************************************************
@ * Конфигурация HSE ( 8Мгц) + PLL, со стандартными значениями множителей *
@ ***************************************************************************
@ * НАСТРОЙКИ *
@ * — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - — - *
@ * значения делителей и множителей *
@ * *
@ * PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N *
.equ MOD_INIT_SYSCLK_168STD_PLL_M, 8
.equ MOD_INIT_SYSCLK_168STD_PLL_N, 336
@ * Частота тактирования процессора (AHB), документированная 168 мгц *
@ * SYSCLK = PLL_VCO / PLL_P *
@
.equ MOD_INIT_SYSCLK_168STD_PLL_P, 2
@ * Такт для USB (должен быть 48 мгц для нормальной работы) *
@ * USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ *
@
.equ MOD_INIT_SYSCLK_168STD_PLL_Q, 7
@ ***************************************************************************
@ — Дальше настроек нет!!! — @ значение для загрузки в RCC_PLLCFGR
.equ MOD_INIT_SYSCLK_168STD_PLLCFGR, MOD_INIT_SYSCLK_168STD_PLL_M|(MOD_INIT_SYSCLK_168STD_PLL_N<<6)+(((MOD_INIT_SYSCLK_168STD_PLL_P>>1)-1)<<16)+RCC_PLLCFGR_PLLSRC_HSE+(MOD_INIT_SYSCLK_168STD_PLL_Q<<24)
@ включение HSE
.word 0x00000011 @ Bitband 1
.word PERIPH_BB_BASE+(RCC_BASE+RCC_CR)*0x20+RCC_CR_HSEON_N*4
@ ожидаем стабилизации частоты кварца
.word 0x00000021 @ Wait Bitband 1
.word PERIPH_BB_BASE+(RCC_BASE+RCC_CR)*0x20+RCC_CR_HSERDY_N*4
@ включаем Power control
.word 0x00000011 @ Bitband 1
.word PERIPH_BB_BASE+(RCC_BASE+RCC_APB1ENR)*0x20+RCC_APB1ENR_PWREN_N*4
@ выходим из режима энергосбережения
.word 0x00000011 @ Bitband 1
.word PERIPH_BB_BASE+(PWR_BASE + PWR_CR)*0x20+PWR_CR_VOS_N*4
@ Установим делитель шины APB2
.word 0x00000011 @ Bitband 1
.word PERIPH_BB_BASE+(RCC_BASE+RCC_CFGR)*0x20+RCC_CFGR_PPRE2_DIV2_N*4
@ Установим делитель шины APB1
.word 0x00000002 @ str value, ORR [adress]
.word PERIPH_BASE+RCC_BASE+RCC_CFGR
.word RCC_CFGR_PPRE1_DIV4
@ Установка коэффициентов PLL
.word 0x00000001 @ str value, [adress]
.word PERIPH_BASE+RCC_BASE+RCC_PLLCFGR
.word MOD_INIT_SYSCLK_168STD_PLLCFGR
@ Включаем PLL
.word 0x00000011 @ Bitband 1
.word PERIPH_BB_BASE+(RCC_BASE+RCC_CR)*0x20+RCC_CR_PLLON_N*4
@ Ожидаем готовности PLL
.word 0x00000021 @ Wait Bitband 1
.word PERIPH_BB_BASE+(RCC_BASE+RCC_CR)*0x20+RCC_CR_PLLRDY_N*4
@ Настройки конвейера
.word 0x00000001 @ str value, [adress]
.word PERIPH_BASE + FLASH_R_BASE + FLASH_ACR
.word FLASH_ACR_ICEN + FLASH_ACR_DCEN + FLASH_ACR_LATENCY_5WS + FLASH_ACR_PRFTEN
@ Выбираем PLL источником тактирования
.word 0x00000003 @ str value, ( ORR ( MASK[adress] ) )
.word PERIPH_BASE+RCC_BASE+RCC_CFGR
.word ~(RCC_CFGR_SW)
.word RCC_CFGR_SW_PLL
@ Ожидаем переключения на PLL
.word 0x00000021 @ Wait Bitband 1
.word PERIPH_BB_BASE+(RCC_BASE+RCC_CFGR)*0x20+RCC_CFGR_SWS_PLL_N*4
.word 0x000000FF @ выход
один раз написана, сохранена как модуль. При необходимости вызываю настройку с указанием адреса списка и все готово… сейчас все используемые иниты периферии перевожу в этот формат…
p.s. как в первом сообщении верно указал Dark purple: «это как гречневую кашу пинцетом по одному зёрнышку», и если есть правильно, то каша очень вкусная получается :-)
не подскажите ссылку?
на счет ассемблера ARM — мне трудно судить почему у вас о нем такое мнение… :-(
не знаю как у вас, но у меня дедлайн еще никогда не ускорял проект… скорее даже наоборот — необдуманные решения примененные из-за спешки способны убить проект впоследствии возникающими «родовыми» травмами…— не хочу холивара, я пояснил свою позицию — я не зарабатываю денег написанием программ, и могу себе позволить разбираться с тем языком который мне нравиться (сегодня придумал способ простой инициализации микроконтроллера, в ближайшее время попробую написать). Если будут люди которым это интересно (именно для этого я здесь) — то с удовольствием объединю усилия (есть у меня пара задач которые нужно решить)… пока (судя по количеству комментариев ко второй части публикации — таковых нет :-(… так что буду «развлекать» вас только собственной персоной…На счет абстракции: на ассемблере вполне можно написать отдельные подпрограммы, с тем или иным функционалом, и потом объединить в каком то алгоритме… да на Си выходит проще, да на СИ проще писать переносимый код (хотя я не видел переносимого кода, кроме случаев когда он состоит из операторов самого языка СИ), проще работать в команде (возможно! но не факт), очень много сред с различными возможностями...
ну в общем то у каждого семейства процессоров свои команды, мне после Z80 с его LD по всем случаям ассемблер I8080 казался больно мудреным :-) потом ассемблер x86 — опять другие команды, потом AVR — и все более менее знакомо (уже как говориться все повидал, все попробовал) хотя конечно после первых трех уже особо не грузишься, просто запоминаешь новые мнемоники…
а вот ассемблер ARM — это что то действительно новое… на счет сложности — сложно пока не начинаешь разбираться… вообще по моему мнению некоторые вещи очень и очень правильны
На счет разных систем команд — все не так страшно, команды одни и те же, просто есть их 32ух битное и 16ти битное кодирование… в принципе по началу об этом можно не задумываться, при желании потом можно провести оптимизацию кода…
но поскольку у меня это занятие хобби и ничего более (по крайней мере пока) — поэтому пишу и на ассемблере…
с ассемблером я с 1993 года, и честно говоря ни на что его менять не хочу, тем более что ассемблер ARM мне очень нравиться набором инструкций
еще раз повторюсь — у меня не стоит дедлайнов по срокам, не нужно работать в команде, и т.д.
в этой публикации цель простота и понятность (до сложного дойдем еще), а так вы правы, например, может быть такая «конструкция»:
но речь все таки о программе…
а вот в асме всегда любил «по извращаться», а сколько исходников было потеряно (у меня тут винда-10 «обновила» комп до состояния нового..:-( а архивы как раз на компьютер сбросил чтобы отсортировать...)
у меня оптимизированная мигалка одним светодиодом заняла 68 байт (та что во второй части статьи, написана «в лоб» для понимания, имеет размер — 116 байт)
p.s. вторая статья уже написана и лежит в черновиках, но еще не вычитал :-( обычно когда печатаю допускаю много оЧеПяток, стыдно такое выкладывать… постараюсь завтра разместить, а там уж как модерацию пройдет (эта статья висела 5 дней на модерации в песочницу, я ее потихоньку правил пока админы собирались смотреть)
В провинции программисты не нужны (нужны только настройщики 1С, администраторы (да и то это все крупные компании админят из Москвы/Питера, удел местных «администраторов» обеспечить канал для настройки), установщики Windows, «сниматели» банеров — и все это вряд ли способно дать более менее заметный доход… ну или дает конечно доход, но единицам и пробиться в эти «круги» не так просто и к сожалению собственный профессионализм при этом роли не играет)
К слову, что мне пока не очень удобно в документации ST — так это очень большая фрагментированность документации… не всегда понятно где же все таки будет написано искомое :-) потом, когда найдешь, вроде бы начинаешь логику понимать, но вот с «нуля» — очень не удобно искать иголку в стоге сена…
Про таблицу прерываний в курсе, первая программа в статье — это просто проверка возможности написания и компиляции…
Я любитель, и написание программ на ассемблере это мое хобби (на жизнь зарабатываю совершенно другим, к программированию, компьютерам, микроконтроллерам отношения не имеющем) Мне очень нравиться ассемблер, тем более с системой команд ARM!