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

Кто любит RISC в жизни, заходим, не стесняемся.
Sergi
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

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

Сообщение Sergi »

Раскоментируйте TIM17->BDTR |= TIM_BDTR_MOE;
Аватара пользователя
zenon
Сверлит текстолит когтями
Сообщения: 1274
Зарегистрирован: Вт окт 23, 2007 10:01:42
Откуда: Волгоград
Контактная информация:

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

Сообщение zenon »

Слишком очевидно чтобы не попробовать. Нет, тем это в сложных таймерах, как я понял надо, TIM14 например работает без установки TIM_BDTR_MOE.
Пробовал конечно.
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

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

Сообщение a797945 »

Вы не решили этот вопрос?
почитайте про комплементарные выходы с таймера.
в режиме AF2 TIM16/TIM17 PB6/PB7 - это CH1N - упрощенно инверсный выход, если он нужен должен включаться в TIMx->CCER, он не тоже самое что CH1.
Аватара пользователя
zenon
Сверлит текстолит когтями
Сообщения: 1274
Зарегистрирован: Вт окт 23, 2007 10:01:42
Откуда: Волгоград
Контактная информация:

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

Сообщение zenon »

О да! Спасибо. Вот оно!

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

TIM17->CCER  = TIM_CCER_CC1NE;
Аватара пользователя
Reyder
Встал на лапы
Сообщения: 120
Зарегистрирован: Пт авг 13, 2010 17:21:09
Откуда: Иркутск

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

Сообщение Reyder »

Здравствуйте! Изучаю прерывания на чипе STM32f103c8t6. Сделал инициализацию пина на вход с подтяжкой к питанию и инициализацию самого прерывания exti. Написал функцию обработчика прерываний EXTI0_IRQHandler...Проблема в том, что по прилету события не вызывется сам обработчик прерывания, а по ходу отладки - программа висит в startup_stm32f103xb.s. Есть мысли, в чем я не прав? Буду благодарен за помощь!
Вложения
Code.JPG
(60.32 КБ) 91 скачивание
Debug.JPG
(173.1 КБ) 77 скачиваний
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Судя по скриншотам, дело происходит в IAR. Проверьте в каком режиме C или C++ собирается код. Если С++, то обрааботчик прерывания должен быть extern "C" void EXTI0_URQHandler().
Аватара пользователя
Reyder
Встал на лапы
Сообщения: 120
Зарегистрирован: Пт авг 13, 2010 17:21:09
Откуда: Иркутск

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

Сообщение Reyder »

VladislavS, действительно, проглядел. Собирается под С++, сделал определение через extern "C", как Вы порекомендовали, теперь обработчик работает. Спасибо за помощь! :)
Аватара пользователя
zenon
Сверлит текстолит когтями
Сообщения: 1274
Зарегистрирован: Вт окт 23, 2007 10:01:42
Откуда: Волгоград
Контактная информация:

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

Сообщение zenon »

Эммм... никак не могу понять, когда отправляем по 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).
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

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

Если читать не надо, то и не читайте. Закинули в регистр данные и пошли дальше выполнять другие действия, контроллер аппаратно всё дошлёт параллельно.
a797945
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

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

Сообщение a797945 »

поясните, плиз, зачем такая конструкция
*(uint8_t *)&
или это, когда data нельзя сделать uint8_t ?
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

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

SPI1->DR - с точки зрения C это просто число, равное, например 0x4001300a
&SPI1->DR - это уже указатель на 32-битную ячейку памяти с адресом 0x4001300a
(uint8_t *)&SPI1->DR - это его приведение к указателу на 8-битную ячейку памяти
*(uint8_t *)&SPI1->DR - разыменование такого указателя, то есть само 8-битное число, лежащее в этой ячейке.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

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

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

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

Сообщение a797945 »

Спасибо, понял
вне зависимости от мнения компилятора - принудить к байтовой пересылке, может она быстрее.
Аватара пользователя
zenon
Сверлит текстолит когтями
Сообщения: 1274
Зарегистрирован: Вт окт 23, 2007 10:01:42
Откуда: Волгоград
Контактная информация:

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

Сообщение zenon »

Затем что так работает 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 бит
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

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

И именно поэтому в том коде выше нет никакого смысла в первом цикле while(). Достаточно одного 2-го. Лишнее загромождение ненужным кодом.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

принудить к байтовой пересылке, может она быстрее.
Не быстрее, а запись НУЖНОЙ разрядности. 32, 16 и 8 битные операции записи в регистр данных SPI у некоторых контроллеров приводят к разному результату работы SPI.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

Кстати: Многоразрядные пересылки могут быть как раз быстрее. В смысле именно физической передачи по SPI. Так как некоторые SPI-контроллеры в МК между словами/байтами делают паузу чуть по-больше, чем между битами внутри слова/байта. Чем меньше таких пауз, тем выше общая скорость передачи. Хоть и незначительно.
Аватара пользователя
zenon
Сверлит текстолит когтями
Сообщения: 1274
Зарегистрирован: Вт окт 23, 2007 10:01:42
Откуда: Волгоград
Контактная информация:

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

Сообщение zenon »

Короче вернулся почти туда откуда и начал, только очерёдность поменял.
Тут творество.
Всё работает, как было задумано у count-zero.ru только там F1.
Если в функции st7735_send убрать:

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

  data = *(uint8_t *)&SPI1->DR;
  while (!(SPI1->SR & SPI_SR_RXNE));

то будет лажа, то ли не успевает... по хорошему надо анализатором смотреть.
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

Если в функции st7735_send убрать:

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

  data = *(uint8_t *)&SPI1->DR;
  while (!(SPI1->SR & SPI_SR_RXNE));

то будет лажа, то ли не успевает... по хорошему надо анализатором смотреть.
мы тут писали-писали что да почему, но вы похоже так ничего и не прочитали и не поняли.... :facepalm:
Почитайте что такое SPI и как он работает.
Аватара пользователя
zenon
Сверлит текстолит когтями
Сообщения: 1274
Зарегистрирован: Вт окт 23, 2007 10:01:42
Откуда: Волгоград
Контактная информация:

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

Сообщение zenon »

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

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