Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.84/32: Рейтинг темы: голосов - 32, средняя оценка - 4.84
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274

Stm32f103 примитивная работа с таймерами на ассемблере

05.06.2021, 00:36. Показов 7540. Ответов 59

Студворк — интернет-сервис помощи студентам
здрасьте. не думал, что так может процессе гуглежа попал на один из российский форумов разработчиков в тему, где кто-то просит помочь разобраться в таймерах и это оказался мой одногруппник. я прочитал тему и мне стало интересно, попытался разобраться, но не смог. Скажите, есть тут люди, которые хорошо разбирается в таймерах? я не могу сформулировать лучше вопрос, чем мой одногруппник, поэтому просто спрошу как он


если вам несложно то скажите что имено необходимо для TIM1 чтобы взаимодействовать со светодиодом. как этот таймер включает и выключает его? счетчик достиг нуля, какое именно прерывание и как сработает? просто мне непонятно, TIM1 заявлен как очень настраиваемый таймер, и поэтому было бы логично ему иметь не свои собственные прерывания ,а работать с прерываниями тех устройств, для которых таймер тикает.

действительно, какое имено нужно прерывание для того чтобы светодиод зажегся или погас?
Code
1
2
3
4
•регстр счетчика (TIMx_CNT).
• Регстр прескалера (TIMx_PSC).
• Регстр автозагрузки (TIMx_ARR).
• Регстр счетчика повторений (TIMx_RCR).
положили значение в TIMx_CNT, высчитали и положили значение в пределитель Регстр прескалера (TIMx_PSC) настроили на то что когда счетчик достигнет максимального результата к примеру 5000, то что должно произойти? прерывание? какое? какое нужно прерывание, чтобы мигнул светодиод?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.06.2021, 00:36
Ответы с готовыми решениями:

Работа с таймерами
Пацаны привет!!!!!!!!!!!!!! Я хочу зделать секундомера!!!!!!!!!!!!!! Мне нужно в одной форме чтоби было два секундомера, первий я...

Работа с таймерами
Есть один класс. В нем заведен тред QThread. В его функции run - объявлены четыре локальных таймера, которые должны запускаться после...

Работа с таймерами
Всем привет. Задача довольна проста, но реализовать ее у меня не получается. Нужно запустить импульс длинной в 100 мс, после его начала...

59
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
06.06.2021, 07:39
Студворк — интернет-сервис помощи студентам
COKPOWEHEU, я имел ввиду устройство, которое друг TC предположительно пытается программировать.
https://github.com/beckus/qemu... 2_f103c8.c

Чтобы догадаться, что это за платка, нужно было гуглить исходный вопрос на других форумах?
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,070
06.06.2021, 08:26
Цитата Сообщение от pcmax Посмотреть сообщение
Я же привел пример кода.
для меня это ни о чем не говорит.
Вы на Си программировать умеете?
Цитата Сообщение от pcmax Посмотреть сообщение
ему надо пример и только пример. мне тоже пример помогает, но одного приимера для меня, как правило мало.
Пример не сам по себе помогать должен. Вы должны понять как он работает и переделать под себя. Не заменить на точно такой же, а именно переделать.
Например, в моем примере за настройку таймера отвечает 6 строк, плюс одна в обработчике прерывания. Вы можете свериться с рефманом и прокомментировать что каждая из них делает и зачем нужна?
Плюс две строки на настройку прерываний, с ними чуть сложнее.
Цитата Сообщение от politoto Посмотреть сообщение
COKPOWEHEU, я имел ввиду устройство, которое друг TC предположительно пытается программировать.
https://github.com/beckus/qemu... 2_f103c8.c
qemu для stm32? Такого я не видел. И не понимаю зачем оно нужно. При работе с контроллерами ядро это ведь самое меньшее, а основное - периферия, которую qemu эмулировать не сможет.
Цитата Сообщение от politoto Посмотреть сообщение
Чтобы догадаться, что это за платка, нужно было гуглить исходный вопрос на других форумах?
Мы все же в разделе по ARM-контроллерам. Эта платка до сих пор самая распространенная у новичков. И я не защищаю ТСа: задачу надо описывать максимально подробно.
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
06.06.2021, 20:59  [ТС]
politoto,
Цитата Сообщение от politoto Посмотреть сообщение
Для начала я бы попробовал удалить или заменить глубокомысленным комментарием
Как понять ?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
07.06.2021, 13:39
Что там делает директива .section .text?
Предписывает ассемблеру переключиться с секции .textна секцию .text?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.syntax unified; .thumb ; .cpu cortex-m3 
 
vector.table.size = 0x100 /* зависит от устройства, модели и т.д. */
vector.table:
 
SP_main:    .word 0x20005000
reset:      .word init + 1 
 
.space vector.table + 4 * vector.table.size - .
 
.text /* пока можно обойтись без этой директивы */
 
init:
 
wait:   wfi;    b wait
Bash
1
2
arm-none-eabi-as wait.s -al; arm-none-eabi-ld -Ttext 0x8000000 -e
 0 a.out -o wait.elf; arm-none-eabi-objcopy wait.elf -O binary
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   1                    .syntax unified; .thumb ; .cpu cortex-m3
   2
   3                    vector.table.size = 0x100 /* */
   4                    vector.table:
   5
   6 0000 00500020      SP_main:        .word 0x20005000
   7 0004 01040000      reset:          .word init + 1
   8
   9 0008 00000000      .space vector.table + 4 * vector.table.size - .
  11                    .text /* */
  12
  13                    init:
  14
  15 0400 30BFFDE7      wait:   wfi;    b wait
Bash
1
od -t x4 wait.elf
Code
1
2
3
4
5
0000000 20005000 08000401 00000000 00000000
0000020 00000000 00000000 00000000 00000000
*
0002000 e7fdbf30
0002004
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
07.06.2021, 20:34  [ТС]
Лучший ответ Сообщение было отмечено politoto как решение

Решение

politoto,
ребята с форума моего одногруппника посоветовали ему так. я просто скопипастил. это не мой код.

ActionScript 3
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
.syntax unified
.cpu cortex-m3
.thumb
 
RCC_APB2ENR = 0x40021018
RCC_APB2ENR_IOPCEN = (1 << 4)
RCC_APB2ENR_TIM1EN = (1 << 11)
 
GPIOC_CRH = 0x40011004
 
TIM1_CR1 = 0x40012c00
TIM_CR1_URS = (1 << 2)
TIM_CR1_CEN = (1 << 0)
 
TIM1_PSC = 0x40012c28
TIM1_ARR = 0x40012c2c
 
TIM1_DIER = 0x40012c0c
TIM_DIER_UIE = (1 << 0)
 
TIM1_EGR = 0x40012c14
TIM_EGR_UG = (1 << 0)
 
NVIC_ISER0 = 0xe000e100
TIM1_UP = (1 << 25)
 
TIM1_SR = 0x40012c10
TIM_SR_UIF = (1 << 0)
 
GPIOC_ODR = 0x4001100c
 
.text
    .word   0x20002000
    .word   _start + 1
    .space  0x9c
    .word   TIM1_UP_isr + 1
 
.global _start
_start:
    ldr    r0, =RCC_APB2ENR
    ldr    r1, [r0]
    orr    r1, #(RCC_APB2ENR_TIM1EN | RCC_APB2ENR_IOPCEN)
    str    r1, [r0]
 
    ldr    r0, =GPIOC_CRH
    ldr    r1, [r0]
    and    r1, #0xFF0FFFFF
    orr    r1, #0x00100000
    str    r1, [r0]
 
    ldr    r0, =TIM1_CR1
    ldr    r1, =TIM_CR1_URS
    str    r1, [r0]
 
    ldr    r0, =TIM1_PSC
    ldr    r1, =1000
    str    r1, [r0]
 
    ldr    r0, =TIM1_ARR
    ldr    r1, =2000
    str    r1, [r0]
 
    ldr    r0, =TIM1_DIER
    ldr    r1, =TIM_DIER_UIE 
    str    r1, [r0]
 
    ldr    r0, =TIM1_EGR
    ldr    r1, =TIM_EGR_UG
    str    r1, [r0]
 
    dsb
 
    ldr    r0, =TIM1_CR1
    ldr    r1, =TIM_CR1_CEN
    str    r1, [r0]
 
    ldr    r0, =NVIC_ISER0
    ldr    r1, =TIM1_UP
    str    r1, [r0]
 
loop:
    wfi
    b loop
 
.global TIM1_UP_isr
TIM1_UP_isr:
    ldr    r0, =TIM1_SR
    ldr    r1, [r0]
    bic    r1, #TIM_SR_UIF
    str    r1, [r0]
 
    ldr    r0, =GPIOC_ODR
    ldr    r1, [r0]
    eor    r1, #(1 << 13)
    str    r1, [r0]
 
    bx lr
Добавлено через 42 минуты
Цитата Сообщение от politoto Посмотреть сообщение
Что там делает директива .section .text?
это линковщику я пишу. для того чтобы он знал.

Добавлено через 1 час 32 минуты
politoto,
Цитата Сообщение от pcmax Посмотреть сообщение
.word   0x20002000
только вот здесь почему-то если конец стека перенести на другой адрес, то програмка не отработает.
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
07.06.2021, 21:34
Цитата Сообщение от pcmax Посмотреть сообщение
Что там делает директива .section .text?
это линковщику я пишу. для того чтобы он знал.
Линковщику ассемблер сам напишет в объектном файле. Всё, что ниже директивы .text, ассемблер разместил в той же секции, что и вышенаписанную таблицу.
GNU as создаёт 3 секции даже из пустого исходника:
Bash
1
as /dev/null; nm -a
Code
1
2
3
0000000000000000 b .bss
0000000000000000 d .data
0000000000000000 t .text
Добавлено через 4 минуты
Цитата Сообщение от pcmax Посмотреть сообщение
я просто скопипастил.
Инструкцию по сборке образа для прошивки скопируйте, пожалуйста, для полного исчерпания вопроса.
1
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,070
07.06.2021, 22:37
Цитата Сообщение от pcmax Посмотреть сообщение
ребята с форума моего одногруппника посоветовали ему так.
То, что Ассемблер умеет только попрошайничать по форумам, многие уже знают. Но неужели из всей группы нет ни одного, кому действительно интересно возиться с контроллерами?!
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
08.06.2021, 02:11  [ТС]
politoto,
Цитата Сообщение от politoto Посмотреть сообщение
Линковщику ассемблер сам напишет в объектном файле.
ну не может програмка корректно отработать без дериктивы .text потому что именно эта директива поможет линкувщику разместить весь код программы по адресу 0x8000000 к примеру....

Добавлено через 7 минут
COKPOWEHEU,
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
. Но неужели из всей группы нет ни одного, кому действительно интересно возиться с контроллерами?!
есть. Аssembler вроде как. но он не помогает никому. Вот вы, пусть даже не умеете на ассемблере писать, но теорию же знаете?
Цитата Сообщение от pcmax Посмотреть сообщение
.word   0x20002000
почему? почему не 20005000?

Добавлено через 1 минуту
Цитата Сообщение от politoto Посмотреть сообщение
Инструкцию по сборке образа для прошивки скопируйте, пожалуйста, для полного исчерпания вопроса
politoto,
да я вам сам напишу. вы на Linux? в IDE или без?
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,070
08.06.2021, 08:23
Цитата Сообщение от pcmax Посмотреть сообщение
ну не может програмка корректно отработать без дериктивы .text потому что именно эта директива поможет линкувщику разместить весь код программы по адресу 0x8000000 к примеру....
Это директива по умолчанию. Вот если бы вы в начале использовали другие секции вроде .data или .isr_vectors, ставить .text пришлось бы обязательно. Поэтому я и говорю, что ставить не обязательно, но хороший тон.
Цитата Сообщение от pcmax Посмотреть сообщение
есть. Аssembler вроде как. но он не помогает никому. Вот вы, пусть даже не умеете на ассемблере писать, но теорию же знаете?
Если бы Ассемблер хотел, он бы литературу читал, а не на форумах побирался.
Я потому и не даю готового решения, что найти соответствующий код в интернете несложно. Адаптировать даже мой Си-шный код несложно (тем более что приложил-то я уже дизассемблированный). Для меня написать ассемблерный код по вашему условию особой сложности не представляет, но вам это в понимании не поможет никак.
Цитата Сообщение от pcmax Посмотреть сообщение
politoto,
да я вам сам напишу. вы на Linux? в IDE или без?
Согласно правилам форума, если спрашивающий сам находит ответ, стоит выложить его на форум, чтобы другие, наткнувшись поиском на его статью, тоже смогли воспользоваться.
Уверен, лично politoto пользоваться вашим кодом не будет. А если и будет, то уж команду компиляции как-нибудь сообразит.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
08.06.2021, 09:49
Цитата Сообщение от pcmax Посмотреть сообщение
не может програмка корректно отработать без дериктивы .text потому что именно эта директива поможет линкувщику разместить весь код программы по адресу 0x8000000
Присвоение адресов сегментам ( в случае elf ) ld выполняет по командам из явных и неявных скриптов компоновщика и параметрам командной строки.
Конечно, секции и символы, определённые во входных объектных файлах, влияют на распределение сегментов по адресному пространству.

Совсем не использовать .section для as из GNU binutils - то же самое, что выдать
Assembler
1
.section .text
в начале исходника.

Возьмём пример из Вашего сообщения
Stm32f103 примитивная работа с таймерами на ассемблере
и его в with.s

Сделаем по нему прошивочный файл
cat > ./build.sh
Bash
1
2
3
4
5
P=arm-none-eabi-
${P}as $1 -o $1.o
${P}ld $1.o -o $1.elf -Ttext=0x8000000 -M
${P}objcopy $1.elf -O binary $1.image
hd $1.image
. ./build.sh with.s
Кликните здесь для просмотра всего текста
Memory Configuration

Name Origin Length Attributes
*default* 0x0000000000000000 0xffffffffffffffff

Linker script and memory map

LOAD with.s.o
Address of section .text set to 0x8000000
[!provide] PROVIDE (__executable_start = SEGMENT_START ("text-segment", 0x8000))
0x0000000000008000 . = SEGMENT_START ("text-segment", 0x8000)

.interp
*(.interp)

.note.gnu.build-id
*(.note.gnu.build-id)

.hash
*(.hash)

.gnu.hash
*(.gnu.hash)

.dynsym
*(.dynsym)

.dynstr
*(.dynstr)

.gnu.version
*(.gnu.version)

.gnu.version_d
*(.gnu.version_d)

.gnu.version_r
*(.gnu.version_r)

.rel.dyn 0x0000000000008000 0x0
*(.rel.init)
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
*(.rel.fini)
*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
*(.rel.data.rel.ro .rel.data.rel.ro.* .rel.gnu.linkonce.d.rel.ro.*)
*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
*(.rel.ctors)
*(.rel.dtors)
*(.rel.got)
*(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
[!provide] PROVIDE (__rel_iplt_start = .)
*(.rel.iplt)
.rel.iplt 0x0000000000008000 0x0 with.s.o
[!provide] PROVIDE (__rel_iplt_end = .)

.rela.dyn 0x0000000000008000 0x0
*(.rela.init)
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
*(.rela.fini)
*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
*(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
*(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
*(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
*(.rela.ctors)
*(.rela.dtors)
*(.rela.got)
*(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
[!provide] PROVIDE (__rela_iplt_start = .)
*(.rela.iplt)
[!provide] PROVIDE (__rela_iplt_end = .)

.rel.plt
*(.rel.plt)

.rela.plt
*(.rela.plt)

.init
*(SORT_NONE(.init))

.plt
*(.plt)

.iplt 0x0000000000008000 0x0
*(.iplt)
.iplt 0x0000000000008000 0x0 with.s.o

.text 0x0000000008000000 0x140
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
*(.text.exit .text.exit.*)
*(.text.startup .text.startup.*)
*(.text.hot .text.hot.*)
*(.text .stub .text.* .gnu.linkonce.t.*)
.text 0x0000000008000000 0x140 with.s.o
0x00000000080000a8 _start
0x0000000008000100 TIM1_UP_isr
*(.gnu.warning)
*(.glue_7t)
.glue_7t 0x0000000008000140 0x0 linker stubs
*(.glue_7)
.glue_7 0x0000000008000140 0x0 linker stubs
*(.vfp11_veneer)
.vfp11_veneer 0x0000000008000140 0x0 linker stubs
*(.v4_bx)
.v4_bx 0x0000000008000140 0x0 linker stubs

.fini
*(SORT_NONE(.fini))
[!provide] PROVIDE (__etext = .)
[!provide] PROVIDE (_etext = .)
[!provide] PROVIDE (etext = .)

.rodata
*(.rodata .rodata.* .gnu.linkonce.r.*)

.rodata1
*(.rodata1)

.ARM.extab
*(.ARM.extab* .gnu.linkonce.armextab.*)
[!provide] PROVIDE (__exidx_start = .)

.ARM.exidx
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
[!provide] PROVIDE (__exidx_end = .)

.eh_frame_hdr
*(.eh_frame_hdr)
*(.eh_frame_entry .eh_frame_entry.*)

.eh_frame
*(.eh_frame)
*(.eh_frame.*)

.gcc_except_table
*(.gcc_except_table .gcc_except_table.*)

.gnu_extab
*(.gnu_extab*)

.exception_ranges
*(.exception_ranges .exception_ranges*)
0x0000000008010140 . = (ALIGN (CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 0x1)))

.eh_frame
*(.eh_frame)
*(.eh_frame.*)

.gnu_extab
*(.gnu_extab)

.gcc_except_table
*(.gcc_except_table .gcc_except_table.*)

.exception_ranges
*(.exception_ranges .exception_ranges*)

.tdata 0x0000000008010140 0x0
[!provide] PROVIDE (__tdata_start = .)
*(.tdata .tdata.* .gnu.linkonce.td.*)

.tbss
*(.tbss .tbss.* .gnu.linkonce.tb.*)
*(.tcommon)

.preinit_array 0x0000000008010140 0x0
[!provide] PROVIDE (__preinit_array_start = .)
*(.preinit_array)
[!provide] PROVIDE (__preinit_array_end = .)

.init_array 0x0000000008010140 0x0
[!provide] PROVIDE (__init_array_start = .)
*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))
*(.init_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .ctors)
[!provide] PROVIDE (__init_array_end = .)

.fini_array 0x0000000008010140 0x0
[!provide] PROVIDE (__fini_array_start = .)
*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))
*(.fini_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .dtors)
[!provide] PROVIDE (__fini_array_end = .)

.ctors
*crtbegin.o(.ctors)
*crtbegin?.o(.ctors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
*(SORT_BY_NAME(.ctors.*))
*(.ctors)

.dtors
*crtbegin.o(.dtors)
*crtbegin?.o(.dtors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
*(SORT_BY_NAME(.dtors.*))
*(.dtors)

.jcr
*(.jcr)

.data.rel.ro
*(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*)
*(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*)

.dynamic
*(.dynamic)

.got 0x0000000008010140 0x0
*(.got.plt)
*(.igot.plt)
.igot.plt 0x0000000008010140 0x0 with.s.o
*(.got)
*(.igot)

.data 0x0000000008010140 0x0
0x0000000008010140 __data_start = .
*(.data .data.* .gnu.linkonce.d.*)
.data 0x0000000008010140 0x0 with.s.o

.data1
*(.data1)
0x0000000008010140 _edata = .
[!provide] PROVIDE (edata = .)
0x0000000008010140 . = .
0x0000000008010140 __bss_start = .
0x0000000008010140 __bss_start__ = .

.bss 0x0000000008010140 0x0
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
.bss 0x0000000008010140 0x0 with.s.o
*(COMMON)
0x0000000008010140 . = ALIGN ((. != 0x0)?0x4:0x1)
0x0000000008010140 _bss_end__ = .
0x0000000008010140 __bss_end__ = .
0x0000000008010140 . = ALIGN (0x4)
0x0000000008010140 . = SEGMENT_START ("ldata-segment", .)
0x0000000008010140 . = ALIGN (0x4)
0x0000000008010140 __end__ = .
0x0000000008010140 _end = .
[!provide] PROVIDE (end = .)

.stack 0x0000000000080000 0x0
0x0000000000080000 _stack = .
*(.stack)

.stab
*(.stab)

.stabstr
*(.stabstr)

.stab.excl
*(.stab.excl)

.stab.exclstr
*(.stab.exclstr)

.stab.index
*(.stab.index)

.stab.indexstr
*(.stab.indexstr)

.comment
*(.comment)

.debug
*(.debug)

.line
*(.line)

.debug_srcinfo
*(.debug_srcinfo)

.debug_sfnames
*(.debug_sfnames)

.debug_aranges
*(.debug_aranges)

.debug_pubnames
*(.debug_pubnames)

.debug_info
*(.debug_info .gnu.linkonce.wi.*)

.debug_abbrev
*(.debug_abbrev)

.debug_line
*(.debug_line .debug_line.* .debug_line_end)

.debug_frame
*(.debug_frame)

.debug_str
*(.debug_str)

.debug_loc
*(.debug_loc)

.debug_macinfo
*(.debug_macinfo)

.debug_weaknames
*(.debug_weaknames)

.debug_funcnames
*(.debug_funcnames)

.debug_typenames
*(.debug_typenames)

.debug_varnames
*(.debug_varnames)

.debug_pubtypes
*(.debug_pubtypes)

.debug_ranges
*(.debug_ranges)

.debug_macro
*(.debug_macro)

.debug_addr
*(.debug_addr)

.ARM.attributes
0x0000000000000000 0x21
*(.ARM.attributes)
.ARM.attributes
0x0000000000000000 0x21 with.s.o
*(.gnu.attributes)

.note.gnu.arm.ident
*(.note.gnu.arm.ident)

/DISCARD/
*(.note.GNU-stack)
*(.gnu_debuglink)
*(.gnu.lto_*)
OUTPUT(with.s.elf elf32-littlearm)

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
00000000  00 20 00 20 a9 00 00 08  00 00 00 00 00 00 00 00  |. . ............|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000000a0  00 00 00 00 01 01 00 08  1b 48 01 68 41 f4 01 61  |.........H.hA..a|
000000b0  01 60 1a 48 01 68 21 f4  70 01 41 f4 80 11 01 60  |.`.H.h!.p.A....`|
000000c0  17 48 4f f0 04 01 01 60  16 48 4f f4 7a 71 01 60  |.HO....`.HO.zq.`|
000000d0  15 48 4f f4 fa 61 01 60  14 48 4f f0 01 01 01 60  |.HO..a.`.HO....`|
000000e0  13 48 4f f0 01 01 01 60  bf f3 4f 8f 0c 48 4f f0  |.HO....`..O..HO.|
000000f0  01 01 01 60 0f 48 4f f0  00 71 01 60 30 bf fd e7  |...`.HO..q.`0...|
00000100  0d 48 01 68 21 f0 01 01  01 60 0c 48 01 68 81 f4  |.H.h!....`.H.h..|
00000110  00 51 01 60 70 47 00 00  18 10 02 40 04 10 01 40  |.Q.`pG.....@...@|
00000120  00 2c 01 40 28 2c 01 40  2c 2c 01 40 0c 2c 01 40  |.,.@(,.@,,.@.,.@|
00000130  14 2c 01 40 00 e1 00 e0  10 2c 01 40 0c 10 01 40  |.,.@.....,.@...@|
00000140
Теперь удалим пока незадействованные директивы и соберём бинарник без них:
Bash
1
2
sed -e /.glob/d -e /.text/d with.s > wo.s
cat wo.s
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
.syntax unified
.cpu cortex-m3
.thumb
 
RCC_APB2ENR = 0x40021018
RCC_APB2ENR_IOPCEN = (1 << 4)
RCC_APB2ENR_TIM1EN = (1 << 11)
 
GPIOC_CRH = 0x40011004
 
TIM1_CR1 = 0x40012c00
TIM_CR1_URS = (1 << 2)
TIM_CR1_CEN = (1 << 0)
 
TIM1_PSC = 0x40012c28
TIM1_ARR = 0x40012c2c
 
TIM1_DIER = 0x40012c0c
TIM_DIER_UIE = (1 << 0)
 
TIM1_EGR = 0x40012c14
TIM_EGR_UG = (1 << 0)
 
NVIC_ISER0 = 0xe000e100
TIM1_UP = (1 << 25)
 
TIM1_SR = 0x40012c10
TIM_SR_UIF = (1 << 0)
 
GPIOC_ODR = 0x4001100c
 
    .word   0x20002000
    .word   _start + 1
    .space  0x9c
    .word   TIM1_UP_isr + 1
 
_start:
    ldr    r0, =RCC_APB2ENR
    ldr    r1, [r0]
    orr    r1, #(RCC_APB2ENR_TIM1EN | RCC_APB2ENR_IOPCEN)
    str    r1, [r0]
 
    ldr    r0, =GPIOC_CRH
    ldr    r1, [r0]
    and    r1, #0xFF0FFFFF
    orr    r1, #0x00100000
    str    r1, [r0]
 
    ldr    r0, =TIM1_CR1
    ldr    r1, =TIM_CR1_URS
    str    r1, [r0]
 
    ldr    r0, =TIM1_PSC
    ldr    r1, =1000
    str    r1, [r0]
 
    ldr    r0, =TIM1_ARR
    ldr    r1, =2000
    str    r1, [r0]
 
    ldr    r0, =TIM1_DIER
    ldr    r1, =TIM_DIER_UIE 
    str    r1, [r0]
 
    ldr    r0, =TIM1_EGR
    ldr    r1, =TIM_EGR_UG
    str    r1, [r0]
 
    dsb
 
    ldr    r0, =TIM1_CR1
    ldr    r1, =TIM_CR1_CEN
    str    r1, [r0]
 
    ldr    r0, =NVIC_ISER0
    ldr    r1, =TIM1_UP
    str    r1, [r0]
 
loop:
    wfi
    b loop
 
TIM1_UP_isr:
    ldr    r0, =TIM1_SR
    ldr    r1, [r0]
    bic    r1, #TIM_SR_UIF
    str    r1, [r0]
 
    ldr    r0, =GPIOC_ODR
    ldr    r1, [r0]
    eor    r1, #(1 << 13)
    str    r1, [r0]
 
    bx lr
Bash
1
. build.sh wo.s
Кликните здесь для просмотра всего текста
arm-none-eabi-ld: warning: cannot find entry symbol _start; defaulting to 0000000008000000

Memory Configuration

Name Origin Length Attributes
*default* 0x0000000000000000 0xffffffffffffffff

Linker script and memory map

LOAD wo.s.o
Address of section .text set to 0x8000000
[!provide] PROVIDE (__executable_start = SEGMENT_START ("text-segment", 0x8000))
0x0000000000008000 . = SEGMENT_START ("text-segment", 0x8000)

.interp
*(.interp)

.note.gnu.build-id
*(.note.gnu.build-id)

.hash
*(.hash)

.gnu.hash
*(.gnu.hash)

.dynsym
*(.dynsym)

.dynstr
*(.dynstr)

.gnu.version
*(.gnu.version)

.gnu.version_d
*(.gnu.version_d)

.gnu.version_r
*(.gnu.version_r)

.rel.dyn 0x0000000000008000 0x0
*(.rel.init)
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
*(.rel.fini)
*(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*)
*(.rel.data.rel.ro .rel.data.rel.ro.* .rel.gnu.linkonce.d.rel.ro.*)
*(.rel.data .rel.data.* .rel.gnu.linkonce.d.*)
*(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*)
*(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*)
*(.rel.ctors)
*(.rel.dtors)
*(.rel.got)
*(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*)
[!provide] PROVIDE (__rel_iplt_start = .)
*(.rel.iplt)
.rel.iplt 0x0000000000008000 0x0 wo.s.o
[!provide] PROVIDE (__rel_iplt_end = .)

.rela.dyn 0x0000000000008000 0x0
*(.rela.init)
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
*(.rela.fini)
*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
*(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
*(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
*(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
*(.rela.ctors)
*(.rela.dtors)
*(.rela.got)
*(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
[!provide] PROVIDE (__rela_iplt_start = .)
*(.rela.iplt)
[!provide] PROVIDE (__rela_iplt_end = .)

.rel.plt
*(.rel.plt)

.rela.plt
*(.rela.plt)

.init
*(SORT_NONE(.init))

.plt
*(.plt)

.iplt 0x0000000000008000 0x0
*(.iplt)
.iplt 0x0000000000008000 0x0 wo.s.o

.text 0x0000000008000000 0x140
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
*(.text.exit .text.exit.*)
*(.text.startup .text.startup.*)
*(.text.hot .text.hot.*)
*(.text .stub .text.* .gnu.linkonce.t.*)
.text 0x0000000008000000 0x140 wo.s.o
*(.gnu.warning)
*(.glue_7t)
.glue_7t 0x0000000008000140 0x0 linker stubs
*(.glue_7)
.glue_7 0x0000000008000140 0x0 linker stubs
*(.vfp11_veneer)
.vfp11_veneer 0x0000000008000140 0x0 linker stubs
*(.v4_bx)
.v4_bx 0x0000000008000140 0x0 linker stubs

.fini
*(SORT_NONE(.fini))
[!provide] PROVIDE (__etext = .)
[!provide] PROVIDE (_etext = .)
[!provide] PROVIDE (etext = .)

.rodata
*(.rodata .rodata.* .gnu.linkonce.r.*)

.rodata1
*(.rodata1)

.ARM.extab
*(.ARM.extab* .gnu.linkonce.armextab.*)
[!provide] PROVIDE (__exidx_start = .)

.ARM.exidx
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
[!provide] PROVIDE (__exidx_end = .)

.eh_frame_hdr
*(.eh_frame_hdr)
*(.eh_frame_entry .eh_frame_entry.*)

.eh_frame
*(.eh_frame)
*(.eh_frame.*)

.gcc_except_table
*(.gcc_except_table .gcc_except_table.*)

.gnu_extab
*(.gnu_extab*)

.exception_ranges
*(.exception_ranges .exception_ranges*)
0x0000000008010140 . = (ALIGN (CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 0x1)))

.eh_frame
*(.eh_frame)
*(.eh_frame.*)

.gnu_extab
*(.gnu_extab)

.gcc_except_table
*(.gcc_except_table .gcc_except_table.*)

.exception_ranges
*(.exception_ranges .exception_ranges*)

.tdata 0x0000000008010140 0x0
[!provide] PROVIDE (__tdata_start = .)
*(.tdata .tdata.* .gnu.linkonce.td.*)

.tbss
*(.tbss .tbss.* .gnu.linkonce.tb.*)
*(.tcommon)

.preinit_array 0x0000000008010140 0x0
[!provide] PROVIDE (__preinit_array_start = .)
*(.preinit_array)
[!provide] PROVIDE (__preinit_array_end = .)

.init_array 0x0000000008010140 0x0
[!provide] PROVIDE (__init_array_start = .)
*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))
*(.init_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .ctors)
[!provide] PROVIDE (__init_array_end = .)

.fini_array 0x0000000008010140 0x0
[!provide] PROVIDE (__fini_array_start = .)
*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))
*(.fini_array EXCLUDE_FILE(*crtend?.o *crtend.o *crtbegin?.o *crtbegin.o) .dtors)
[!provide] PROVIDE (__fini_array_end = .)

.ctors
*crtbegin.o(.ctors)
*crtbegin?.o(.ctors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
*(SORT_BY_NAME(.ctors.*))
*(.ctors)

.dtors
*crtbegin.o(.dtors)
*crtbegin?.o(.dtors)
*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
*(SORT_BY_NAME(.dtors.*))
*(.dtors)

.jcr
*(.jcr)

.data.rel.ro
*(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*)
*(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*)

.dynamic
*(.dynamic)

.got 0x0000000008010140 0x0
*(.got.plt)
*(.igot.plt)
.igot.plt 0x0000000008010140 0x0 wo.s.o
*(.got)
*(.igot)

.data 0x0000000008010140 0x0
0x0000000008010140 __data_start = .
*(.data .data.* .gnu.linkonce.d.*)
.data 0x0000000008010140 0x0 wo.s.o

.data1
*(.data1)
0x0000000008010140 _edata = .
[!provide] PROVIDE (edata = .)
0x0000000008010140 . = .
0x0000000008010140 __bss_start = .
0x0000000008010140 __bss_start__ = .

.bss 0x0000000008010140 0x0
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
.bss 0x0000000008010140 0x0 wo.s.o
*(COMMON)
0x0000000008010140 . = ALIGN ((. != 0x0)?0x4:0x1)
0x0000000008010140 _bss_end__ = .
0x0000000008010140 __bss_end__ = .
0x0000000008010140 . = ALIGN (0x4)
0x0000000008010140 . = SEGMENT_START ("ldata-segment", .)
0x0000000008010140 . = ALIGN (0x4)
0x0000000008010140 __end__ = .
0x0000000008010140 _end = .
[!provide] PROVIDE (end = .)

.stack 0x0000000000080000 0x0
0x0000000000080000 _stack = .
*(.stack)

.stab
*(.stab)

.stabstr
*(.stabstr)

.stab.excl
*(.stab.excl)

.stab.exclstr
*(.stab.exclstr)

.stab.index
*(.stab.index)

.stab.indexstr
*(.stab.indexstr)

.comment
*(.comment)

.debug
*(.debug)

.line
*(.line)

.debug_srcinfo
*(.debug_srcinfo)

.debug_sfnames
*(.debug_sfnames)

.debug_aranges
*(.debug_aranges)

.debug_pubnames
*(.debug_pubnames)

.debug_info
*(.debug_info .gnu.linkonce.wi.*)

.debug_abbrev
*(.debug_abbrev)

.debug_line
*(.debug_line .debug_line.* .debug_line_end)

.debug_frame
*(.debug_frame)

.debug_str
*(.debug_str)

.debug_loc
*(.debug_loc)

.debug_macinfo
*(.debug_macinfo)

.debug_weaknames
*(.debug_weaknames)

.debug_funcnames
*(.debug_funcnames)

.debug_typenames
*(.debug_typenames)

.debug_varnames
*(.debug_varnames)

.debug_pubtypes
*(.debug_pubtypes)

.debug_ranges
*(.debug_ranges)

.debug_macro
*(.debug_macro)

.debug_addr
*(.debug_addr)

.ARM.attributes
0x0000000000000000 0x21
*(.ARM.attributes)
.ARM.attributes
0x0000000000000000 0x21 wo.s.o
*(.gnu.attributes)

.note.gnu.arm.ident
*(.note.gnu.arm.ident)

/DISCARD/
*(.note.GNU-stack)
*(.gnu_debuglink)
*(.gnu.lto_*)
OUTPUT(wo.s.elf elf32-littlearm)
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
00000000  00 20 00 20 a9 00 00 08  00 00 00 00 00 00 00 00  |. . ............|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000000a0  00 00 00 00 01 01 00 08  1b 48 01 68 41 f4 01 61  |.........H.hA..a|
000000b0  01 60 1a 48 01 68 21 f4  70 01 41 f4 80 11 01 60  |.`.H.h!.p.A....`|
000000c0  17 48 4f f0 04 01 01 60  16 48 4f f4 7a 71 01 60  |.HO....`.HO.zq.`|
000000d0  15 48 4f f4 fa 61 01 60  14 48 4f f0 01 01 01 60  |.HO..a.`.HO....`|
000000e0  13 48 4f f0 01 01 01 60  bf f3 4f 8f 0c 48 4f f0  |.HO....`..O..HO.|
000000f0  01 01 01 60 0f 48 4f f0  00 71 01 60 30 bf fd e7  |...`.HO..q.`0...|
00000100  0d 48 01 68 21 f0 01 01  01 60 0c 48 01 68 81 f4  |.H.h!....`.H.h..|
00000110  00 51 01 60 70 47 00 00  18 10 02 40 04 10 01 40  |.Q.`pG.....@...@|
00000120  00 2c 01 40 28 2c 01 40  2c 2c 01 40 0c 2c 01 40  |.,.@(,.@,,.@.,.@|
00000130  14 2c 01 40 00 e1 00 e0  10 2c 01 40 0c 10 01 40  |.,.@.....,.@...@|
00000140
Результат не отличается от исходного:
Bash
1
cmp --verbose with.s.image wo.s.image
Добавлено через 31 минуту

Не по теме:

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

0
08.06.2021, 11:01

Не по теме:

Цитата Сообщение от politoto Посмотреть сообщение
Ещё бы неплохо переименовать тему так, чтобы было понятнее, что мы хотим поморгать светодиодом по прерыванию от таймера.
предложи как?
еще неплохо бы и ассемблер указать и что светодиод не на ножках таймера

0
08.06.2021, 11:26

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
предложи как?
stm32f103 примитивная работа с таймерами на ассемблере

0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
08.06.2021, 18:13  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
пришлось бы обязательно.
я скажу, что без .text програма не работает. выходит что обязательно?

Добавлено через 10 минут
politoto, уважаемые обитательи форума мне говорили, что адрес конца стека равен 0x20005000 и поправляли меня когда я указывал иные значения, но тут адрес 0x20002000 и только с этим адресом работает програмка. почему?

Добавлено через 14 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Согласно правилам форума, если спрашивающий сам находит ответ, стоит выложить его на форум
я выложил. но ответ нашел не сам.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Я потому и не даю готового решения...
я не пойму к чему это вы начинаете? помините наш раговор о стеке? про адрес 0x20005000? почему в примере что выше, который я скопипастил адрес 0x20002000 и только он только он правильный, а правильный он потому, что при других значениях програма не работает. а как же 0x20005000?
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,070
08.06.2021, 19:28
Вот дизасм одного из моих проектов:
Code
1
2
3
4
5
6
7
8
08000000 <g_pfnVectors>:
 8000000:   20005000    andcs   r5, r0, r0
 8000004:   080001dd    stmdaeq r0, {r0, r2, r3, r4, r6, r7, r8}
 8000008:   08000221    stmdaeq r0, {r0, r5, r9}
 800000c:   08000221    stmdaeq r0, {r0, r5, r9}
 8000010:   08000221    stmdaeq r0, {r0, r5, r9}
 8000014:   08000221    stmdaeq r0, {r0, r5, r9}
 8000018:   08000221    stmdaeq r0, {r0, r5, r9}
20005000 в наличии, код работоспособен.
Где вы в своем проекте ошиблись я не знаю. Если не забуду, посмотрю. Вы с этим кодом игрались Stm32f103 примитивная работа с таймерами на ассемблере ?

Добавлено через 52 секунды
То, что дизасм пытается дизассемблировать адреса как код внимания не обращайте. Для него ведь что то числа, что это.

Добавлено через 30 минут
Как и обещал, проверяю: замена вершины стека на 0x2000'5000 работе не мешает. Если убрать .text, работе это тоже не мешает. "Даже" если убрать .global TIM1_UP_isr, тоже ничего не ломается.
Код:
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
.syntax unified
.cpu cortex-m3
.thumb
 
RCC_APB2ENR = 0x40021018
RCC_APB2ENR_IOPCEN = (1 << 4)
RCC_APB2ENR_TIM1EN = (1 << 11)
 
GPIOC_CRH = 0x40011004
 
TIM1_CR1 = 0x40012c00
TIM_CR1_URS = (1 << 2)
TIM_CR1_CEN = (1 << 0)
 
TIM1_PSC = 0x40012c28
TIM1_ARR = 0x40012c2c
 
TIM1_DIER = 0x40012c0c
TIM_DIER_UIE = (1 << 0)
 
TIM1_EGR = 0x40012c14
TIM_EGR_UG = (1 << 0)
 
NVIC_ISER0 = 0xe000e100
TIM1_UP = (1 << 25)
 
TIM1_SR = 0x40012c10
TIM_SR_UIF = (1 << 0)
 
GPIOC_ODR = 0x4001100c
 
 
    .word   0x20005000
    .word   _start + 1
    .space  0x9c
    .word   TIM1_UP_isr + 1
 
_start:
    ldr    r0, =RCC_APB2ENR
    ldr    r1, [r0]
    orr    r1, #(RCC_APB2ENR_TIM1EN | RCC_APB2ENR_IOPCEN)
    str    r1, [r0]
 
    ldr    r0, =GPIOC_CRH
    ldr    r1, [r0]
    and    r1, #0xFF0FFFFF
    orr    r1, #0x00100000
    str    r1, [r0]
 
    ldr    r0, =TIM1_CR1
    ldr    r1, =TIM_CR1_URS
    str    r1, [r0]
 
    ldr    r0, =TIM1_PSC
    ldr    r1, =1000
    str    r1, [r0]
 
    ldr    r0, =TIM1_ARR
    ldr    r1, =2000
    str    r1, [r0]
 
    ldr    r0, =TIM1_DIER
    ldr    r1, =TIM_DIER_UIE 
    str    r1, [r0]
 
    ldr    r0, =TIM1_EGR
    ldr    r1, =TIM_EGR_UG
    str    r1, [r0]
 
    dsb
 
    ldr    r0, =TIM1_CR1
    ldr    r1, =TIM_CR1_CEN
    str    r1, [r0]
 
    ldr    r0, =NVIC_ISER0
    ldr    r1, =TIM1_UP
    str    r1, [r0]
 
loop:
    wfi
    b loop
 
TIM1_UP_isr:
    ldr    r0, =TIM1_SR
    ldr    r1, [r0]
    bic    r1, #TIM_SR_UIF
    str    r1, [r0]
 
    ldr    r0, =GPIOC_ODR
    ldr    r1, [r0]
    eor    r1, #(1 << 13)
    str    r1, [r0]
 
    bx lr
Компиляция и прошивка:
Code
1
2
3
4
arm-none-eabi-as main.s -o main.o
arm-none-eabi-ld -Ttext 0x8000000 -e 0 main.o -o main.elf
arm-none-eabi-objcopy main.elf -Obinary main.obj
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "init" -c "reset halt" -c "flash write_image erase main.obj 0x08000000" -c "reset run" -c "exit"
Цитата Сообщение от pcmax Посмотреть сообщение
почему в примере что выше, который я скопипастил адрес 0x20002000 и только он только он правильный, а правильный он потому, что при других значениях програма не работает. а как же 0x20005000?
Ответ: кто ж вас знает где вы накосячили. Проблема точно не в коде.
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
08.06.2021, 19:39  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Проблема точно не в коде.
ну что ж, это радует. но речь была о том, что програмка работает только с теми значениями ,которые указаны в скопипастеном коде. если я меняю адрес конца стека, c 0x20002000 на 0x20005000 то светодиод даже не загорается. а без секции .text програмка у меня даже не шьется в микроконтроллер. я просто задал вопрос вам специалистам, чтобы понять что и почему так. блин, это загадка для меня
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,070
08.06.2021, 20:33
Я же привел код, в котором все "поломано" как вы сказали. И команды для сборки и прошивки. Вы ее вообще проверяли?
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
08.06.2021, 20:40
Цитата Сообщение от pcmax Посмотреть сообщение
уважаемые обитательи форума мне говорили, что адрес конца стека равен 0x20005000 и поправляли меня когда я указывал иные значения, но тут адрес 0x20002000 и только с этим адресом работает програмка. почему?
размер ОЗУ учитываешь? у каждого камня он разный
1
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,070
08.06.2021, 21:13
В Пилюлях же вроде C8T6 используются. У них 20 кБ.
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
08.06.2021, 23:33  [ТС]
COKPOWEHEU,
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
в котором все "поломано" как вы сказали.
я так сказал? или вы так поняли? я утверждаю, что секция .text нужна. некоторые утверждают, что нет. я спросил про стек. потому что мы с вами в прошлых темах разошлись во мнения касаемо его. и да, программа на моей железке ведет себя странно. то запустится , то не запустится. то работает, то не работает. и если я запускаю ее из sram то многих проблем удается избежать. вот и все. а в чем причина я не знаю.

Добавлено через 7 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
у каждого камня он разный
да. но на моем кажется 64кб.
Code
1
.space  0x9c
зачем?
0
 Аватар для COKPOWEHEU
4146 / 2724 / 433
Регистрация: 09.09.2017
Сообщений: 12,070
09.06.2021, 02:26
Цитата Сообщение от pcmax Посмотреть сообщение
я так сказал? или вы так поняли?
Вы утверждали, что если "поломать" начальное значение стека и объявления секций, то работать не будет.
Цитата Сообщение от pcmax Посмотреть сообщение
мы с вами в прошлых темах разошлись во мнения касаемо его
Да?
Цитата Сообщение от pcmax Посмотреть сообщение
если я запускаю ее из sram то многих проблем удается избежать. вот и все. а в чем причина я не знаю.
Это уже больше похоже на аппаратную проблему. Может с питанием что-то, может boot плохо подтянуты. Может просто камень бракованный попался.
Цитата Сообщение от pcmax Посмотреть сообщение
да. но на моем кажется 64кб.
Флешку с ОЗУ не путайте. 64 кБ это флеш.
Каково полное название вашего контроллера, STM32F103C8T6?
Цитата Сообщение от pcmax Посмотреть сообщение
.space 0x9c
зачем?
Чтобы выполняемый код не залезал на таблицу прерываний. В реальных программах таблицу векторов прописывают полностью, там этот .space не нужен. Потому что стартап файл (где проводится инициализация и находится таблица) штука общая, его менять от проекта к проекту не нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.06.2021, 02:26

Работа с таймерами
Здравствуйте. Делаю проект типа &quot;Приложение Windows Forms&quot;. Вопрос по коду ниже. procedure anim(pb: picturebox); var i: real; ...

Работа с двумя таймерами
Кто-нибудь знает как работать с таймерами???!!! Если да, помогите, пожалуйста, написать код по этому заданию: Программа должна три...

Работа с таймерами и стилями
Доброе время суток,уважаемые программисты. Есть следующая задача. 1. Через t1 окно изменяет стиль, через t2 окно изменяет цвет. 2. Окно...

Работа с двумя таймерами
Вопрос. Есть необходимость работы с двумя таймерами. Но с разным приоритетом. Так, чтобы один таймер мог прерывать работу обработчика...

Работа с таймерами в Xmega
Добрый день. Помогите пожалуйста с настройкой таймеров Xmego32A4. Что то я в этих регистрах настройки совсем запутался... :( По...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
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
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru