Леонид Иванович писал(а):Есть. На Дискавери код работает. Но разве этого достаточно? Сомневаюсь, всё ли я учел.
Есть такая штука - отладка называется. Вы пишите код, запускаете отладку и проверяете все ли работает так, как задумано. За Вас это никто не сделает, тк никто не знает, что Вы хотели в результате получить. Как можно знать, что Вы учли, а что - нет? Если код на дискавери работает так, как задумано, чего Вам еще "не достаточно"?
Леонид Иванович писал(а):Т.е. предлагаете осваивать программирование STM32 тяп-ляп, используя чужой код и не понимая, как он работает? Что ж, это по-молодежному.
Нет, лучше писать код, который 100500 раз проверен каждый раз - "с нуля"? 100 раз Вам сказано - инициализация есть готовая, проверенная - берите и пользуйтесь. Хотите понять, как это работает - запустите отладку в пошаговом режиме, откройте RM и ПОЙМИТЕ!
dosikus писал(а):Я предлагаю не лезть сломя голову на амбразуры , а изучать новый для себя МК постепенно.
Но ведь для Вас этот МК не новый, могли бы и поделиться.
К примеру, как быть с прерываниями. Например, у меня есть класс, который реализует протокол обмена. Как мне реализовать обработчик прерывания? Для AVR было просто и понятно:
void SystemInit (void)
{
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
/* Set HSION bit */
RCC->CR |= (uint32_t)0x00000001;
/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
#ifndef STM32F10X_CL
RCC->CFGR &= (uint32_t)0xF8FF0000;
#else
RCC->CFGR &= (uint32_t)0xF0FF0000;
#endif /* STM32F10X_CL */
/* Reset HSEON, CSSON and PLLON bits */
RCC->CR &= (uint32_t)0xFEF6FFFF;
/* Reset HSEBYP bit */
RCC->CR &= (uint32_t)0xFFFBFFFF;
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
RCC->CFGR &= (uint32_t)0xFF80FFFF;
#ifdef STM32F10X_CL
/* Reset PLL2ON and PLL3ON bits */
RCC->CR &= (uint32_t)0xEBFFFFFF;
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x00FF0000;
/* Reset CFGR2 register */
RCC->CFGR2 = 0x00000000;
#elif defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL)
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x009F0000;
/* Reset CFGR2 register */
RCC->CFGR2 = 0x00000000;
#else
/* Disable all interrupts and clear pending bits */
RCC->CIR = 0x009F0000;
#endif /* STM32F10X_CL */
Зачем это всё делается? Для каких "for debug purpose"? Где об этом почитать? Что будет, если этого не сделать? По reset всё и так сброшено. Без всего этого у меня на Дискавери всё работает. Получается, это написали идиоты?
Леонид Иванович писал(а):
Получается, это написали идиоты?
Отключим AVR мышленье на время , ОК ?
Вам не приходило в голову, что конфигурацию тактирования можно менять на ходу , а не только при старте?
И вот теперь кто идиот ?
Чуть дополню. Если не выполнять аппаратный ресет, а перезапустить процедуру инициализации в отладочной сессии, регистры не получат своих "значений по умолчанию". Вот поэтому и делается их инициализация. Если клацать аппаратным ресетом - все это не нужно. Но есть еще одна штука - watchdog timer... Короче, чтоб не биться головой о клавиатуру и не чувствовать себя идиотом - делайте, как Вам ST советует. Несколько записей в регистры ваш говнокод не замедлят, а количество сотрясений могут уменьшить
dosikus писал(а):Вам не приходило в голову, что конфигурацию тактирования можно менять на ходу , а не только при старте?
И вот теперь кто идиот ?
Менять можно. Но для этого не требуется очищать все эти регистры. И вряд ли кто-то это будет делать вызовом SystemInit(), потому что она не содержит никаких параметров тактирования (все задано константами). Так что Ваш ответ мимо. Кто идиот - пока не ясно.
coredumped писал(а):Но есть еще одна штука - watchdog timer...
В AVR срабатывание WDT было полностью эквивалентно аппаратному сбросу. А в STM32 что, не так?
Еще насчет стандартной функции включения тактирования: запускаю программу, всё работает. Птом выдергиваю кварц из панельки, программа продолжает работать, но неправильно. такое меня решительно не устраивает! Что делать?
Леонид Иванович писал(а):
Менять можно. Но для этого не требуется очищать все эти регистры. И вряд ли кто-то это будет делать вызовом SystemInit(), потому что она не содержит никаких параметров тактирования (все задано константами). Так что Ваш ответ мимо. Кто идиот - пока не ясно.
Во первых сначала переходим на HSI и сбрасываем все настройка PLL и конфигурации по дефолту . Объяснить зачем сие ?
Затем вызывается SetSysClock(); Которая и устанавливает нужный источник тактирования
Вынужден в очередной раз Вас просить выключить дурака(AVR) .
Здесь естественно не универсальная функция переключения тактирования ,
а всего лишь настройка на один источник с одной конфигурацией и повторюсь : Сгенерированно скриптом
Но и при варианте с переключением частоты , процедура выглядела примерно так же - сброс на HSI и дефолт и только затем установка других значений .
Леонид Иванович писал(а):
Еще насчет стандартной функции включения тактирования: запускаю программу, всё работает. Птом выдергиваю кварц из панельки, программа продолжает работать, но неправильно. такое меня решительно не устраивает! Что делат
Снова выключить AVR .
А Вы в AVR такое частенько проделывали ? Ну и как ?
Настройки по дефолту HSE - PLL включен , HSI - PLL выключен .
При аварии HSE , тактирование происходит от HSI напрямую , без PLL .
Сие кстати ответ почему при переключении частот сбрасывают на HSI и дефолт .
Леонид Иванович писал(а):
Да, объяснить! Зачем сбрасывать по дефолту?
Мои надежды не оправдались , ЛИ не смог догадаться .
Да для того что бы перейти на HSI, и работая на нем конфигурировать другую тактовую .
По фантазируйте - вы выключаете HSI , включая одновременно HSE - который не заводиться - что будет ?
Леонид Иванович писал(а):
У меня обратное мнение. Дураки (STM32) юзают какие-то исходники с горами мусора и не знают, что зачем нужно.
Я вынужден снова повторить - использовать на первых порах, пока не снизойдет озарение.
Леонид Иванович писал(а):
Да, проделывал, всё нормально - программа виснет, как и должно быть.
Вариант "живучести" - когда система продолжает работать с сдохшим внешним кварцем, Вам в голову не приходил?
Не тупо дохнуть , а выдать юзеру - "неисправность -внешний кварц сдох" .
Леонид Иванович писал(а):
Как именно? Написать обработчик прерывания NMI, который будет каким-то образом останавливать систему?
Тупо уважаемый , весьма тупо - сконфигурировать тактовую как нужно , а не сдохнуть...
Дня доброго Есть идея, создать свою GlaDOS. Скажите пожалуйста, реально-ли запитать микроконтроллер от картошки, и воспроизвести пару фраз? На базе какого мк это будет сделать проще, с учетом, что программировать слегка умею (php), а с мк дела еще не имел.
Заранее спасибо
Здравствуйте!
Допустим у меня ноги AVRки, к которым подключается ISP-программатор, задействованы как выходы. Где при этом должны стоять последовательные резисторы? В байтбластере или на плате устройства?
Хотел бы узнать,можно ли считать залоченную Атмегу?Для 89С51 коллега находил схему,для чтения информации с неё.Читал что можно попытаться сбить биты защиты высоким напряжением (как при высоковольтном программировании),но этот способ работает 50/50.
Может чего придумали для этих целей.
Не запускается таймер2, обработчик прерываний и регистры таймера2 на ATmega88:
Даташит: http://www.atmel.com/images/doc2545.pdf
Нужно, чтобы таймер при переполнении вызывал прерывание... Спойлер