sonycman 0 7 декабря, 2009 Опубликовано 7 декабря, 2009 · Жалоба По идее, проц даже и не должен попадать в прерывание, как только проинициализируешь СПИ переферию. А он даже не вылазит от туда. А какие прерывания от SPI вы разрешили? К примеру, при установке бита TXEIE регистра SPI_CR2 (разрешении прерывания Tx buffer empty) и пустом буфере передатчика оно будет сгенерировано немедленно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MasterAlexei 0 7 декабря, 2009 Опубликовано 7 декабря, 2009 · Жалоба А какие прерывания от SPI вы разрешили? К примеру, при установке бита TXEIE регистра SPI_CR2 (разрешении прерывания Tx buffer empty) и пустом буфере передатчика оно будет сгенерировано немедленно. У меня разрешены TXE и RXNE прерывания. Но ведь я же еще ничего не записывал в TX буфер. На других контроллерах (например AVR от Амел) оно так и работает: пока ничего не запишешь, никаких прерываний не будет. А тут с какого испугу пришло прерывание, если в переферию ничего не писали? Может я через полчаса только записать чего нить захочу туда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 7 декабря, 2009 Опубликовано 7 декабря, 2009 · Жалоба У меня разрешены TXE и RXNE прерывания. Но ведь я же еще ничего не записывал в TX буфер. На других контроллерах (например AVR от Амел) оно так и работает: пока ничего не запишешь, никаких прерываний не будет. А тут с какого испугу пришло прерывание, если в переферию ничего не писали? Может я через полчаса только записать чего нить захочу туда. Ну здрасте :rolleyes: При чём тут запишешь незапишешь? TXE что значит? Буфер передатчика пуст. При старте SPI передачтик пуст? Пуст. Разрешили прерывание - получите и распишитесь. Пересели на другой камень - приготовтесь к тому, что он будет работать по другому :) ЗЫ: запрещайте прерывание TXE в обработчике, если больше нечего передавать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MasterAlexei 0 7 декабря, 2009 Опубликовано 7 декабря, 2009 · Жалоба Ну здрасте :rolleyes: При чём тут запишешь незапишешь? TXE что значит? Буфер передатчика пуст. При старте SPI передачтик пуст? Пуст. Разрешили прерывание - получите и распишитесь. Пересели на другой камень - приготовтесь к тому, что он будет работать по другому :) ЗЫ: запрещайте прерывание TXE в обработчике, если больше нечего передавать. Да я собственно не переносил, а делал по аналогии. Видимо придется так и делать - прерывание разрешать именно при непосредственной передаче. Но тогда возникает логичный вопрос - почему в режиме SLAVE при абсолютно одинаковой инициализации всех прерываний такого не происходит? Там я тоже оба прерывания разрешаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MasterAlexei 0 9 декабря, 2009 Опубликовано 9 декабря, 2009 · Жалоба сброс pending бита NVIC происходит сразу по входу в прерывания , во всех типах прерывания(механизм общий аппаратно). Но в EXTI источник прерывания не сбрасывается при сбросе пендинг бита(вручную), и получается как раз такой механизм как вы описали - вы сбрасываете источник , но после этого нужно сбросить и пендинг бит который только что выставился . теперь домыслы которые подкреплены прочитанным на форуме арма: Все это "вокруг" того чтобы не потерять последнее состояние входа. Во первых разработчикам камня упрощается жизнь в том что не надо реагировать на короткие пики (с момента выставления источника до момента его сброса как минимум пройдет время входа в прерывание). А во вторых для разработчика ПО эффект задумывался как раз противоположный наблюдаемому Вами : вы видите два входа в обработчик вместо одного , а можно видеть один вместо двух. Разположив сброс источника после чтения статуса входа не пропустим его последнее состояние, но дополнительного вызова прерывания не будет. мне надо было организовать неограниченную вложенность прерываний самих в себяк примеру так systick_ISR {... systick_ISR {... systick_ISR { }... }... } и друг в друга . Выяснилось что манипулируя приоритетами это сделать не возможно в данном ядре. NVIC постоянно проверяет приоритет прерывания которое пытается исполниться и текущий системный приоритет. Если мы в обработчике прерывания, то этот приоритет он берет из таблицы описателей прерываний. и получается, что меняя приоритет прерывания находясь в нем мы меняем оба числа и слева от знака неравенства и справа. для верности я попробовал использовать пустой слот прерывания - выставлять ему приоритет наивысший , вызывать его искуственно , и выставлять низший приоритет... и получил хард фаулт эксепшн неизвестной природы, который мне не смогли объяснить в сапорте ST. Так что без асм враппера не удалось обойтись. Кстати , если у кого есть сакральные знания на эту тему - прошу меня поправить. А можно поинтересоваться, на сколько сложным оказался враппер? Можно ли глянуть на него. Не то, чтобы мы его будем применять, но надо одному утырку доказать, что именно эта схема, которая приведена в вашем посте про вложенные прерывания - не работает. Картинка с осциллографа его почему-то не устраивает, и он говорит, что оно должно работать, хотя я наблюдаю именно то, что прерывание само себя прервать не может, и, собственно, не прерывает, а просто висит. Он придумал тут систему шедулера и активно ее проталкивает. Правда все задачи у него запускаются как раз из systick таймера. Это систик таймер настроен на 1 милисекунду, и есть задачи - 1 мс, 10 мс. Причем он утверждает, что задачи в 10 мс могут и выполняться все 10 мс. и что те задачи, что в 1 мс тоже будут запускаться, прерывая 10милисекундные задачи. Но вот каким образом, если все эти задачи стартуют именно ИЗ обработчика систик. Я состряпал простенький тест, который симулирует такое поведение. И благополучно завесил весь контроллер. Если не затруднит, можно глянуть на враппер? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MasterAlexei 0 10 декабря, 2009 Опубликовано 10 декабря, 2009 · Жалоба 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 ); Но по выходу из этого долгого прервания надо незабыть обязательно поставить этот бит на место!!! Этот бит говорит ядру не только то, что сейчас работаеть какое то прерывание, но и то, что стек надо бы почистить. Если не убрать - стек кончится и все встанет. Я это дело попробовал - все работает!!! И прерывание само себя прерывает, так сказать. Во как. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cebotor 0 10 декабря, 2009 Опубликовано 10 декабря, 2009 · Жалоба Этот бит говорит ядру не только то, что сейчас работаеть какое то прерывание, но и то, что стек надо бы почистить. Во как. Мне кажется о том что из стека надо восстановить пресловутые регистры говорит код возврата . У меня были с этим проблемы , я написал Вам в личку номер свой аськи , если можно стукнитесь. Если не дошло , пришлите пожалуйста как с вами связаться , заранее спасибо ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 12 декабря, 2009 Опубликовано 12 декабря, 2009 · Жалоба Столкнулся вчера с каким-то глюком SPI этого контроллера. Висит у меня SD карта на Олимексовской отлад. плате. Работает не первый день уже, но вот вчера, после очередной прошивки MCU. стали сыпаться ошибки на CMD12. Посмотрел осциллом - ба, на линии MOSI данные сдвинуты на один бит то влево, то вправо относительно SCK! Фига себе, такого глюка я ещё не видел! Даже спал плохо ночью, а сегодня с утра стал ковыряться, и проблема решилась вырезанием из кода инициализации карты памяти переключения скорости SPI - инициализировал её на низкой скорости (280 Kb), а работал на большой (18 Mb). Поставил сразу 18 мегабит. Хотя и переключал, как указано в даташите, при неактивном приёме/передаче (ждал установки флага BUSY), крыша у контроллера ехала всё равно :( Всё равно странно, почему раньше такого не было? Ведь софт был написан и отлажен ещё весной, а такая бяка вылезла только вчера? Хм... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dir 0 19 декабря, 2009 Опубликовано 19 декабря, 2009 · Жалоба Хм... Обнаружил в 64-выводных корпусах BGA (STM32F103R(C...E)Y6 и STM32F103RBH6) ножку VREF+ вместо PC3 и ОЗУ добавили в STM32RCY6 до 64кбайт. Уважают, значит, крупнооптовых покупателей. Может со временем снизойдут и до обычных потребителей и выведут эту злосчастную REF+ хотя бы на ту же ножку 11 (сейчас PC3) в LQFP64 :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 24 декабря, 2009 Опубликовано 24 декабря, 2009 · Жалоба Заметил, что на линию VDDA принято ставить индуктивности типа Ferrite Bead. Подскажите, пожалуйста, какой тип\номинал подойдёт? На схемах нет никаких номиналов, к сожалению... :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dir 0 24 декабря, 2009 Опубликовано 24 декабря, 2009 · Жалоба Заметил, что на линию VDDA принято ставить индуктивности типа Ferrite Bead. Подскажите, пожалуйста, какой тип\номинал подойдёт? На схемах нет никаких номиналов, к сожалению... :( Я ставлю BLM18RK102SN1D от Murata. Выбрал сравнивая коэффициенты подавления на разных частотах. Этот начинает валить с единиц МГц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 24 декабря, 2009 Опубликовано 24 декабря, 2009 · Жалоба Я ставлю BLM18RK102SN1D от Murata. Выбрал сравнивая коэффициенты подавления на разных частотах. Этот начинает валить с единиц МГц. Спасибо! Тогда поставлю BLM21RK102SN1D - типоразмер 0805, чтобы полегче было руками паять :) Падение напряжения на них не сильное, думаю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dir 0 25 декабря, 2009 Опубликовано 25 декабря, 2009 · Жалоба Спасибо! Тогда поставлю BLM21RK102SN1D - типоразмер 0805, чтобы полегче было руками паять :) Падение напряжения на них не сильное, думаю? BLM18 тоже нетрудно паять, квадрат в сечении. BLM21 для таких токов, ИМХО, избыточно. Да и какое падение - доли ома. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 25 декабря, 2009 Опубликовано 25 декабря, 2009 · Жалоба BLM18 тоже нетрудно паять, квадрат в сечении. BLM21 для таких токов, ИМХО, избыточно. Да и какое падение - доли ома. Разве квадрат? Стандартный прямоугольный типоразмер: для BLM18 - 0603, а для BLM21 - 0805. Последний мне гораздо проще припаять. Макс. ток для обоих одинаков - 200 ма. У BLM21 сопротивление пост. току несколько ниже - 0.5 ома против 0.8 у BLM18. Но это роли практически никакой не играет :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dir 0 25 декабря, 2009 Опубликовано 25 декабря, 2009 · Жалоба Разве квадрат? Стандартный прямоугольный типоразмер: для BLM18 - 0603, а для BLM21 - 0805. Последний мне гораздо проще припаять. Макс. ток для обоих одинаков - 200 ма. У BLM21 сопротивление пост. току несколько ниже - 0.5 ома против 0.8 у BLM18. Но это роли практически никакой не играет :) Квадрат не вдоль, а поперек :))) Они не плоские, как резисторы, а высокие. Параллелепипед BLM21 выглядит на плате слегка монстрообразно. Паять эти BLM18 очень просто, потому как есть за что пинцетом ухватиться и не надо переворачивать, чтобы надпись сверху была. Но это все ИМХО, конечно. Некоторым и BLM21 мало, им больше подавай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться