STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="a5021",url="/forum/viewtopic.php?p=3626679#p3626679"]что делает нижеследующий алгоритм[/uquote]Для начала, лишает автора премии. Затем, если компилятор принципиальный, то

Код: Выделить всё

Error[Pe144]: a value of type "uint32_t volatile *" cannot be used to initialize an entity of type "int volatile *"
И только если уговорить компилятор, то 1 Гц на выходе. В чём вопрос то? Причём тут "алгоритмическое воображение", если тут надо тупо знать регистры конкретного чипа?
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

В коде вы смогли разглядеть смысл только меньшей части, а именно инициализацию таймера. Придирку насчет предупреждения компилятора принимаю, но только, как придирку. Ваш вопрос насчет "причем тут" справедлив, но должен быть задан самому себе. В общем, вы не справились.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Код: Выделить всё

for(__O int *i = &GPIOC->ODR;; *i = TIM2->CNT & GPIO_ODR_ODR13);
Вот с этой хренью не справился?

Код: Выделить всё

//for(__O int *i = &GPIOC->ODR;; *i = TIM2->CNT & GPIO_ODR_ODR13);
        LDR.N    R0,??main_0      ;; 0x4001100c
        LDR.N    R1,??main_0+0x4  ;; 0x40000024
??main_1:
        LDR      R2,[R1, #+0]
        AND      R2,R2,#0x2000
        STR      R2,[R0, #+0]
        B.N      ??main_1
Ну, да, конечно.

Код: Выделить всё

for(;;) GPIOC->ODR = TIM2->CNT & GPIO_ODR_ODR13;
Найди отличие

Код: Выделить всё

        LDR.N    R0,??main_0      ;; 0x4001100c
        LDR.N    R1,??main_0+0x4  ;; 0x40000024
//for(;;) GPIOC->ODR = TIM2->CNT & GPIO_ODR_ODR13;
??main_1:
        LDR      R2,[R1, #+0]
        AND      R2,R2,#0x2000
        STR      R2,[R0, #+0]
        B.N      ??main_1
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3626839#p3626839"]Вот с этой хренью не справился?[/uquote]
Вообще ни с чем. Конкретный вопрос был задан в самом начале. Вместо ответа на него, вы блистаете азами владения средой разработки. Из исходного кода смогли получить листинг дизасемблера. Ну тоже наверное достижение.
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

Эй, котаны! https://www.youtube.com/watch?v=JqDCFxEmPIU
теперь куб прямо в среду встроен :)))
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="a5021",url="/forum/viewtopic.php?p=3626862#p3626862"]Конкретный вопрос был задан в самом начале.[/uquote]Ну давай почитаем конкретный вопрос.
В качестве средства для развития алгоритмического воображения, предлагаю определить, что делает нижеследующий алгоритм, будучи запущенным на F103 c частотой 72мгц.
И почитаем конкретный ответ[uquote="VladislavS",url="/forum/viewtopic.php?p=3626725#p3626725"]И только если уговорить компилятор, то 1 Гц на выходе.[/uquote]

[uquote="a5021",url="/forum/viewtopic.php?p=3626862#p3626862"]Вместо ответа на него, вы блистаете азами владения средой разработки. Из исходного кода смогли получить листинг дизасемблера. Ну тоже наверное достижение.[/uquote]А это чтобы у тебя не было возможности юлить и фантазировать, что там что-то "волшебное" происходит. И что даже эту глупость без ошибки не смог написать. Ну вот объясни, зачем было марать нам мониторы вот этой какашкой

Код: Выделить всё

for(__O int *i = &GPIOC->ODR;; *i = TIM2->CNT & GPIO_ODR_ODR13);
вместо понятного и ошибкоустойчивого

Код: Выделить всё

for(;;) GPIOC->ODR = TIM2->CNT & GPIO_ODR_ODR13;
???
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3626914#p3626914"]Ну вот объясни, зачем было марать нам мониторы вот этой какашкой[/uquote]
Отдыхайте, товарищ, праздники все-таки. Предлагаю лучше подождать, когда кто-нибудь разглядит в чем фишка.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Ok, давай сделаем многозначительную паузу. Глядишь от этого цикл из трёх ассемблерных команд заиграет новыми красками :)))
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

То-то смеху будет, когда заиграет. Не ухудшайте своего бедственного положения, мой вам совет.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2198
Зарегистрирован: Ср мар 14, 2007 01:50:10

Сообщение Adusik »

Подскажите пожалуйста, есть прошивка для STM32F042C4T6, тактируется от внешнего кварца на 16мГц. Будет ли она работать в чипе STM32F072C8T6?
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Будет.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2198
Зарегистрирован: Ср мар 14, 2007 01:50:10

Сообщение Adusik »

Спасибо!
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Компактный код для организации микросекундных задержек по таймеру на STM32F0:

Код: Выделить всё

__STATIC_INLINE void udelay(uint32_t micros) {
  TIM14->SR = TIM14->CNT = 0;
  TIM14->ARR = micros * 8 - 1;
  while (TIM14->CR1 = TIM14->SR + 1 & TIM_SR_UIF) { ; }
}
Можно даже без оформления в процедуру или макрос вставлять в текст программы по мере надобности. Подразумевается, что рабочая частота мк равна 8мгц и тактирование TIM14 включено. Из любопытного, советую обратить внимание на то, каким образом запускается и останавливается таймер. Чем то это напоминает "трюк" из предыдущей загадки. Специалистам по предупреждениям компилятора уже можно начинать голосить. Тут тоже будет предупреждение внутри while().
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="a5021",url="/forum/viewtopic.php?p=3628186#p3628186"]Компактный код для организации микросекундных задержек по таймеру на STM32F0[/uquote]
Так не проще?

Код: Выделить всё

__STATIC_INLINE void udelay(uint32_t us)
{
	TIM14->CNT = 0;
	TIM14->CR1 = TIM_CR1_CEN;
	while (TIM14->CNT < us * 8 - 6) {}
	TIM14->CR1 = 0;
}
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

А чем проще-то ? Четыре строки против трех. Какие-то шестерки неизвестного свойства. Да и не по канону как-то -- таймер в железе умеет считать до нужной позиции, чтобы не заниматься этим в софтах.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="a5021",url="/forum/viewtopic.php?p=3628253#p3628253"]А чем проще-то ? Четыре строки против трех. Какие-то шестерки неизвестного свойства.[/uquote]
Мой пример предельно простой, генерируемый код будет чуть меньше и никаких предупреждений компилятора(у меня еще и подчеркивание добавляется). Шестерка там нашару взята, чтобы примерно компенсировать время прошедшее после чтения CNT, но она точно лучше единички.
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Тогда так:

Код: Выделить всё

__STATIC_INLINE void u_delay(uint32_t us) {
   TIM14->CNT = 0;
   while (TIM14->CR1 = (TIM14->CNT < us * 8 - 6)) { ; }
}
или даже так:

Код: Выделить всё

#define U_DELAY(US) for(TIM14->CNT = 0; TIM14->CR1 = TIM14->CNT < (US) * 8 - 6;) { ; }
:-)
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="a5021",url="/forum/viewtopic.php?p=3628274#p3628274"]Тогда так:[/uquote]
Вообще ты прав, правильнее проверять флаг, потому что если задана большая задержка и какое-то тяжелое прерывание будет длиться до переполнения таймера, то он начнет ждать по-новой... Но тогда уже так, в байтах все равно размер одинаковый:

Код: Выделить всё

__STATIC_INLINE void udelay(uint32_t micros) 
{
	TIM14->SR = TIM14->CNT = 0;
	TIM14->ARR = micros * 8 - 1;
	TIM14->CR1 = TIM_CR1_CEN;
	while (!TIM14->SR) {}
	TIM14->CR1 = 0;
}
Больше на 2 строки, но понятно и никто волнистой линией ничего не подчеркивает :)
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Не. В этом варианте ошибка в

Код: Выделить всё

while (!TIM14->SR) {}
С первым тиком таймера в TIM14_SR встанет флаг CC1IF и цикл закончится.
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="a5021",url="/forum/viewtopic.php?p=3628288#p3628288"]

Код: Выделить всё

while (!TIM14->SR) {}
С первым тиком таймера в TIM14_SR встанет флаг CC1IF и цикл закончится.[/uquote]
Нет, если в CCR1 ноль, но флаг выставится вместе с апдейтом, потому что там проверка на равенство, то что после первого цикла в счетчике станет 1 и она больше 0 значения не имеет.
Ответить

Вернуться в «ARM»