LINUX.ORG.RU

Port configuration register high |bit band

 


0

1

;stm32f103c8 здрасьте здрасьте люди добрые если несложно вам, то подкорректируйте мое понимание, которое сложилось об этом регистре вот небольшой фрагмент программки где пытаюсь настроить pin PC13(GPIOC) на выход.

если mode=00

ТО СNF=
00: Analog mode
01: Floating input (reset state)
10: Input with pull-up / pull-down
11: Reserved

если mode > 0
то 
СNF=
00: [b]General purpose output push-pull[/b] МНЕ НУЖНО ВИДИМО ЭТО
01: General purpose output Open-drain
10: Alternate function output Push-pull
11: Alternate function output Open-drain
и MODE
00: Input mode (reset state)
01: Output mode, max speed 10 MHz.

10: Output mode, max speed 2 MHz. ЭТО НУЖНО потому что не подключаем внешний кварц.

11: Output mode, max speed 50 MHz.
значит в адреса
0x422200D8// это адерс который я высчитал для CNF13(22 бит)
0x422200DC//  это адрес для СNF13(23й бит)

0x422200D0 // это адрес который я высчитал для MODE13(20 бит)
0x422200D4 // это адрес для MODE13(21й бит)

мне нуженo поместить
MODE=0b10
и
СNF=0b00
.cpu cortex-m3
.section .text
.global _start
_start:

mov r5, #0
ldr r3, =0x422200D8
str r5, [r3]// ложу #0 в 22й бит СNF
ldr r3, =0x422200DC 
str r5, [r3]// ложу #0 в 23й бит CNF


mov r5, #1
ldr r3, =0x422200D4
str r5, [r3] //ложу #1 в 21й бит MODE
mov r5, #0
ldr r3, =0x422200D0
str r5, [r3] //ложу #0 в 20й бит
скажите пожалуйста правильно ли я понял?



Последнее исправление: Assembler (всего исправлений: 2)

Вроде правильно. Можно сократить до:

mov r4, #0
mov r5, #1
ldr r3, =0x422200D0  // MODE
str r4, [r3, #0]     // #0 в 20й бит
str r5, [r3, #4]     // #1 в 21й бит
str r4, [r3, #8]     // #0 в 22й бит
str r4, [r3, #12]    // #0 в 23й бит

Ножка PC13 слабая, учти это.

И ещё не советую использовать bit-banding, он далеко не во всех семействах есть.

Beewek ★★
()

В этом случае проще без битбанда:

GPIOC_CRH   = 0x40011004
PC13_SHIFT  = 13 % 8 * 4
PC13_CONFIG = 0b0010

ldr r0, =GPIOC_CRH              @ load GPIOC_CRH address to r0
ldr r1, [r0]                    @ load register value to r1
bic r1, #0b1111 << PC13_SHIFT   @ clear 4 bits corresponding to PC14 config
orr r1, #0b0010 << PC13_SHIFT   @ set new bits values
str r1, [r0]                    @ store r1 value back to GPIOC_CRH register
anonymous
()
Ответ на: комментарий от Beewek

И ещё не советую использовать bit-banding, он далеко не во всех семействах есть.

Да все советуют, только плевал он на советы.

mov r4, #0
mov r5, #1

Я плохо знаю местный ассемблер, но в нем должны быть псевдонимы для регистров. Да даже если нет, через define можно

#define zero r4
#define one r5
mov zero, #0
mov one, #1

Ну и дальше уже использовать их

str r4, [r3, #0]     // #0 в 20й бит
str r5, [r3, #4]     // #1 в 21й бит
str r4, [r3, #8]     // #0 в 22й бит
str r4, [r3, #12]    // #0 в 23й бит

А вот здесь надо следить чтобы все промежуточные значения были валидными. Именно для светодиода это вряд ли важно, но в общем случае - да. Ну и еще один камень в сторону битбанда: человеческим способом 4 бита выставляются одной операцией записи, а не четырьмя.

COKPOWEHEU
()
Последнее исправление: COKPOWEHEU (всего исправлений: 1)
Ответ на: комментарий от COKPOWEHEU

Да все советуют

я просто учусь. 1000 раз сказал уже что я не утверждаю, что так правильно. Делаю так чтобы понять. Вы можете делать так как лучше и удобнее, и понятнее вам.

Assembler
() автор топика
Ответ на: комментарий от Assembler

Что учитесь - хорошо. Плохо что не основам учитесь, а нестандартным трюкам. Почитайте как люди делают:

https://habr.com/ru/post/354670/

https://habr.com/ru/post/490474/

Когда я осваивал VF103 (RISCV) не удалось собрать стартап файл на Си - пришлось изучать ассемблер. Хоть ядро и другое, сам подход может быть полезен: https://habr.com/ru/post/533272/

Ну и именованными константами не пренебрегайте. И сами через неделю забудете что по этому адресу лежит, и помочь никто не сможет, потому что лень шестнадцатеричные числа считать.

COKPOWEHEU
()
Последнее исправление: COKPOWEHEU (всего исправлений: 1)
Ответ на: комментарий от COKPOWEHEU

Да даже если нет, через define можно

Если только ГЦЦ-ой компилировать. Или через препроцессор гонять. В самом асме для Арма нельзя переопределить имена обычных регистров. Векторные, вроде бы, как-то можно было.

anonymous
()

Исходный код Ms-DOS?

anonymous
()
Ответ на: комментарий от COKPOWEHEU

Почитайте как люди делают

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

Assembler
() автор топика
Ответ на: комментарий от anonymous

Я плохо знаю местный ассемблер, но в нем должны быть псевдонимы для регистров. Да даже если нет, через define можно

В самом асме для Арма нельзя переопределить имена обычных регистров. Векторные, вроде бы, как-то можно было.

Оказывается можно, специфичной для ARM директивой:

    my_reg_name .req r0

Удалить алиас можно через .unreq my_reg_name.

anonymous
()
Ответ на: комментарий от Assembler

просто мне интересно и я это хочу освоить.

Что-то непохоже, что ты что-либо пытаешься освоить. Больше похоже на то, как обезьяна тыкает палкой в незнакомый предмет. За миллионы лет практика обучения несколько продвинулась вперед.

anonymous
()
Ответ на: комментарий от Assembler

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

Куда?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.