Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
1 / 1 / 0
Регистрация: 20.02.2019
Сообщений: 50

Зажечь светодиод используя bit banding

18.03.2022, 16:44. Показов 4879. Ответов 58
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, хочу обратиться за помощью. Изучаю Assembler на МК STM32F100RBT6 и пытаюсь зажечь светодиод используя bit banding. Вроде адреса рассчитал правильно, возможно в регистры что-то не так записал. Хочу зажечь светодиод подключенный к порту PA0. Подключение такое: порт PA1->резистор 100 оМ->светодиод->GND.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
     GET stm32f100RBT6.asm
Stack_Size      EQU     0x100                   
top_of_stack    EQU     0x20000000 + Stack_Size
XTAL_CLK    equ    8000
 
    PRESERVE8 
    THUMB 
        
    AREA RESET, DATA, READONLY
    
     DCD   top_of_stack  ;Top of Stack
     DCD   Start
        
     AREA  |.text|, CODE, READONLY 
         
     ENTRY 
 
Start    PROC 
    
    MOV R0, #0
    MOV R1, #1
    LDR     R2, =(PERIPH_BB_BASE + (RCC_APB2ENR - PERIPH_BASE) * 32 + RCC_APB2ENR_IOPCEN_N * 4)
    STR     R1, [R2]
    LDR     R2, =(PERIPH_BB_BASE + (GPIOA_CRL - PERIPH_BASE) * 32 + GPIO_CRL_MODE1_0_N * 4)
    STR     R1, [R2]
    ;LDR     R2, =(PERIPH_BB_BASE + (GPIOA_ODR - PERIPH_BASE) * 32 + GPIO_ODR_ODR1_N * 4)
    ;STR     R0, [R2]
loop
  B loop
    
    ENDP
    ALIGN
    END
Файл stm32f100RBT6.asm
Assembler
1
2
3
4
5
6
7
8
9
10
11
PERIPH_BB_BASE  EQU 0x42000000
PERIPH_BASE     EQU 0x40000000
 
RCC_APB2ENR     EQU 0x40021018
GPIOA_CRL       EQU 0x40010800
GPIOA_ODR       EQU 0x4001080C
 
RCC_APB2ENR_IOPCEN_N    EQU    2
GPIO_CRL_MODE1_0_N      EQU    4
GPIO_ODR_ODR1_N         EQU    1
  END
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.03.2022, 16:44
Ответы с готовыми решениями:

STM32L15x + DMA + Bit Banding
Случайно обнаружил, что для регистров DMA не работает bit bomding (для другой периферии вроде всё нормально). Почему это может быть? Может...

Atmel Studio, Proteus, atm16. Зажечь светодиод, используя Virtual Terminal
У менять есть atm16, Virtual Terminal и светодиод. Введя в консоль символ (в моём случае нужно число кратное 3), то светодиод загорается....

Программирование управления портами К1986ВЕ92 с использованием Bit Banding в Keil
УВАЖАЕМЫЕ УЧАСТНИКИ КОНФЕРЕНЦИИ! Возникли сложности при написании программы на Keil для микроконтроллера К1986BE92QI. Хочу помигать...

58
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,066
23.03.2022, 23:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ВитГо Посмотреть сообщение
опять вы сваливаетесь в какую то виртуальную полезность...
Потому что если реальная полезность меньше проблем, возникающих при использовании, то использовать и не надо. И вот этой полезности пока что-то не видно.
Цитата Сообщение от ВитГо Посмотреть сообщение
чем вас напрягает такое управление линиями дисплея в драйвере ?
Тем, что сложно их переназначать.
И более интересный вопрос: чем ваш способ лучше обычного BSRR?
Цитата Сообщение от ВитГо Посмотреть сообщение
вы хотите переписать на ЧМЗ ?!!
Что такое ЧМЗ?
Цитата Сообщение от ВитГо Посмотреть сообщение
да мне лень даже просто набирать будет
Не знаю как вам, а у меня этот код выглядел бы как
C
1
2
3
4
5
6
GPO_OFF( LCD_CS );
GPO_ON( LCD_CS );
GPO_OFF( LCD_DC );
GPO_ON( LCD_CS );
GPO_OFF( LCD_RST );
GPO_ON( LCD_RST );
При том, что букву порта, номер ножки и "включенное" состояние можно поменять в одном месте, а разворачивается каждый из этих макросов в работу с BSRR и тоже неплохо оптимизируется. Так что нет, мой вариант мне нравится больше.
Цитата Сообщение от ВитГо Посмотреть сообщение
кстати а я не с вами по среде ассемблера спорил года 2 назад ?
Не исключено. Я во многих срачах участвовал.
Цитата Сообщение от ВитГо Посмотреть сообщение
хоть я считал что подсветка это нифига не главное, но все таки в итоге это реализовал
Полезность подобного редактора для меня не очевидна, но если даже вы в процессе не получили ничего кроме опыта - это уже значит, что не зря занимались этим.
Цитата Сообщение от Rius Посмотреть сообщение
Вы и сами теперь знаете, похоже, зачем он нужен, но продолжаете спорить из принципа:
Что значит ваше "теперь"? Для вас до сего момента не было очевидно для чего обычно применяются атомарные операции? Даже не знаю, рассказывать ли вам еще и про volatile или это совсем шоком будет?
Цитата Сообщение от Rius Посмотреть сообщение
Это надо мне, значит оно надо всем.
А это мне не надо, поэтому оно не надо никому.
Это исключительно ваше мнение. Не ожидайте, что окружающие поверят вам на слово. Если вы говорите, что какая-то фича нужна, будьте готовы это обосновать. Если говорите, что не нужна, опишите как ее типичное применение решается иначе.
Аргументы, а не пустые выкрики.
Цитата Сообщение от ВитГо Посмотреть сообщение
мой редактор, и в нем попробовали.. там правда если у вас stm32f1 VL Disco нужно будет маленькое изменение драйвера сделать для ST-Link (там версия V1)
А вот с этого момента поподробнее Вам для изменения командной строки отладчика недостаточно соответствующий конфиг указать?
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 940
Записей в блоге: 17
23.03.2022, 23:26
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Что такое ЧМЗ?
Чтение\Модификация\Запись

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Не знаю как вам, а у меня этот код выглядел бы как
вы опять о си ? а я про ассемблер здесь говорю

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
И более интересный вопрос: чем ваш способ лучше обычного BSRR?
можно и им, кому что привычнее, но там вычислять битовую позицию... а так в принципе тоже самое
ааа, кстати у меня и на запись 0 и на запись 1 может быть использован один регистр адреса но правда с учетом команд загрузки\записи со смещением это так себе аргумент :-)))

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Полезность подобного редактора для меня не очевидна
ну вы же на ассемблере не пишите... мне вот неочевидна полезность какого нить редактора html или питона или еще какого нить языка... пока не начнешь пользоваться не понимаешь насколько много проблем может быть снято

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Даже не знаю, рассказывать ли вам еще и про volatile или это совсем шоком будет?
вы опять про СИ ?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А вот с этого момента поподробнее Вам для изменения командной строки отладчика недостаточно соответствующий конфиг указать?
подробнее запросто - c OpenOCD знакомы ? если нет то Значит ты нас не поймешь там для старых или некоторых программаторов нужно еще и установленную dll драйвера заменить.. делов 3 минуты, но без этого ни ST-Link V1 толком не работает, ни J-Link не видит...
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,066
24.03.2022, 00:27
Цитата Сообщение от ВитГо Посмотреть сообщение
вы опять о си ? а я про ассемблер здесь говорю
Что значит "опять"? "Опять" я могу только повторить, что за ваши фантазии отвечать не собираюсь.
Цитата Сообщение от ВитГо Посмотреть сообщение
а я про ассемблер здесь говорю
А я на ассемблере под ARM не пишу, потому что ни практического, ни учебного смысла в этом нет. Вы предложили способ решения задачи - я продемонстрировал, как это решается лучше. Все.
Впрочем, могу подсказать, что макроязык в ассемблере гибче, чем в Си, и ту же работу с портами вы вполне можете реализовать на нем, чтобы точно так же задавать все параметры одной макроконстантой.
Цитата Сообщение от ВитГо Посмотреть сообщение
можно и им, кому что привычнее, но там вычислять битовую позицию... а так в принципе тоже самое
Ее в любом случае вычислять, какая разница будет ли это умножение или сдвиг.
Цитата Сообщение от ВитГо Посмотреть сообщение
ааа, кстати у меня и на запись 0 и на запись 1 может быть использован один регистр адреса но правда с учетом команд загрузки\записи со смещением это так себе аргумент :-)))
в BSRR это тоже один регистр адреса, разница только в сдвиге значения на 16.
Цитата Сообщение от ВитГо Посмотреть сообщение
ну вы же на ассемблере не пишите...
Буквально на этих выходных писал на ассемблере для RISCV, в обычном kwrite. Подсветка части синтаксиса там есть (почему-то некоторые команды не подсвечивает), меток и директив тоже.
Но там сам ассемблер попроще.
Цитата Сообщение от ВитГо Посмотреть сообщение
там для старых или некоторых программаторов нужно еще и установленную dll драйвера заменить..
В смысле заменить dll? Если версия, которую вы откуда-то взяли, не поддерживает ваше оборудование, что мешает пересобрать? Заодно поправите косяки в исходниках. Для того же RISCV стандартный openocd из репозитория не подходил, пришлось собирать с патчами от автора контроллера, так там в исходниках нашлась пара дурацких ошибок, хотя за год уже не вспомню каких - то ли работа с неинициализированной памятью, то ли обнуление неправильное. В любом случае необходимость что-то собирать из исходников, конечно, напрягает. Хотя и меньше, чем подсовывание программе чужой библиотеки.
Но как это связано с обычным f1, который и базовая версия из репозитория прекрасно поддерживает?
0
Эксперт .NET
 Аватар для Rius
13398 / 7852 / 1700
Регистрация: 25.05.2015
Сообщений: 23,869
Записей в блоге: 14
24.03.2022, 06:06
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Что значит ваше "теперь"? Для вас до сего момента не было очевидно для чего обычно применяются атомарные операции?
Вот именно, перевернуть всё с ног на уши - ваш любимый аргумент в споре.
1
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 940
Записей в блоге: 17
24.03.2022, 06:14
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А я на ассемблере под ARM не пишу
зачем тогда ко мне в этой теме обращаетесь ? я уже все вам изложил.


Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Буквально на этих выходных писал на ассемблере для RISCV, в обычном kwrite. Подсветка части синтаксиса там есть (почему-то некоторые команды не подсвечивает), меток и директив тоже.
Но там сам ассемблер попроще.
объем написанного кода ?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В смысле заменить dll? Если версия, которую вы откуда-то взяли, не поддерживает ваше оборудование, что мешает пересобрать? Заодно поправите косяки в исходниках. Для того же RISCV стандартный openocd из репозитория не подходил, пришлось собирать с патчами от автора контроллера, так там в исходниках нашлась пара дурацких ошибок, хотя за год уже не вспомню каких - то ли работа с неинициализированной памятью, то ли обнуление неправильное. В любом случае необходимость что-то собирать из исходников, конечно, напрягает. Хотя и меньше, чем подсовывание программе чужой библиотеки.
Но как это связано с обычным f1, который и базовая версия из репозитория прекрасно поддерживает?
рад если у вас прекрасно все поддерживает. у меня не получилось запустить с ST-Link V1 сразу... я сейчас уже не помню где грабли были, но в интернете я нашел решение, и оно у меня работает.
0
1 / 1 / 0
Регистрация: 20.02.2019
Сообщений: 50
24.03.2022, 06:59  [ТС]
Вот мой код с правками, а значения адресов брал в файле stm32f100xb.h. Открывал через блокнот. Сюда не получается скинуть его. На GitHub он есть.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
Stack_Size            EQU     0x100                   
top_of_stack          EQU     0x20000000 + Stack_Size
    
PERIPH_BB_BASE        EQU 0x42000000
PERIPH_BASE           EQU 0x40000000
APB2PERIPH_BASE       EQU (PERIPH_BASE + 0x10000)
AHBPERIPH_BASE        EQU (PERIPH_BASE + 0x20000)    
RCC_BASE              EQU (AHBPERIPH_BASE + 0x1000)
RCC_APB2ENR           EQU 0x40021018
RCC_APB2ENR_IOPAEN_N  EQU 0x00000004
GPIOA_BASE            EQU (APB2PERIPH_BASE + 0x0800)
GPIO_CRL              EQU 0x00
GPIO_CRL_MODE1_N      EQU 4
GPIO_ODR              EQU 0x0C  
GPIO_MODE_OUT50       EQU 3
XTAL_CLK              EQU    8000
 
    PRESERVE8 
    THUMB 
         
    AREA RESET, DATA, READONLY
    
     DCD   top_of_stack  ;Top of Stack
     DCD   Start
        
     AREA  |.text|, CODE, READONLY 
         
     ENTRY 
 
Start    PROC 
        ; включение тактирования GPIOA
       LDR          R0, = PERIPH_BASE + PERIPH_BB_BASE + ( RCC_BASE + RCC_APB2ENR ) * 32 + RCC_APB2ENR_IOPAEN_N * 4
       MOV          R1, 1
       STR          R1, [ R0 ]
        ; Настройка 1 пина на выход  
       LDR          R0, = PERIPH_BASE + GPIOA_BASE
       LDR          R1, [ R0, GPIO_CRL ]
       MOV          R2, #GPIO_MODE_OUT50
       BFI          R1, R2, #GPIO_CRL_MODE1_N, #4
       STR          R1, [ R0, GPIO_CRL ]
        ;зажгем светодиод
       MOV          R1, 1 << 1
       STR          R1, [ R0, GPIO_ODR ]
loop
  B loop
    
    ENDP
    ALIGN
    END
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 940
Записей в блоге: 17
24.03.2022, 07:15
Цитата Сообщение от Boris2288 Посмотреть сообщение
Вот мой код с правками
у вас константы кривые.. то есть в отдельности они верные, но их нельзя складывать так как вы делаете в битбанде...

ну и про Start я уже писал выше...

Цитата Сообщение от Boris2288 Посмотреть сообщение
а значения адресов брал в файле stm32f100xb.h
он используется СИ компилятором ? там другие значения, как правило они абсолютные, а нужны адреса-смещения от базы, тогда ваш код будет работоспособен

я в каком то из предыдущих сообщений разместил архив с файлами инклудов...

p.s. кейл не предназначен для ассемблера :-) хотя он там и есть :-) вот вам и нужно будет сначала со всеми файлами констант разбираться, и только потом программировать
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,066
24.03.2022, 07:46
Цитата Сообщение от Rius Посмотреть сообщение
Вот именно, перевернуть всё с ног на уши
Мне уже надоедает повторять одно и то же: хватит приписывать мне всякую чушь. Если что-то противоестественное утверждаете (да хотя бы про мои "советы перейти на Си") то с подтверждениями.
Цитата Сообщение от ВитГо Посмотреть сообщение
зачем тогда ко мне в этой теме обращаетесь ? я уже все вам изложил.
Если вы меня цитируете, то, наверное, ожидаете ответа.
А что до асм/си, то это вы для себя выставили ограничение пользоваться именно ассемблером, я им не связан и могу применять тот инструмент, который захочу. А уже дальше можно сравнивать какой решает задачу лучше.
Цитата Сообщение от ВитГо Посмотреть сообщение
объем написанного кода ?
Практически идентичный код, что в том, что в другом случае один из первых, который я писал под соответствующие контроллеры - расчет 3D-графики и отображение на ili9341 (не считая данных моделей):
stm32f103: 11300 https://www.youtube.com/watch?v=afyTgpuA6sc
gd32vf103: 14064 https://www.youtube.com/watch?v=qRwLDw6-5CY
Разница около 20%.
Кстати, при переносе с одного ядра на другое, в коде не так уж много пришлось менять. По сути, только имена регистров. А теперь представьте, что подобная задача стоит перед вами...
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 940
Записей в блоге: 17
24.03.2022, 07:50
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Кстати, при переносе с одного ядра на другое, в коде не так уж много пришлось менять. По сути, только имена регистров. А теперь представьте, что подобная задача стоит перед вами...
эхх.. ох уж эти теоретики.. оба ядра m3.. еще есть вопросы ?


Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если вы меня цитируете, то, наверное, ожидаете ответа.
как прикольно вы придумали способ пропустить вопрос про то что вы пишите на асме.. :-) я уже вам все написал - вы не пишите на ассемблере. и что вы здесь делаете с такой постановкой диалога я не знаю, подозреваю что устраивате срач..
свой, якобы написанный на ассемблере код - не показываете :-)
си мне не интересен, не понимаю зачем вы мне на него ссылаетесь
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,066
24.03.2022, 08:04
Цитата Сообщение от Boris2288 Посмотреть сообщение
LDR R0, = PERIPH_BASE + PERIPH_BB_BASE + ( RCC_BASE + RCC_APB2ENR ) * 32 + RCC_APB2ENR_IOPAEN_N * 4
Освойте макросы. Я там раньше кидал ссылки на ЛОР (правда, их зачем-то потерли), но можно поискать самостоятельно по названию темы "включить тактирование" за авторством Assembler. Там я показывал как от нормальной работы с регистрами перейти к bitband, в частности написал макрос
C
1
2
3
#define BB_PERIPH( addr, bit ) (*((uint32_t*)( 0x42000000 + ((uint32_t)&(addr)-0x40000000)*32 + bit*4 )))
...
BB_PERIPH( RCC_APB2ENR, 3 ) = 1;
На ассемблере он будет выглядеть даже проще, поскольку тот знать не знает про типы данных. Значит, и от приведений можно избавиться.

Добавлено через 8 минут
Цитата Сообщение от ВитГо Посмотреть сообщение
эхх.. ох уж эти теоретики.. оба ядра m3.. еще есть вопросы ?
это вы f103 с vf103 перепутали, теоретики? Вы бы с материалом ознакомились, прежде чем очередную чушь писать.
Цитата Сообщение от ВитГо Посмотреть сообщение
как прикольно вы придумали способ пропустить вопрос про то что вы пишите на асме..
Те вопросы, которые заметил, вроде отвечены. Пишу ли на ассемблере? Умею для AVR и RISCV, не для x86 или ARM. Пишу ли на нем постоянно? Разумеется, нет.
Если пропустил какой-то еще, наверное и правда пропустил. Повторите.
Цитата Сообщение от ВитГо Посмотреть сообщение
и что вы здесь делаете с такой постановкой диалога я не знаю, подозреваю что устраивате срач..
Обсуждаю вещи, в которых разбираюсь, естественно.
Цитата Сообщение от ВитГо Посмотреть сообщение
свой, якобы написанный на ассемблере код - не показываете :-)
Да смотрите на здоровье https://habr.com/ru/post/533272/
Как и говорил с самого начала - ассемблер для RISCV (gd32vf103)
Цитата Сообщение от ВитГо Посмотреть сообщение
си мне не интересен, не понимаю зачем вы мне на него ссылаетесь
А что вы тогда пытались продемонстрировать кодом из 25 поста? Пока что мы увидели, что bitband особого преимущества не дает. Тем более если заворачивать его в подпрограмму, а не в макрос.
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 940
Записей в блоге: 17
24.03.2022, 08:08
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
это вы f103 с vf103 перепутали, теоретики? Вы бы с материалом ознакомились, прежде чем очередную чушь писать.
честно говоря не смотрел... ну если ядро другое - то возможно работы будет чуть больше, мне просто не интересно вникать в ваши наезды, я тс пытаюсь помочь, и срач с вами это даже не второстепенное для меня

на этом я общение в этой теме по си заканчиваю, до свидания где нить в другой теме
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,066
24.03.2022, 08:57

Не по теме:

Цитата Сообщение от ВитГо Посмотреть сообщение
мне просто не интересно вникать в ваши наезды
Приписываете мне тут всякую чушь, а потом удивляетесь реакции.


Цитата Сообщение от ВитГо Посмотреть сообщение
я тс пытаюсь помочь
Это вы медвежью услугу помощью называете? Вместо того чтобы объяснить как можно научиться самостоятельно искать информацию, экспериментировать и учиться, вы даете решение именно для того бесполезного способа, который ТС выбрал вследствие отсутствия опыта.
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 940
Записей в блоге: 17
24.03.2022, 10:48
Лучший ответ Сообщение было отмечено Boris2288 как решение

Решение

Boris2288

в общем вот какой код + константы например получаются у меня

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
@.CharSet=CP1251
@GNU AS
 
@
@ Демонстрационная программа для STM32Discovery
@        микроконтроллер STM32F100RB6
@        (без настройки тактирования)
@
@             Мигание светодиода
@
@ Используемый порт: GPIOA
@ Используемый пин:  A1
@
 
.syntax unified     @ синтаксис исходного кода
.thumb              @ тип используемых инструкций Thumb
.cpu cortex-m3      @ процессор
 
.equ PERIPH_BASE           ,0x40000000       @ база Регистры настройки периферии микроконтроллера
.equ PERIPH_BB_BASE        ,0x02000000    @ смещение для BB
.equ AHBPERIPH_BASE        ,0x00020000   @ смещение
.equ APB2PERIPH_BASE       ,0x00010000   @ смещение
 
.EQU  RCC_BASE           , ( AHBPERIPH_BASE + 0x1000 )    @ смещенный базовый адрес для всего  RCC
 
.EQU  RCC_APB2ENR        , 0x18                    @ RCC AHB2 peripheral clock enable register
.EQU  RCC_APB2ENR_IOPAEN_N, 2
 
.EQU  GPIOA_BASE         , APB2PERIPH_BASE + 0x0800
.EQU  GPIO_ODR           , 0x0C                    @ Port output data register (GPIOx_ODR)
.EQU  GPIO_CRL           , 0x00                    @ Port configuration register low (GPIOx_CRL)
.EQU  GPIO_MODE_OUT50    , 3                       @ Output mode speed 50 MHz
.EQU  GPIO_CRL_MODE1_N   , 4                       @ 4:5  Pin 1 Port mode bits
 
 
.section .asmcode
 
@ основная программа
.global Start
Start:              @ поместите код своей программы ниже
 
                    @ включим тактирование GPIO A   (при помощи BitBanding)
                         LDR          R0, = PERIPH_BASE + PERIPH_BB_BASE + ( RCC_BASE + RCC_APB2ENR ) * 32 + RCC_APB2ENR_IOPAEN_N * 4
                         MOV          R1, 1
                         STR          R1, [ R0 ]
 
                    @ Настройка пина 9 GPIO A на выход с частотой 50 мгц
                         LDR          R0, = PERIPH_BASE + GPIOA_BASE
                         LDR          R1, [ R0, GPIO_CRL ]
                         MOV          R2, GPIO_MODE_OUT50
                         BFI          R1, R2, GPIO_CRL_MODE1_N, 4
                         STR          R1, [ R0, GPIO_CRL ]
 
MAIN_LOOP:               @ главный цикл мигания, начало цикла
 
                    @ зажгем светодиод
                         MOV          R1, 1 << 1
                         STR          R1, [ R0, GPIO_ODR ]
 
                    @ пауза
                         LDR          R1, = 0xfffff
pause1:                  SUBS         R1, R1, 1
                         BNE          pause1
 
                    @ потушим светодиод
                         MOV          R1, 0
                         STR          R1, [ R0, GPIO_ODR ]
 
                    @ пауза
                         LDR          R1, = 0xfffff
pause2:                  SUBS         R1, R1, 1
                         BNE          pause2
 
                         B            MAIN_LOOP    @ циклимся на начало мигания
просто подставьте кейловские директивы и будет работать..

не забудьте для указателя DCD Start прибавить единичку
Assembler
1
2
3
 таблица векторов прерываний
     .word     0x20008000             @ 0x0000 Вершина стека
     .word     Start+1                  @ 0x0004 RESET


p.s. в кейле на асме кодить один геморрой - просто потому что все файлы определений вас будут высушивать так как не высушивал никто... а потом будет сушить дибильный редактор не имеющий фич именно для ассемблера.

Добавлено через 19 минут
ну и про отладку, которая "все решает"
я много раз писал, но возможно вам проще один раз увидеть

1
1 / 1 / 0
Регистрация: 20.02.2019
Сообщений: 50
24.03.2022, 19:28  [ТС]
УРА, все заработало, светодиод горит. Спасибо огромное за помощь. DCD Start не добавлял 1. Я её добавил на первой и второй строчках изначально.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Stack_Size            EQU     0x100                   
top_of_stack          EQU     0x20000000 + Stack_Size
    
PERIPH_BB_BASE        EQU 0x02000000
PERIPH_BASE           EQU 0x40000000
APB2PERIPH_BASE       EQU 0x00010000
AHBPERIPH_BASE        EQU 0x00020000
RCC_BASE              EQU (AHBPERIPH_BASE + 0x1000)
RCC_APB2ENR           EQU 0x18
RCC_APB2ENR_IOPAEN_N  EQU 2
GPIOA_BASE            EQU (APB2PERIPH_BASE + 0x0800)
GPIO_CRL              EQU 0x00
GPIO_CRL_MODE1_N      EQU 4
GPIO_ODR              EQU 0x0C  
GPIO_MODE_OUT50       EQU 3
XTAL_CLK              EQU    8000
 
    PRESERVE8 
    THUMB 
         
    AREA RESET, DATA, READONLY
    
     DCD   top_of_stack  ;Top of Stack
     DCD   Start
        
     AREA  |.text|, CODE, READONLY 
         
     ENTRY 
 
Start    PROC 
        ; включение тактирования GPIOA
       LDR          R0, = PERIPH_BASE + PERIPH_BB_BASE + ( RCC_BASE + RCC_APB2ENR ) * 32 + RCC_APB2ENR_IOPAEN_N * 4
       MOV          R1, 1
       STR          R1, [ R0 ]
        ; Настройка 1 пина на выход  
       LDR          R0, = PERIPH_BASE + GPIOA_BASE
       LDR          R1, [ R0, GPIO_CRL ]
       MOV          R2, GPIO_MODE_OUT50
       BFI          R1, R2, GPIO_CRL_MODE1_N, 4
       STR          R1, [ R0, GPIO_CRL ]
        ;зажгем светодиод
       MOV          R1, 1<<1 
       STR          R1, [ R0, GPIO_ODR ]
       
loop
  B loop
    
    ENDP
    ALIGN
    END
Миниатюры
Зажечь светодиод используя bit banding  
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,715
24.03.2022, 20:16
Так автор начал зажигать светодиод 18.03.2022 и закончил 24.03.2022. А если нужно будет выводить текст на LCD HD44870.
0
1 / 1 / 0
Регистрация: 20.02.2019
Сообщений: 50
24.03.2022, 20:31  [ТС]
Цитата Сообщение от VladimirU Посмотреть сообщение
Так автор начал зажигать светодиод 18.03.2022 и закончил 24.03.2022. А если нужно будет выводить текст на LCD HD44870.
Ну я же только изучаю это все. Для меня это первый положительный опыт.
0
62 / 187 / 31
Регистрация: 14.02.2013
Сообщений: 1,715
24.03.2022, 20:42
Цитата Сообщение от Boris2288 Посмотреть сообщение
Ну я же только изучаю это все. Для меня это первый положительный опыт.
А почему именно на ASM?
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,066
24.03.2022, 21:13
Нет, что на асме - тоже правильно. Это позволяет гораздо лучше понять как контроллер работает внутри, что такое регистры, стек, атомарность и т.д. Правда, arm в этом не лучший выбор, но всяко лучше, чем x86.
Если говорить об изучении внутренностей ЭВМ, я бы все еще предложил AVR или, несколько хуже, RISCV. Они значительно более простые. Хотя на RISCV бывают и контроллеры, и полноценные процессоры.
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 940
Записей в блоге: 17
24.03.2022, 21:29
Цитата Сообщение от Boris2288 Посмотреть сообщение
DCD Start не добавлял 1. Я её добавил на первой и второй строчках изначально.
не понял :-(

ну вот теперь по коду и перепишите на зажигание светодиода тоже например битбандингом.. и проверите полученные знания.. и после этого скорее всего с битбандингом больше проблем у вас и не будет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.03.2022, 21:29

Зажечь светодиод по кнопке на ATMega8515
Есть микроконтроллер ATMEGA 8515. Требуется считывать порты В (0 и 1 пина). И при обнаружении 1 на одном из пине, выдавать логическую 1 на...

По нажатию кнопки зажечь светодиод (STM32L152)
здравствуйте. прошу прощения за глупый вопрос. начал изучать STM32l но не как не получается выполнить условие чтобы при нажатие кнопки...

AS-sam3X. Зажечь светодиод через веб-интерфейс
Здравствуйте. Нужно зажечь и потушить светодиод на плате AS-sam3X через веб-интерфейс, подключив плату к компу через Ethernet. Нашёл...

Как зажечь светодиод?
Добрый день. Решил заняться электроникой, а конкретно - с простого светодиода. Начал с того что собрал наипростейшую цепь в протеусе. С...

Зажечь светодиод по таймеру
Всем привет! Есть диод, кнопка и **duino Mega2560. Задача состоит в том, чтобы подрубленный диод по таймеру горел, к примеру, 2...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
59
Ответ Создать тему
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru