Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Вс июн 18, 2023 12:26:06

Раскоментируйте TIM17->BDTR |= TIM_BDTR_MOE;

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

Вс июн 18, 2023 21:59:04

Слишком очевидно чтобы не попробовать. Нет, тем это в сложных таймерах, как я понял надо, TIM14 например работает без установки TIM_BDTR_MOE.
Пробовал конечно.

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

Пн июн 19, 2023 18:02:41

Вы не решили этот вопрос?
почитайте про комплементарные выходы с таймера.
в режиме AF2 TIM16/TIM17 PB6/PB7 - это CH1N - упрощенно инверсный выход, если он нужен должен включаться в TIMx->CCER, он не тоже самое что CH1.

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

Вт июн 20, 2023 12:30:09

О да! Спасибо. Вот оно!
Код:
TIM17->CCER  = TIM_CCER_CC1NE;

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

Пт июн 30, 2023 08:50:46

Здравствуйте! Изучаю прерывания на чипе STM32f103c8t6. Сделал инициализацию пина на вход с подтяжкой к питанию и инициализацию самого прерывания exti. Написал функцию обработчика прерываний EXTI0_IRQHandler...Проблема в том, что по прилету события не вызывется сам обработчик прерывания, а по ходу отладки - программа висит в startup_stm32f103xb.s. Есть мысли, в чем я не прав? Буду благодарен за помощь!
Вложения
Code.JPG
(60.32 KiB) Скачиваний: 54
Debug.JPG
(173.1 KiB) Скачиваний: 40

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

Пт июн 30, 2023 09:41:02

Судя по скриншотам, дело происходит в IAR. Проверьте в каком режиме C или C++ собирается код. Если С++, то обрааботчик прерывания должен быть extern "C" void EXTI0_URQHandler().

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

Пт июн 30, 2023 10:44:10

VladislavS, действительно, проглядел. Собирается под С++, сделал определение через extern "C", как Вы порекомендовали, теперь обработчик работает. Спасибо за помощь! :)

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

Ср авг 02, 2023 17:46:37

Эммм... никак не могу понять, когда отправляем по SPI восемь бит зачем читать после?
Те
Код:
  while (!(SPI1->SR & SPI_SR_TXE));
  *(uint8_t *)&SPI1->DR = data;
  while (!(SPI1->SR & SPI_SR_RXNE));
  data = *(uint8_t *)&SPI1->DR;

хотя отправка 16-ти бит вот так работает:
Код:
  while (!(SPI1->SR & SPI_SR_TXE));
  SPI1->DR = data;

(действо происходит с F0 и ST7735).

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

Ср авг 02, 2023 18:39:30

Первый код и передаёт (по MOSI), и принимает (по MISO) данные. Второй только пишет.

Если читать не надо, то и не читайте. Закинули в регистр данные и пошли дальше выполнять другие действия, контроллер аппаратно всё дошлёт параллельно.

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

Ср авг 02, 2023 19:52:58

поясните, плиз, зачем такая конструкция
*(uint8_t *)&
или это, когда data нельзя сделать uint8_t ?

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

Ср авг 02, 2023 20:13:23

Приведение типов

SPI1->DR - с точки зрения C это просто число, равное, например 0x4001300a
&SPI1->DR - это уже указатель на 32-битную ячейку памяти с адресом 0x4001300a
(uint8_t *)&SPI1->DR - это его приведение к указателу на 8-битную ячейку памяти
*(uint8_t *)&SPI1->DR - разыменование такого указателя, то есть само 8-битное число, лежащее в этой ячейке.

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

Ср авг 02, 2023 21:57:21

Эммм... никак не могу понять, когда отправляем по SPI восемь бит зачем читать после?
Затем что так работает SPI - принимает одновременно с передачей.

Добавлено after 3 minutes 40 seconds:
поясните, плиз, зачем такая конструкция
*(uint8_t *)&
или это, когда data нельзя сделать uint8_t ?
Видимо эта команда говорит процессору, что в SPI нужно отправить 8 бит, а не 16. Такой код сгенерит команду STRB (которую можно увидеть в листинге), а не STR или STRH.
Откройте мануал на ваш МК и прочитайте про разрядность записей в регистры SPI и что они определяют.

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

Ср авг 02, 2023 22:44:39

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

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

Чт авг 03, 2023 00:30:33

Затем что так работает SPI - принимает одновременно с передачей.

Ну, насколько я понял, для работы в двух направлениях в F0 надо SPI_CR1_BIDIMODE включать.
В общем методом тыка, очерёдность поменял, работает это:
Код:
  *(uint8_t *)&SPI1->DR = data;
  while (!(SPI1->SR & SPI_SR_TXE));

Если наоборот - нет.

Хотя переключение и передача на 16 бит работает так:
Код:
  SPI1->CR2 &= ~SPI_CR2_FRXTH;
  SPI1->CR2 |= SPI_CR2_DS_3; // переключаемся на 16 бит
  for (uint16_t i=0; i < len; i++)
  {
    while (!(SPI1->SR & SPI_SR_TXE));
    SPI1->DR = color;
  }
  CS_UP;
  SPI1->CR2 |= SPI_CR2_FRXTH;
  SPI1->CR2 &= ~SPI_CR2_DS_3; // обратно на 8 бит

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

Чт авг 03, 2023 00:41:42

Спасибо, понял
вне зависимости от мнения компилятора - принудить к байтовой пересылке, может она быстрее.
не компилятор принудить, а процессору сказать о разрядности. разрядность команды записи как раз это ему и сообщает.
Ну, насколько я понял, для работы в двух направлениях в F0 надо SPI_CR1_BIDIMODE включать.
Я не уверен (так как с F0 не имел дел), но имхо тот бит отвечает за двунаправленную передачу по одной общей линии MOSI/MISO. Я не о том. SPI сам по себе так работает - без передачи не возможен приём (за исключением спец.режимов в некоторых МК).

И именно поэтому в том коде выше нет никакого смысла в первом цикле while(). Достаточно одного 2-го. Лишнее загромождение ненужным кодом.

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

Чт авг 03, 2023 10:48:20

принудить к байтовой пересылке, может она быстрее.
Не быстрее, а запись НУЖНОЙ разрядности. 32, 16 и 8 битные операции записи в регистр данных SPI у некоторых контроллеров приводят к разному результату работы SPI.

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

Чт авг 03, 2023 17:03:25

Кстати: Многоразрядные пересылки могут быть как раз быстрее. В смысле именно физической передачи по SPI. Так как некоторые SPI-контроллеры в МК между словами/байтами делают паузу чуть по-больше, чем между битами внутри слова/байта. Чем меньше таких пауз, тем выше общая скорость передачи. Хоть и незначительно.

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

Чт авг 03, 2023 17:09:22

Короче вернулся почти туда откуда и начал, только очерёдность поменял.
Тут творество.
Всё работает, как было задумано у count-zero.ru только там F1.
Если в функции st7735_send убрать:
Код:
  data = *(uint8_t *)&SPI1->DR;
  while (!(SPI1->SR & SPI_SR_RXNE));

то будет лажа, то ли не успевает... по хорошему надо анализатором смотреть.

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

Чт авг 03, 2023 17:18:52

Если в функции st7735_send убрать:
Код:
  data = *(uint8_t *)&SPI1->DR;
  while (!(SPI1->SR & SPI_SR_RXNE));

то будет лажа, то ли не успевает... по хорошему надо анализатором смотреть.
мы тут писали-писали что да почему, но вы похоже так ничего и не прочитали и не поняли.... :facepalm:
Почитайте что такое SPI и как он работает.

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

Чт авг 03, 2023 17:36:50

Да блин, в одном случае работает, в другом не работает, ну объясни.
ы. Всё дошло. Попробовал добавить NOP'ов вместо while, пауза после передачи 16ти бит и так больше...
Последний раз редактировалось zenon Чт авг 03, 2023 18:16:30, всего редактировалось 2 раз(а).
Ответить