LINUX.ORG.RU

Remap

 


0

1

здорово други. умеет кто-нибудь делать ремап? МК stm32f103. неиочень понимаю как работает ремап, если несложно то может кто скажет в чем смысл, ну и главное как его сделать? например

PB1 вижу что можно вроде с TIM3_C4 на TIM1_C3.
нашел сто рублей сегодня дома поэтому могу их скинуть в знак благодарности. чтобы было еще проще то можно взять код уважаемого анонаймуса и сделать ремап на его примере
.syntax unified
.cpu cortex-m3
.thumb
 
RCC_APB2ENR = 0x40021018
GPIOC_CRH =0x40010804
 
 
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 =0x4001080C 
 
.text
    .word   0x20005000
    .word   _start + 1
    .space  0x9c
    .word   TIM1_UP_isr + 1
 
.global _start
_start:
    //ldr    r0, =RCC_APB2ENR
ldr r0, =0x40021018
    ldr    r1, =0b00000000000000000000100000000101 //enable TIM1, AFIOEN, IOPAEN
    str    r1, [r0]
 
 
 
    ldr    r0, =GPIOC_CRH
    ldr    r1, =0b00000000000000000000000000001001 //eanble  Alternate function output Push-pull 10 MHZ
       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, =1000
    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]
 
ldr r0, =0x40012C44
ldr r1, =0b00000000000000001100000000000000 //eanble MOE and AOE
str r1, [r0]
 
ldr r0, =0x40012C20
ldr r1, =0b00000000000000000000000000000001 //enable CC1E
str r1, [r0]
 
 
ldr r0, =0x40012C18
ldr r1, =0b0000000000000000000000000111000
str r1, [r0]
 
 
 
 
 
 
 
    ldr    r0, =TIM1_CR1
    ldr    r1, =TIM_CR1_CEN
    str    r1, [r0]
 
    ldr    r0, =NVIC_ISER0
    ldr    r1, =0b00000010000000000000000000000000 //установил  25Бит в единицу.
    str    r1, [r0]
 
loop:
    
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 << 8)
    str    r1, [r0]
 
    bx lr

В понедельник да с такими вопросами

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

Где такое говорил автор темы? Чем тыкать без понимания лучше спросить если не знаешь а уже потом читать и разбираться имея пример. Все правильно он делает.

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

А это ты))) товарищ который противоречит сам себе) толку с тебя конечно никакого лишь для поднятия настроения.

anonymous
()

Подожди немного

anonymous
()
ldr    r0, =TIM1_CR1
ldr    r1, =TIM_CR1_URS
str    r1, [r0]

нопеши макрас:

.macro Store io_reg, value
   ldr r0, =\io_reg
   ldr r1, =\value
   str r1, [r0]
.endm

и пеши в сваей праграме:

Store TIM1_CR1,  TIM_CR1_URS
Store GPIOC_CRH, 0b00000000000000000000000000001001
...

будит просще и читатк и песат.

anonymous
()

вижу что можно вроде

и где ты там это видишь, родной? а не хочешь ещё в реф ман заглянуть? там ещё и не такое увидишь.

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

можно взять код уважаемого анонаймуса

нопеши макрас:

Это даже не его код. ТС сам не написал ни строчки и, похоже, это его принципиальная позиция. Так что смысла ему что-то советовать ровно ноль - религия не позволит совет применить.

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

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

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

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

.macro Store io_reg, value
   ldr r0, =\io_reg
   ldr r1, =\value
   str r1, [r0]
.endm


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

anonymous
()

умеет кто-нибудь делать ремап?

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

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

когда программируешь блок регистров периферии можно загрузить базовый адрес один раз а в регистры сторить значения через смещение относительно базового адреса

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

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

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

говённый совет

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

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

удобнее будет в любом случае

нет, макрос говённый и ты тоже - зачем нужна оптимизиция LOC в виде макроса в программе из 20 строк ?

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

А что именно нужно подключить (или отключить) уважаемому @Assembler к PB1 ?

прочитай его вопрос и узнаешь, регистр

AF remap and debug I/O configuration register (AFIO_MAPR)

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

в программе из 20 строк

считать научись.

зачем нужна оптимизиция

чтобы было проще. а вот ты не нужен. покакал тебе не голову, кстати.

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

считать научись

много вас тут говноедов

чтобы было проще

чего проще, говноедом стать как ты ? не нужны тут твои макросы, кому нужны - он на С напишет.

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

макросы, кому нужны - он на С напишет

ты слишком категоричный. макросы — это всего лишь инструмент. если лично тебе он не подходит, то ты его просто не используешь.

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

приветики... просто для понимания ремапа. вот ногу PB1 хочу заремапить с таймера3 на таймер1. afio включил, APB1ENR TIM3 на ней включил. APB2ENR и AFIO с IOPBEN и TIM1 включил . AFIO_MAPR в биты 10 и 11 надо записать 10? или как? что нужно точно сделать напишите пожалуйста

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

то есть чтобы заремапить TIM3 в моем случае нужно отключить ADC12_IN9?

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

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

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

посмотри на код тса. у него все регистры заданы абсолютным значением, а не смещением

Это-то не проблема: адреса заданы вручную, а в своем коде можно и в виде Base+Offset писать а потом соответственно использовать загрузку по смещению.

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

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

да что такое! иди в другие темы. ты случаем не влюблен в меня?

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

в данный момент все операторы заняты, пожалуйста, оставайтесь на линии.

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

И что там нужно включить или выключить?

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

отключить ADC12_IN9? ящас в дороге неожиданно для меня ,и проверить не могу. если несложно то напишите

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

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

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

вот ногу PB1 хочу заремапить с таймера3 на таймер1. afio включил, APB1ENR TIM3 на ней включил. APB2ENR и AFIO с IOPBEN и TIM1 включил . AFIO_MAPR в биты 10 и 11 надо записать 10?

Тогда получится, что CH4 таймера3 подключен к PB1 ?

Bits 11:10 TIM3_REMAP[1:0]: TIM3 remapping

10: Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1)

А Вы хотите CH3N таймера 1 подключить к PB1 ?

Bits 7:6 TIM1_REMAP[1:0]: TIM1 remapping

01: Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1

Функции, которые не должны работать, можно не включать, а если включили, то выключить.

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

Я не как Вы, а, скорее, неначавший. Доедете и распишете.

vM ★★
()
Ответ на: комментарий от vM

А Вы хотите CH3N таймера 1 подключить к PB1 ?

да.

Assembler
() автор топика
PB1 вижу что можно вроде с TIM3_C4 на TIM1_C3

один регистр

	/* TIM3_REMAP = 0b11, TIM3_CH4  PB1 -> PC9
	   TIM1_REMAP = 0b01, TIM1_CH3N PB15 -> PB1 */
	ldr    r0, =AFIO_MAPR
	ldr    r1, =0x00000C40
	str    r1, [r0]

для теста - аппаратный моргатель на PWM TIM1, CH3N переключен на PB1

.syntax unified
.cpu cortex-m3
.thumb

RCC_APB2ENR = 0x40021018
RCC_APB2ENR_AFIOEN = (1 << 0)
RCC_APB2ENR_IOPBEN = (1 << 3)
RCC_APB2ENR_TIM1EN = (1 << 11)

GPIOB_CRL = 0x40010c00
AFIO_MAPR = 0x40010004

TIM1_BASE = 0x40012c00

TIM_CR1 = 0x00
TIM_CR1_CEN = (1 << 0)

TIM_EGR = 0x14
TIM_EGR_UG = (1 << 0)

TIM_CCMR2 = 0x1c
TIM_CCMR2_OC3PE = (1 << 3)
TIM_CCMR2_OC3M_PWM1 = (0x6 << 4)

TIM_CCER = 0x20
TIM_CCER_CC3NE = (1 << 10)

TIM_PSC = 0x28
TIM_ARR = 0x2c
TIM_CCR3 = 0x3c

TIM_BDTR = 0x44
TIM_BDTR_MOE = (1 << 15)

.text
	.word   0x20001000
	.word   _start + 1

.global _start
_start:
	ldr    r0, =RCC_APB2ENR
	ldr    r1, [r0]
	orr    r1, #RCC_APB2ENR_TIM1EN
	orr    r1, #RCC_APB2ENR_IOPBEN
	orr    r1, #RCC_APB2ENR_AFIOEN
	str    r1, [r0]

	/* PB1: Output mode, max speed 2 MHz
	   Alternate function output Push-pull */
	ldr    r0, =GPIOB_CRL
	ldr    r1, [r0]
	and    r1, #0xFFFFFF0F
	orr    r1, #0x000000A0
	str    r1, [r0]

	/* TIM3_REMAP = 0b11, TIM3_CH4  PB1 -> PC9
	   TIM1_REMAP = 0b01, TIM1_CH3N PB15 -> PB1 */
	ldr    r0, =AFIO_MAPR
	ldr    r1, =0x00000C40
	str    r1, [r0]

	ldr    r0, =TIM1_BASE

	ldr    r1, =1000
	str    r1, [r0, #TIM_PSC]

	ldr    r1, =4000
	str    r1, [r0, #TIM_ARR]

	ldr    r1, =2000
	str    r1, [r0, #TIM_CCR3]

	ldr    r1, =(TIM_CCMR2_OC3M_PWM1 | TIM_CCMR2_OC3PE)
	str    r1, [r0, #TIM_CCMR2]

	ldr    r1, =TIM_BDTR_MOE
	str    r1, [r0, #TIM_BDTR]

	ldr    r1, =TIM_CCER_CC3NE
	str    r1, [r0, #TIM_CCER]

	ldr    r1, =TIM_CR1_CEN
	str    r1, [r0, #TIM_CR1]

	ldr    r1, [r0, #TIM_EGR]
	orr    r1, #TIM_EGR_UG
	str    r1, [r0, #TIM_EGR]

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

Показывает, куда что перенаправляется.

А если не перенапралять TIM3,а перенаправить только TIM1 в нашем примере, то TIM3_CH4 не будет мешать?

/*   TIM1_REMAP = 0b01, TIM1_CH3N PB15 -> PB1 */
	ldr    r0, =AFIO_MAPR
	ldr    r1, =0x40
vM ★★
()
Ответ на: комментарий от vM

Если не включать, то не будет. Но кто бы проверил что будет, если завести одновременно две периферии на одну ногу. В ДШ стоит такая сноска:

If several peripherals share the same I/O pin, to avoid conflict between these alternate functions only one peripheral shouldbe enabled at a time through the peripheral clock enable bit (in the corresponding RCC peripheral clock enable register).

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

Просто F103 сделан совершенно безграмотно. Лучше бы ТС начал с F0: там мало того, что RM тоньше, так и всяких косяков намного меньше. И ремап сделан значительно более грамотно: на каждую ногу можно повесить не больше одной альтернативной функции.

Но все-таки, молиться на ассемблер - это бред! Как только ТСу понадобится сделать что-то посложней «блинка», он запутается в своем коде.

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

Чтобы не путаться в своём, разбирайся в чужом. Какие проблемы?

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

Просто F103 сделан совершенно безграмотно. Лучше бы ТС начал с F0

Или с L1, довольно приятный камень. Позиционируется под малопотребляющие устройства, и мне действительно удавалось выжать <10 мкА в режиме сна. В режиме отключения наверное еще меньше было бы, но там память теряется. Плюс в отличие от F103 там есть ЦАПы. Но вот быстродействие пониже, 36 МГц против 72.

Но все-таки, молиться на ассемблер - это бред! Как только ТСу понадобится сделать что-то посложней «блинка», он запутается в своем коде.

Даже если бы он честно писал свои портянки, они пока не про изучение ассемблера, а про изучение регистров периферии. А для ассемблера стоило бы быстренько освоить UART и ковыряться в алгоритмических задачах вроде переключения контекстов, хитрых инструкциях, распределении памяти и т.п. А ровно те знания, что можно получить из подобных вопросов, на Си получаются гораздо проще и быстрее.

Не говоря о том, что запутаться в своем коде ТС не сможет физически, поскольку своего кода у него нет.

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

они пока не про изучение ассемблера, а про изучение регистров периферии.

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

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

ну судя по всему точно что-то не хорошее))))

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

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

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