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
()
Ответ на: комментарий от vM

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

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

мы это перенаправили?

это вопрос. учили чем вопрос отличпется от утверждения?

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

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

Изучить - нет. Максимум попробовать. В том смысле что регистр сам по себе обычно ничего не значит, то есть изучать надо периферию. А изучать периферию проще сразу написанием кода, который с ней будет взаимодействовать. Отладчиком там разве что на начальном этапе поколдовать можно, подобрать значения чтобы она запустилась хоть как-то.

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

если ты чего то не видел это не значит что этого нет.

Но если этого не видел никто, более того, никто не видел даже отдаленных последствий, правильнее считать что этого нет. Иначе получится чайник Рассела.

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

Remap (комментарий) я не знаю че те нужно , но может это тебя устроит. ты пишешь

Где перенаправляли ADC12_IN9 ?

я тебе сказал что сам спрашиваю. перенаправили ли мы ADC12_IN9 ? и если нет то почему. ты пишешь мне и спрашиваешь где я перенаправил ADC12_IN9? ч те говорю что сам задаю этот же вопрос. спроси тех людей которые говорят что надо перенаправить ТIM3 но не перенаправляют ADC12_IN9. спроси его Remap (комментарий) то есть себя не будет ли мешать ADC12_IN9?

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

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

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

вы правы. но если бы я изучал МК 5-7 лет как вы то уж точно перестал бы путаться

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

О постигший великую мудрость программирования микроконтроллеров! Снизойди до общения со мной и при открой мне занавесу тайны! Скажи почему тут ненужен NVIC?

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

Для аппаратного моргателя на PWM, уважаемый anonymous?

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

почему тут ненужен NVIC?

потому что на PB1 есть выход с таймера - по умолчанию (дефолтный конфиг после сброса) с TIM3_CH4, после переключения через регистр AFIO_MAPR подключили инверсный выход 3-го канала TIM1 (TIM1_CH3N) и таймер им управляет сам - низкий уровень пока TIM_CNT < TIM_CCR3, высокий в остальное время периода (TIM_ARR).

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

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

потому что на PB1 есть выход с таймера - по умолчанию

А как это помечено? Буквой, цифрой? Как узнать что пин имеет выход с таймера по умолчанию?

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

А как это помечено? Буквой, цифрой? Как узнать что пин имеет выход с таймера по умолчанию?

В даташите (не в рефмане, а именно в даташите) есть таблица выводов относительно разных корпусов. В частности, PinName (какому GPIO он соответствует), функции по умолчанию и функции при ремапе.

Для PB1:

LFBGA100LQFP48TFBGA64LQFP64LQFP100VFQFN36Pin nameTypeI/O LevelMain functionAltername functionRemap
K419G5273616PB1I/O PB1ADC12_IN9/TIM3_CH4TIM1_CH3N

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

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

Уважаемый Anonymous выше уже объяснил: Remap (комментарий)

инверсный выход 3-го канала TIM1 (TIM1_CH3N) и таймер им управляет сам - низкий уровень пока TIM_CNT < TIM_CCR3, высокий в остальное время периода (TIM_ARR).

В Reference manual (RM0008) есть картинка (временная диаграмма) на странице

14.3.11 Complementary outputs and dead-time insertion

The advanced-control timers (TIM1 and TIM8) can output two complementary signals 
and manage the switching-off and the switching-on instants of the outputs
vM ★★
()
Ответ на: комментарий от Assembler

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

CH3 и CH3N это прямой и инверсный выходы. Когда на прямом выходе лог.1, на инверсном лог.0 и наоборот. В реальной жизни это используется для управления верхним и нижним плечом полумоста. Скажем, для управления мощной нагрузкой или первичной обмоткой трансформатора. Но силовые ключи - штуки инерционные, и если одновременно поменять сигнал на верхнем и нижнем плече, во время переходного процесса ток пойдет через них обоих - почти короткое замыкание. Поэтому между переключениями добавляется так называемое «мертвое время», dead time.

Теоретически этого можно добиться использованием Phase-correct PWM или несколькими таймерами, но раз задача типичная, можно несколько усложнить логику кристалла и реализовать ее более эффективно. Собственно это и сделано парой каналов CHx / CHxN - прямой и инверсный выходы с задержкой между ними.

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

Даже интересно стало догадывается ли ТС для чего вообще нужен ремап. Не в смысле «чтобы перебрасывать периферию между ногами» - такой задачи не бывает - а в смысле для решение какого класса задач он упрощает.

То, что он о нем спросил не из желания изучить и использовать очевидно (иначе бы изучал и использовал). Но хотя бы в общих чертах, теоретически.

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

догадываюсь

…но озвучить свои догадки боитесь - вдруг они окажутся неверными?

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

решение какого класса задач он упрощает

Разводка плат Иногда совмещение интерфейсных и сигнальных функций на одном выводе (допустим для автоопределения скорости uart через таймер) Просто когда нужно сделать универсальный чип с малым количеством ног (наподобие attiny85).

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

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

Разводка плат Иногда совмещение интерфейсных и сигнальных функций на одном выводе (допустим для автоопределения скорости uart через таймер) Просто когда нужно сделать универсальный чип с малым количеством ног (наподобие attiny85).

Согласен. Еще можно добавить случай когда на одних и тех же ногах висит разная периферия, которая нужна одновременно. Например, тот же TIM1_CH3N конфликтует с SPI2_MOSI, а вот после ремапа - только с АЦП. Или I2C1 конфликтует с ремапом UART1.

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