STM32 новичку в ARM что к чему
Re: STM32 новичку в ARM что к чему
Раскоментируйте TIM17->BDTR |= TIM_BDTR_MOE;
- zenon
- Сверлит текстолит когтями
- Сообщения: 1274
- Зарегистрирован: Вт окт 23, 2007 10:01:42
- Откуда: Волгоград
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Слишком очевидно чтобы не попробовать. Нет, тем это в сложных таймерах, как я понял надо, TIM14 например работает без установки TIM_BDTR_MOE.
Пробовал конечно.
Пробовал конечно.
Re: STM32 новичку в ARM что к чему
Вы не решили этот вопрос?
почитайте про комплементарные выходы с таймера.
в режиме AF2 TIM16/TIM17 PB6/PB7 - это CH1N - упрощенно инверсный выход, если он нужен должен включаться в TIMx->CCER, он не тоже самое что CH1.
почитайте про комплементарные выходы с таймера.
в режиме AF2 TIM16/TIM17 PB6/PB7 - это CH1N - упрощенно инверсный выход, если он нужен должен включаться в TIMx->CCER, он не тоже самое что CH1.
- zenon
- Сверлит текстолит когтями
- Сообщения: 1274
- Зарегистрирован: Вт окт 23, 2007 10:01:42
- Откуда: Волгоград
- Контактная информация:
Re: STM32 новичку в ARM что к чему
О да! Спасибо. Вот оно!
Код: Выделить всё
TIM17->CCER = TIM_CCER_CC1NE;Re: STM32 новичку в ARM что к чему
Здравствуйте! Изучаю прерывания на чипе STM32f103c8t6. Сделал инициализацию пина на вход с подтяжкой к питанию и инициализацию самого прерывания exti. Написал функцию обработчика прерываний EXTI0_IRQHandler...Проблема в том, что по прилету события не вызывется сам обработчик прерывания, а по ходу отладки - программа висит в startup_stm32f103xb.s. Есть мысли, в чем я не прав? Буду благодарен за помощь!
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
Судя по скриншотам, дело происходит в IAR. Проверьте в каком режиме C или C++ собирается код. Если С++, то обрааботчик прерывания должен быть extern "C" void EXTI0_URQHandler().
Re: STM32 новичку в ARM что к чему
VladislavS, действительно, проглядел. Собирается под С++, сделал определение через extern "C", как Вы порекомендовали, теперь обработчик работает. Спасибо за помощь! 
- zenon
- Сверлит текстолит когтями
- Сообщения: 1274
- Зарегистрирован: Вт окт 23, 2007 10:01:42
- Откуда: Волгоград
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Эммм... никак не могу понять, когда отправляем по SPI восемь бит зачем читать после?
Те
хотя отправка 16-ти бит вот так работает:
(действо происходит с F0 и ST7735).
Те
Код: Выделить всё
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 что к чему
Первый код и передаёт (по MOSI), и принимает (по MISO) данные. Второй только пишет.
Если читать не надо, то и не читайте. Закинули в регистр данные и пошли дальше выполнять другие действия, контроллер аппаратно всё дошлёт параллельно.
Если читать не надо, то и не читайте. Закинули в регистр данные и пошли дальше выполнять другие действия, контроллер аппаратно всё дошлёт параллельно.
Re: STM32 новичку в ARM что к чему
поясните, плиз, зачем такая конструкция
*(uint8_t *)&
или это, когда data нельзя сделать uint8_t ?
*(uint8_t *)&
или это, когда data нельзя сделать uint8_t ?
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Приведение типов
SPI1->DR - с точки зрения C это просто число, равное, например 0x4001300a
&SPI1->DR - это уже указатель на 32-битную ячейку памяти с адресом 0x4001300a
(uint8_t *)&SPI1->DR - это его приведение к указателу на 8-битную ячейку памяти
*(uint8_t *)&SPI1->DR - разыменование такого указателя, то есть само 8-битное число, лежащее в этой ячейке.
SPI1->DR - с точки зрения C это просто число, равное, например 0x4001300a
&SPI1->DR - это уже указатель на 32-битную ячейку памяти с адресом 0x4001300a
(uint8_t *)&SPI1->DR - это его приведение к указателу на 8-битную ячейку памяти
*(uint8_t *)&SPI1->DR - разыменование такого указателя, то есть само 8-битное число, лежащее в этой ячейке.
Re: STM32 новичку в ARM что к чему
Эммм... никак не могу понять, когда отправляем по SPI восемь бит зачем читать после?
Затем что так работает SPI - принимает одновременно с передачей.Добавлено after 3 minutes 40 seconds:
поясните, плиз, зачем такая конструкция
*(uint8_t *)&
или это, когда data нельзя сделать uint8_t ?
Видимо эта команда говорит процессору, что в SPI нужно отправить 8 бит, а не 16. Такой код сгенерит команду STRB (которую можно увидеть в листинге), а не STR или STRH.*(uint8_t *)&
или это, когда data нельзя сделать uint8_t ?
Откройте мануал на ваш МК и прочитайте про разрядность записей в регистры SPI и что они определяют.
Re: STM32 новичку в ARM что к чему
Спасибо, понял
вне зависимости от мнения компилятора - принудить к байтовой пересылке, может она быстрее.
вне зависимости от мнения компилятора - принудить к байтовой пересылке, может она быстрее.
- zenon
- Сверлит текстолит когтями
- Сообщения: 1274
- Зарегистрирован: Вт окт 23, 2007 10:01:42
- Откуда: Волгоград
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Затем что так работает 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 что к чему
Спасибо, понял
вне зависимости от мнения компилятора - принудить к байтовой пересылке, может она быстрее.
не компилятор принудить, а процессору сказать о разрядности. разрядность команды записи как раз это ему и сообщает.вне зависимости от мнения компилятора - принудить к байтовой пересылке, может она быстрее.
Ну, насколько я понял, для работы в двух направлениях в F0 надо SPI_CR1_BIDIMODE включать.
Я не уверен (так как с F0 не имел дел), но имхо тот бит отвечает за двунаправленную передачу по одной общей линии MOSI/MISO. Я не о том. SPI сам по себе так работает - без передачи не возможен приём (за исключением спец.режимов в некоторых МК).И именно поэтому в том коде выше нет никакого смысла в первом цикле while(). Достаточно одного 2-го. Лишнее загромождение ненужным кодом.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
принудить к байтовой пересылке, может она быстрее.
Не быстрее, а запись НУЖНОЙ разрядности. 32, 16 и 8 битные операции записи в регистр данных SPI у некоторых контроллеров приводят к разному результату работы SPI.Re: STM32 новичку в ARM что к чему
Кстати: Многоразрядные пересылки могут быть как раз быстрее. В смысле именно физической передачи по SPI. Так как некоторые SPI-контроллеры в МК между словами/байтами делают паузу чуть по-больше, чем между битами внутри слова/байта. Чем меньше таких пауз, тем выше общая скорость передачи. Хоть и незначительно.
- zenon
- Сверлит текстолит когтями
- Сообщения: 1274
- Зарегистрирован: Вт окт 23, 2007 10:01:42
- Откуда: Волгоград
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Короче вернулся почти туда откуда и начал, только очерёдность поменял.
Тут творество.
Всё работает, как было задумано у count-zero.ru только там F1.
Если в функции st7735_send убрать:
то будет лажа, то ли не успевает... по хорошему надо анализатором смотреть.
Тут творество.
Всё работает, как было задумано у count-zero.ru только там F1.
Если в функции st7735_send убрать:
Код: Выделить всё
data = *(uint8_t *)&SPI1->DR;
while (!(SPI1->SR & SPI_SR_RXNE));то будет лажа, то ли не успевает... по хорошему надо анализатором смотреть.
Re: STM32 новичку в ARM что к чему
Если в функции st7735_send убрать:
то будет лажа, то ли не успевает... по хорошему надо анализатором смотреть.
мы тут писали-писали что да почему, но вы похоже так ничего и не прочитали и не поняли.... Код: Выделить всё
data = *(uint8_t *)&SPI1->DR;
while (!(SPI1->SR & SPI_SR_RXNE));то будет лажа, то ли не успевает... по хорошему надо анализатором смотреть.
Почитайте что такое SPI и как он работает.
- zenon
- Сверлит текстолит когтями
- Сообщения: 1274
- Зарегистрирован: Вт окт 23, 2007 10:01:42
- Откуда: Волгоград
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Да блин, в одном случае работает, в другом не работает, ну объясни.
ы. Всё дошло. Попробовал добавить NOP'ов вместо while, пауза после передачи 16ти бит и так больше...
ы. Всё дошло. Попробовал добавить NOP'ов вместо while, пауза после передачи 16ти бит и так больше...
Последний раз редактировалось zenon Чт авг 03, 2023 18:16:30, всего редактировалось 2 раза.