LINUX.ORG.RU

delay stm32f103

 ,


0

1

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

0xE000E010 ;	Systick_Control_and_Status_Register
0xE000E014 ;  	Systick_Reload_Value_Register
0xE000E018 ;    Systick_Current_Value_Register
0xE000E01C ;    Systick_Calibration_Value_Register
если я хочу чтобы светодиод вспихивал и и гас через 2сек то как правильно нужно написать и расчитать? поправте пожалуйста для начала надо в SYST_CSR в нулевой бит записать '1' и в первый бит также '1'.
адрес SYST_CSR=0xE000E010

.cpu cortex-m3
.thumb
.word 0x2000000
.wort _start

.section .text
.global _start
_start:



mov r5, =0xE000E010
mov r1, #1
str r1, [r5];  пальцем в небеса! ну пусть я попаду в нулевой бит, а как высчитать первый бит?
у меня вопрос к вам, уважаемые форумчане, вот адрес SYST_CSR=0xE000E010, как высчитать его первый, второй и последующие нужные биты? только с помощью побитовых операций? если есть другой способ и описан в документации, то пожалуйста скажите в какой именно ?



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

Как это нет

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

delay stm32f103 (комментарий)

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

Ну а всякие Ардуины, включая HAL, только если уж совсем со сроками плохо и пониманием, что ЭТО потом придется поддерживать.

А с этим я не согласен. Проект должен быть сделан слоями, слои отдельно тестироваться. Тогда HAL можно переносить от одного изделия на следующее, занимаясь только логикой.

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

Как у вас адрес помещается в адрес?

это не у меня, а у автора ссылку на которого вы дали!

Почитайте уже про таблицу векторов прерываний и ее структуру.

теперь уже опасаюсь изсходя из того что прочитал по вашей ссылке.

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

А с этим я не согласен. Проект должен быть сделан слоями, слои отдельно тестироваться. Тогда HAL можно переносить от одного изделия на следующее, занимаясь только логикой.

Что вы понимаете под HAL? Если Hardware abstraction level вообще - то безусловно да. Хотя слоев там может быть больше двух.

А если конкретный HAL от ST, то нет, очень уж он ужасен.

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

это не у меня, а у автора ссылку на которого вы дали!

Что за ссылка-то? Я в этой теме ни на что вроде не ссылался.

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

Вот это писали с нуля на асме?

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

cd libopencm3-master/include/libopencm3/stm32/f1/
for f in *.h; do grep "#define" $f | sed 's/MMIO8\|MMIO16\|MMIO32//' > $(basename $f .h).inc; done

cd libopencm3-master/include/libopencm3/stm32/common
for f in *.h; do grep "#define" $f | sed 's/MMIO8\|MMIO16\|MMIO32//' > $(basename $f .h).inc; done

вот написано на asm вручную

.syntax unified
.cpu cortex-m3
.thumb
.global _start

#include <libopencm3/stm32/f1/memorymap.inc>
#include <libopencm3/stm32/f1/rcc.inc>
#include <libopencm3/stm32/common/timer_common_all.inc>

.text
    stack_pointer_value:    .word   0x20005000
    reset_vector:           .word   _start + 1
    
    _start:
@ RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // enable TIM1 clocking
	ldr    r1, =RCC_APB2ENR
	ldr    r0, [r1]
	orr    r0, r0, #RCC_APB2ENR_TIM1EN
	str    r0, [r1]

@ TIM1->PSC = 8;  // 8MHz
	ldr    r1, =TIM1_PSC
	ldr    r0, =8
	str    r0, [r1]

@ TIM1->ARR = 99; // 100 ticks for 80kHz
	ldr    r1, =TIM1_ARR
	ldr    r0, =99
	str    r0, [r1]

@ TIM1->CCR1 = 49; // 50%
	ldr    r1, =TIM1_CCR1
	ldr    r0, =49
	str    r0, [r1]

@ TIM1->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
	ldr    r1, =TIM1_CCMR1
	ldr    r0, =(TIM_CCMR1_OC1M_PWM1 | TIM_CCMR1_OC1PE)
	str    r0, [r1]

@ TIM1->BDTR = TIM_BDTR_MOE;
	ldr    r1, =TIM1_BDTR
	ldr    r0, =TIM_BDTR_MOE
	str    r0, [r1]

@ TIM1->CCER = TIM_CCER_CC1E;
	ldr    r1, =TIM1_CCER
	ldr    r0, =TIM_CCER_CC1E
	str    r0, [r1]

@ TIM1->CR1 = TIM_CR1_CEN;
	ldr    r1, =TIM1_CR1
	ldr    r0, =TIM_CR1_CEN
	str    r0, [r1]

@ TIM1->EGR |= TIM_EGR_UG;  // generate update event to refresh all
	ldr    r1, =TIM1_EGR
	ldr    r0, [r1]
	orr    r0, r0, #TIM_EGR_UG
	str    r0, [r1]

blink:
        b blink

вот так собирается

cpp -I ./libopencm3-master/include -x assembler-with-cpp blinky.S -o blinky.s
arm-none-eabi-as blinky.s -o blinky.o
arm-none-eabi-ld blinky.o -Ttext=0x08000000 -o blinky.elf
arm-none-eabi-objcopy -O binary blinky.elf blinky.bin

вот так дизассемблировано

arm-none-eabi-objdump -d blinky.elf

вот пример на С, который переписан на asm вручную

static inline void tim1_setup(){
    RCC->APB2ENR |= RCC_APB2ENR_TIM1EN; // enable TIM1 clocking
    TIM1->PSC = 8;  // 8MHz
    TIM1->ARR = 99; // 100 ticks for 80kHz
    TIM1->CCR1 = 49; // 50%
    // PWM mode 1 (active->inactive)
    TIM1->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
    // main output
    TIM1->BDTR = TIM_BDTR_MOE;
    // main PWM output
    TIM1->CCER = TIM_CCER_CC1E;
    // turn it on
    TIM1->CR1 = TIM_CR1_CEN;
    TIM1->EGR |= TIM_EGR_UG; // generate update event to refresh all
}
anonymous
()
Ответ на: комментарий от COKPOWEHEU

Ну после доработки HAL от ST там мало осталось, так что полусамописный HAL, унифицированный сверху между несколькими используемыми контроллерами.

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

вот написано на asm вручную

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

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

В интернате.

По любым форумам учиться - бред. Учиться можно по статьям, книгам. Некоторым вещам (не программированию, конечно) можно даже по видеороликам. Отличие от форумов в том, что материал структурирован, это не три предложения без контекста. А на форуме можно либо уточнить непонятный момент, либо задать конкретный вопрос.

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

Ну после доработки HAL от ST там мало осталось, так что полусамописный HAL, унифицированный сверху между несколькими используемыми контроллерами.

Тут согласен. В темах по ST под HAL’ом чаще подразумевается собственно ST’шная версия, где все настраивается ужасными структурами.

А вот нормальная абстракция поверх периферии это чуть ли не необходимость при мало-мальски большом коде.

Хотя если говорить про обучение, сначала придется без абстракции. Просто потому что сначала надо разобраться какой функционал универсальный, а какой платформо-зависимый.

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