STM32 новичку в ARM что к чему
- Реклама
Слишком очевидно чтобы не попробовать. Нет, тем это в сложных таймерах, как я понял надо, TIM14 например работает без установки TIM_BDTR_MOE.
Пробовал конечно.
Пробовал конечно.
Вы не решили этот вопрос?
почитайте про комплементарные выходы с таймера.
в режиме AF2 TIM16/TIM17 PB6/PB7 - это CH1N - упрощенно инверсный выход, если он нужен должен включаться в TIMx->CCER, он не тоже самое что CH1.
почитайте про комплементарные выходы с таймера.
в режиме AF2 TIM16/TIM17 PB6/PB7 - это CH1N - упрощенно инверсный выход, если он нужен должен включаться в TIMx->CCER, он не тоже самое что CH1.
О да! Спасибо. Вот оно!
Код: Выделить всё
TIM17->CCER = TIM_CCER_CC1NE;Здравствуйте! Изучаю прерывания на чипе STM32f103c8t6. Сделал инициализацию пина на вход с подтяжкой к питанию и инициализацию самого прерывания exti. Написал функцию обработчика прерываний EXTI0_IRQHandler...Проблема в том, что по прилету события не вызывется сам обработчик прерывания, а по ходу отладки - программа висит в startup_stm32f103xb.s. Есть мысли, в чем я не прав? Буду благодарен за помощь!
- Реклама
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Судя по скриншотам, дело происходит в IAR. Проверьте в каком режиме C или C++ собирается код. Если С++, то обрааботчик прерывания должен быть extern "C" void EXTI0_URQHandler().
VladislavS, действительно, проглядел. Собирается под С++, сделал определение через extern "C", как Вы порекомендовали, теперь обработчик работает. Спасибо за помощь! 
Эммм... никак не могу понять, когда отправляем по 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;
Код: Выделить всё
while (!(SPI1->SR & SPI_SR_TXE));
SPI1->DR = data;
Первый код и передаёт (по MOSI), и принимает (по MISO) данные. Второй только пишет.
Если читать не надо, то и не читайте. Закинули в регистр данные и пошли дальше выполнять другие действия, контроллер аппаратно всё дошлёт параллельно.
Если читать не надо, то и не читайте. Закинули в регистр данные и пошли дальше выполнять другие действия, контроллер аппаратно всё дошлёт параллельно.
поясните, плиз, зачем такая конструкция
*(uint8_t *)&
или это, когда data нельзя сделать uint8_t ?
*(uint8_t *)&
или это, когда data нельзя сделать uint8_t ?
Приведение типов
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-битное число, лежащее в этой ячейке.
- Сообщения: 1731
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="zenon",url="/forum/viewtopic.php?p=4456153#p4456153"]Эммм... никак не могу понять, когда отправляем по SPI восемь бит зачем читать после?[/uquote]Затем что так работает SPI - принимает одновременно с передачей.
Добавлено after 3 minutes 40 seconds:
[uquote="a797945",url="/forum/viewtopic.php?p=4456213#p4456213"]поясните, плиз, зачем такая конструкция
*(uint8_t *)&
или это, когда data нельзя сделать uint8_t ?[/uquote]Видимо эта команда говорит процессору, что в SPI нужно отправить 8 бит, а не 16. Такой код сгенерит команду STRB (которую можно увидеть в листинге), а не STR или STRH.
Откройте мануал на ваш МК и прочитайте про разрядность записей в регистры SPI и что они определяют.
Добавлено after 3 minutes 40 seconds:
[uquote="a797945",url="/forum/viewtopic.php?p=4456213#p4456213"]поясните, плиз, зачем такая конструкция
*(uint8_t *)&
или это, когда data нельзя сделать uint8_t ?[/uquote]Видимо эта команда говорит процессору, что в SPI нужно отправить 8 бит, а не 16. Такой код сгенерит команду STRB (которую можно увидеть в листинге), а не STR или STRH.
Откройте мануал на ваш МК и прочитайте про разрядность записей в регистры SPI и что они определяют.
Спасибо, понял
вне зависимости от мнения компилятора - принудить к байтовой пересылке, может она быстрее.
вне зависимости от мнения компилятора - принудить к байтовой пересылке, может она быстрее.
[uquote="jcxz",url="/forum/viewtopic.php?p=4456268#p4456268"]Затем что так работает SPI - принимает одновременно с передачей.[/uquote]
Ну, насколько я понял, для работы в двух направлениях в F0 надо SPI_CR1_BIDIMODE включать.
В общем методом тыка, очерёдность поменял, работает это:
Если наоборот - нет.
Хотя переключение и передача на 16 бит работает так:
Ну, насколько я понял, для работы в двух направлениях в 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 бит
- Сообщения: 1731
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="a797945",url="/forum/viewtopic.php?p=4456292#p4456292"]Спасибо, понял
вне зависимости от мнения компилятора - принудить к байтовой пересылке, может она быстрее.[/uquote]не компилятор принудить, а процессору сказать о разрядности. разрядность команды записи как раз это ему и сообщает.
[uquote="zenon",url="/forum/viewtopic.php?p=4456320#p4456320"]Ну, насколько я понял, для работы в двух направлениях в F0 надо SPI_CR1_BIDIMODE включать.[/uquote]Я не уверен (так как с F0 не имел дел), но имхо тот бит отвечает за двунаправленную передачу по одной общей линии MOSI/MISO. Я не о том. SPI сам по себе так работает - без передачи не возможен приём (за исключением спец.режимов в некоторых МК).
И именно поэтому в том коде выше нет никакого смысла в первом цикле while(). Достаточно одного 2-го. Лишнее загромождение ненужным кодом.
вне зависимости от мнения компилятора - принудить к байтовой пересылке, может она быстрее.[/uquote]не компилятор принудить, а процессору сказать о разрядности. разрядность команды записи как раз это ему и сообщает.
[uquote="zenon",url="/forum/viewtopic.php?p=4456320#p4456320"]Ну, насколько я понял, для работы в двух направлениях в F0 надо SPI_CR1_BIDIMODE включать.[/uquote]Я не уверен (так как с F0 не имел дел), но имхо тот бит отвечает за двунаправленную передачу по одной общей линии MOSI/MISO. Я не о том. SPI сам по себе так работает - без передачи не возможен приём (за исключением спец.режимов в некоторых МК).
И именно поэтому в том коде выше нет никакого смысла в первом цикле while(). Достаточно одного 2-го. Лишнее загромождение ненужным кодом.
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="a797945",url="/forum/viewtopic.php?p=4456292#p4456292"]принудить к байтовой пересылке, может она быстрее.[/uquote]Не быстрее, а запись НУЖНОЙ разрядности. 32, 16 и 8 битные операции записи в регистр данных SPI у некоторых контроллеров приводят к разному результату работы SPI.
- Сообщения: 1731
- Зарегистрирован: Вт авг 15, 2017 10:51:13
Кстати: Многоразрядные пересылки могут быть как раз быстрее. В смысле именно физической передачи по SPI. Так как некоторые SPI-контроллеры в МК между словами/байтами делают паузу чуть по-больше, чем между битами внутри слова/байта. Чем меньше таких пауз, тем выше общая скорость передачи. Хоть и незначительно.
Короче вернулся почти туда откуда и начал, только очерёдность поменял.
Тут творество.
Всё работает, как было задумано у count-zero.ru только там F1.
Если в функции st7735_send убрать:
то будет лажа, то ли не успевает... по хорошему надо анализатором смотреть.
Тут творество.
Всё работает, как было задумано у count-zero.ru только там F1.
Если в функции st7735_send убрать:
Код: Выделить всё
data = *(uint8_t *)&SPI1->DR;
while (!(SPI1->SR & SPI_SR_RXNE));- Сообщения: 1731
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="zenon",url="/forum/viewtopic.php?p=4456597#p4456597"]Если в функции st7735_send убрать:
то будет лажа, то ли не успевает... по хорошему надо анализатором смотреть.[/uquote]мы тут писали-писали что да почему, но вы похоже так ничего и не прочитали и не поняли....
Почитайте что такое SPI и как он работает.
Код: Выделить всё
data = *(uint8_t *)&SPI1->DR;
while (!(SPI1->SR & SPI_SR_RXNE));Почитайте что такое SPI и как он работает.
Да блин, в одном случае работает, в другом не работает, ну объясни.
ы. Всё дошло. Попробовал добавить NOP'ов вместо while, пауза после передачи 16ти бит и так больше...
ы. Всё дошло. Попробовал добавить NOP'ов вместо while, пауза после передачи 16ти бит и так больше...
Последний раз редактировалось zenon Чт авг 03, 2023 18:16:30, всего редактировалось 2 раза.


