Перейти к содержанию
    

По идее, проц даже и не должен попадать в прерывание, как только проинициализируешь СПИ переферию.

А он даже не вылазит от туда.

А какие прерывания от SPI вы разрешили?

 

К примеру, при установке бита TXEIE регистра SPI_CR2 (разрешении прерывания Tx buffer empty) и пустом буфере передатчика оно будет сгенерировано немедленно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какие прерывания от SPI вы разрешили?

 

К примеру, при установке бита TXEIE регистра SPI_CR2 (разрешении прерывания Tx buffer empty) и пустом буфере передатчика оно будет сгенерировано немедленно.

У меня разрешены TXE и RXNE прерывания. Но ведь я же еще ничего не записывал в TX буфер. На других контроллерах (например AVR от Амел) оно так и работает: пока ничего не запишешь, никаких прерываний не будет. А тут с какого испугу пришло прерывание, если в переферию ничего не писали?

Может я через полчаса только записать чего нить захочу туда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня разрешены TXE и RXNE прерывания. Но ведь я же еще ничего не записывал в TX буфер. На других контроллерах (например AVR от Амел) оно так и работает: пока ничего не запишешь, никаких прерываний не будет. А тут с какого испугу пришло прерывание, если в переферию ничего не писали?

Может я через полчаса только записать чего нить захочу туда.

Ну здрасте :rolleyes:

При чём тут запишешь незапишешь?

TXE что значит? Буфер передатчика пуст. При старте SPI передачтик пуст? Пуст. Разрешили прерывание - получите и распишитесь.

 

Пересели на другой камень - приготовтесь к тому, что он будет работать по другому :)

 

ЗЫ: запрещайте прерывание TXE в обработчике, если больше нечего передавать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну здрасте :rolleyes:

При чём тут запишешь незапишешь?

TXE что значит? Буфер передатчика пуст. При старте SPI передачтик пуст? Пуст. Разрешили прерывание - получите и распишитесь.

 

Пересели на другой камень - приготовтесь к тому, что он будет работать по другому :)

 

ЗЫ: запрещайте прерывание TXE в обработчике, если больше нечего передавать.

Да я собственно не переносил, а делал по аналогии. Видимо придется так и делать - прерывание разрешать именно при непосредственной передаче.

 

Но тогда возникает логичный вопрос - почему в режиме SLAVE при абсолютно одинаковой инициализации всех прерываний такого не происходит?

Там я тоже оба прерывания разрешаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

сброс pending бита NVIC происходит сразу по входу в прерывания , во всех типах прерывания(механизм общий аппаратно). Но в EXTI источник прерывания не сбрасывается при сбросе пендинг бита(вручную), и получается как раз такой механизм как вы описали - вы сбрасываете источник , но после этого нужно сбросить и пендинг бит который только что выставился .

теперь домыслы которые подкреплены прочитанным на форуме арма:

Все это "вокруг" того чтобы не потерять последнее состояние входа. Во первых разработчикам камня упрощается жизнь в том что не надо реагировать на короткие пики (с момента выставления источника до момента его сброса как минимум пройдет время входа в прерывание). А во вторых для разработчика ПО эффект задумывался как раз противоположный наблюдаемому Вами : вы видите два входа в обработчик вместо одного , а можно видеть один вместо двух. Разположив сброс источника после чтения статуса входа не пропустим его последнее состояние, но дополнительного вызова прерывания не будет.

 

мне надо было организовать неограниченную вложенность прерываний самих в себяк примеру так

systick_ISR
{...  
       systick_ISR
       {...   
             systick_ISR
             {
             }...
       }...
}

и друг в друга .

Выяснилось что манипулируя приоритетами это сделать не возможно в данном ядре.

NVIC постоянно проверяет приоритет прерывания которое пытается исполниться и текущий системный приоритет. Если мы в обработчике прерывания, то этот приоритет он берет из таблицы описателей прерываний. и получается, что меняя приоритет прерывания находясь в нем мы меняем оба числа и слева от знака неравенства и справа.

для верности я попробовал использовать пустой слот прерывания - выставлять ему приоритет наивысший , вызывать его искуственно , и выставлять низший приоритет... и получил хард фаулт эксепшн неизвестной природы, который мне не смогли объяснить в сапорте ST.

Так что без асм враппера не удалось обойтись. Кстати , если у кого есть сакральные знания на эту тему - прошу меня поправить.

А можно поинтересоваться, на сколько сложным оказался враппер? Можно ли глянуть на него. Не то, чтобы мы его будем применять, но надо одному утырку доказать, что именно эта схема, которая приведена в вашем посте про вложенные прерывания - не работает. Картинка с осциллографа его почему-то не устраивает, и он говорит, что оно должно работать, хотя я наблюдаю именно то, что прерывание само себя прервать не может, и, собственно, не прерывает, а просто висит.

Он придумал тут систему шедулера и активно ее проталкивает. Правда все задачи у него запускаются как раз из systick таймера. Это систик таймер настроен на 1 милисекунду, и есть задачи - 1 мс, 10 мс. Причем он утверждает, что задачи в 10 мс могут и выполняться все 10 мс. и что те задачи, что в 1 мс тоже будут запускаться, прерывая 10милисекундные задачи. Но вот каким образом, если все эти задачи стартуют именно ИЗ обработчика систик.

Я состряпал простенький тест, который симулирует такое поведение. И благополучно завесил весь контроллер.

 

Если не затруднит, можно глянуть на враппер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

systick_ISR
{...  
       systick_ISR
       {...   
             systick_ISR
             {
             }...
       }...
}

 

Итак. Кто тут хочет систик в себя впихнуть! У меня есть решение!!!!!!!

определяем регистр:

#define System_Handler_Control_And_State_Register (*((volatile uint32_t *) 0xE000ED24 ))

Он вдоках описан. В нем есть замечательный бит, который говорит нам, что сейчас работает какое то прерывание. В нашем случае о систике нам рассказывает бит 11.

Вот.

Как заходим в преррывание, и если оно долгое - мы убираем этот бит:

System_Handler_Control_And_State_Register &= ~( 1 << 11 );

 

Но по выходу из этого долгого прервания надо незабыть обязательно поставить этот бит на место!!!

Этот бит говорит ядру не только то, что сейчас работаеть какое то прерывание, но и то, что стек надо бы почистить.

Если не убрать - стек кончится и все встанет.

Я это дело попробовал - все работает!!!

И прерывание само себя прерывает, так сказать.

 

Во как.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Этот бит говорит ядру не только то, что сейчас работаеть какое то прерывание, но и то, что стек надо бы почистить.

Во как.

Мне кажется о том что из стека надо восстановить пресловутые регистры говорит код возврата .

У меня были с этим проблемы , я написал Вам в личку номер свой аськи , если можно стукнитесь.

Если не дошло , пришлите пожалуйста как с вами связаться , заранее спасибо !

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Столкнулся вчера с каким-то глюком SPI этого контроллера.

 

Висит у меня SD карта на Олимексовской отлад. плате.

Работает не первый день уже, но вот вчера, после очередной прошивки MCU. стали сыпаться ошибки на CMD12.

 

Посмотрел осциллом - ба, на линии MOSI данные сдвинуты на один бит то влево, то вправо относительно SCK!

Фига себе, такого глюка я ещё не видел!

 

Даже спал плохо ночью, а сегодня с утра стал ковыряться, и проблема решилась вырезанием из кода инициализации карты памяти переключения скорости SPI - инициализировал её на низкой скорости (280 Kb), а работал на большой (18 Mb). Поставил сразу 18 мегабит.

Хотя и переключал, как указано в даташите, при неактивном приёме/передаче (ждал установки флага BUSY), крыша у контроллера ехала всё равно :(

 

Всё равно странно, почему раньше такого не было?

Ведь софт был написан и отлажен ещё весной, а такая бяка вылезла только вчера?

Хм...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм... Обнаружил в 64-выводных корпусах BGA (STM32F103R(C...E)Y6 и STM32F103RBH6) ножку VREF+ вместо PC3 и ОЗУ добавили в STM32RCY6 до 64кбайт. Уважают, значит, крупнооптовых покупателей. Может со временем снизойдут и до обычных потребителей и выведут эту злосчастную REF+ хотя бы на ту же ножку 11 (сейчас PC3) в LQFP64 :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заметил, что на линию VDDA принято ставить индуктивности типа Ferrite Bead.

 

Подскажите, пожалуйста, какой тип\номинал подойдёт?

На схемах нет никаких номиналов, к сожалению... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Заметил, что на линию VDDA принято ставить индуктивности типа Ferrite Bead.

 

Подскажите, пожалуйста, какой тип\номинал подойдёт?

На схемах нет никаких номиналов, к сожалению... :(

 

Я ставлю BLM18RK102SN1D от Murata. Выбрал сравнивая коэффициенты подавления на разных частотах. Этот начинает валить с единиц МГц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я ставлю BLM18RK102SN1D от Murata. Выбрал сравнивая коэффициенты подавления на разных частотах. Этот начинает валить с единиц МГц.

Спасибо!

Тогда поставлю BLM21RK102SN1D - типоразмер 0805, чтобы полегче было руками паять :)

Падение напряжения на них не сильное, думаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо!

Тогда поставлю BLM21RK102SN1D - типоразмер 0805, чтобы полегче было руками паять :)

Падение напряжения на них не сильное, думаю?

 

BLM18 тоже нетрудно паять, квадрат в сечении. BLM21 для таких токов, ИМХО, избыточно. Да и какое падение - доли ома.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

BLM18 тоже нетрудно паять, квадрат в сечении. BLM21 для таких токов, ИМХО, избыточно. Да и какое падение - доли ома.

Разве квадрат?

Стандартный прямоугольный типоразмер: для BLM18 - 0603, а для BLM21 - 0805.

Последний мне гораздо проще припаять.

 

Макс. ток для обоих одинаков - 200 ма.

У BLM21 сопротивление пост. току несколько ниже - 0.5 ома против 0.8 у BLM18.

Но это роли практически никакой не играет :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разве квадрат?

Стандартный прямоугольный типоразмер: для BLM18 - 0603, а для BLM21 - 0805.

Последний мне гораздо проще припаять.

 

Макс. ток для обоих одинаков - 200 ма.

У BLM21 сопротивление пост. току несколько ниже - 0.5 ома против 0.8 у BLM18.

Но это роли практически никакой не играет :)

 

Квадрат не вдоль, а поперек :)))

Они не плоские, как резисторы, а высокие. Параллелепипед BLM21 выглядит на плате слегка монстрообразно. Паять эти BLM18 очень просто, потому как есть за что пинцетом ухватиться и не надо переворачивать, чтобы надпись сверху была. Но это все ИМХО, конечно. Некоторым и BLM21 мало, им больше подавай.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...