-
- У Cortex M3 есть спец. бит. Регистр SCB_AIRCR, бит SYSRESETREQ. - Юрий_СВ(27.08.2012 22:17 - 22:22)
- Спасибо. - Юра(27.08.2012 22:32, )
- Ну, и если не надоел, поговорим о кривизне jmp 0 для STM32. Что принципиально невозможно(!) привести к состоянию аппаратного сброса, какую периферию или NVIC? - Юра(27.08.2012 18:42, )
- вообще-то по нулевому смещению у STM32 лежит не переход на "обработчик Reset", и даже не его адрес, а начальное значение указателя стека. Адрес "обработчика сброса" лежит по смещению 4. А вообще пользуйтесь штатной возможностью сброса, встроенной koyodza(536 знак., 27.08.2012 19:40)
- Не очень понятно, а зачем такое замысловатое присваивание SCB->AIRCR ? Он вроде как, сам насильно устанавливается в исходное положение по сбросу ? Юрий_СВ(178 знак., 27.08.2012 22:34)
- не знаю, не разбирался. Наверняка зачем-то нужно. Это кусок core_cm3.h - koyodza(27.08.2012 22:37)
- "|(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk)" - они, видимо, по "инерции" вписали (как для обычного бита). Остальное - понятно зачем. - Юрий_СВ(27.08.2012 22:57)
- Перестраховались похоже: можно было бы и так записать Apтём(43 знак., 27.08.2012 23:33)
- Как это? Без ключа? - Юра(27.08.2012 23:37, )
- В доке написано, что Vectorkey Reads as 0x05FA, но может опечатка - Apтём(104 знак., 27.08.2012 23:46)
- Reads as 0xFA05, On writes, write 0x5FA to VECTKEY, otherwise the write is ignored. - rezident(28.08.2012 00:00, ссылка)
- Да я и сам в отладчике вижу Apтём(24 знак., 28.08.2012 00:13)
- Reads as 0xFA05, On writes, write 0x5FA to VECTKEY, otherwise the write is ignored. - rezident(28.08.2012 00:00, ссылка)
- В доке написано, что Vectorkey Reads as 0x05FA, но может опечатка - Apтём(104 знак., 27.08.2012 23:46)
- Как это? Без ключа? - Юра(27.08.2012 23:37, )
- Это наверно чтобы если прерывание возникнет до достижения барьера - чтобы приоритет оставался тем же. - Юра(27.08.2012 23:16, )
- Перестраховались похоже: можно было бы и так записать Apтём(43 знак., 27.08.2012 23:33)
- "|(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk)" - они, видимо, по "инерции" вписали (как для обычного бита). Остальное - понятно зачем. - Юрий_СВ(27.08.2012 22:57)
- не знаю, не разбирался. Наверняка зачем-то нужно. Это кусок core_cm3.h - koyodza(27.08.2012 22:37)
- Ну понятно, мы же на 0x4 прыгаем :) Jmp 0 это просто бренд. Мне не очень понятно как сбросить приоритеты прерываний, если Jmp 0 будет где-то глубоко в обработчиках. - Юра(27.08.2012 19:43, )
- Вручную вообще смысла нет ресет делать. Могу ошибиться, т.к. читал что делает при ресете давно, но Cortex при реальном ресете делает очень много. Dir(418 знак., 27.08.2012 20:00)
- не надо ничего сбрасывать, никаких приоритетов. Если Вам нужен сброс, то делайте его не переходом, а через NVIC, всё что надо само будет сброшено - koyodza(27.08.2012 19:48)
- мы на 0х4 не прыгаем. Мы по адресу 0х???????4 должны взять 32-битное значение, которое является адресом того места, куда надо прыгнуть. Это принципиально разные действия - koyodza(27.08.2012 19:44)
- Не очень понятно, а зачем такое замысловатое присваивание SCB->AIRCR ? Он вроде как, сам насильно устанавливается в исходное положение по сбросу ? Юрий_СВ(178 знак., 27.08.2012 22:34)
- koyodza уже намекал ниже, что не анализируются выводы бутлоадера без реального ресета. Потому отладка из ОЗУ и запуск бутлоадера сразу же недоступны. PS. Да и вообще мутно все это. Это совсем не ресет... - Dir(27.08.2012 19:35 - 19:39)
- вообще-то по нулевому смещению у STM32 лежит не переход на "обработчик Reset", и даже не его адрес, а начальное значение указателя стека. Адрес "обработчика сброса" лежит по смещению 4. А вообще пользуйтесь штатной возможностью сброса, встроенной koyodza(536 знак., 27.08.2012 19:40)
- А он определен в ИАРе? Для каких нужд? - Vladimir Ljaschko(27.08.2012 16:56)
- Там есть ответ. - rezident(27.08.2012 16:54, ссылка)
- и ещё - koyodza(27.08.2012 18:08, ссылка, ссылка)
- Спасибо, спасибо. Сделал. Объявил фиктивную extern void Reset_Handler(void) и всё потекло, все присваивается и прыгает. - Юра(27.08.2012 18:52, )
- тут есть одна засада: если это будет использовано в разных проектах, то может не работать koyodza(59 знак., 27.08.2012 19:30)
- Спасибо, спасибо. Сделал. Объявил фиктивную extern void Reset_Handler(void) и всё потекло, все присваивается и прыгает. - Юра(27.08.2012 18:52, )
- и ещё - koyodza(27.08.2012 18:08, ссылка, ссылка)
- как указатель на функцию - Юра(27.08.2012 16:44, )
- &Reset_Handler? SciFi(51 знак., 27.08.2012 16:52)
- Ну сверхзадача это массив указателей на функции. Среди них есть указатели на существующие функции, и есть позиции в массиве для будущих функций. Хотел бы поставить при попадании на них call Reset_Handler. Эта метка есть в стартапе. Там и Юра(297 знак., 27.08.2012 17:31, )
- Грязный хак : asm("JMP 0xBFFC"); (не АРМ, кнешна) - Vladimir Ljaschko(27.08.2012 17:42)
- А зачем call Reset_Handler? Для сброса? Сброс так не делается - это будет кривой сброс. - SciFi(27.08.2012 17:35)
- Это пока не важно. Надо научиться прыгнуть :) Потом обсудим почему он кривой. - Юра(27.08.2012 17:45, )
- Тогда наводящий вопрос: где вообще определено, что такое Reset_Handler? Ведь это имя откуда-то взялось? SciFi(111 знак., 27.08.2012 17:50 - 17:55)
- В стартапе. В startup_STM32F10XXX.s файле. Там таблица DCD Reset_Handler, DCD NMI_Handler. Они PUBWEAK, то есть ПАБЛИК, должны видеться. Для NMI и других векторов есть привязанные обработчики, для Ресета - нет. Поэтому на другие вектора можно Юра(47 знак., 27.08.2012 18:01, )
- по какому адресу пытаетесь прыгнуть? - koyodza(27.08.2012 18:04)
- для STM32 есть NVIC_SystemReset(); но если хочется именно на лыжах и в гамаке, то так ((void(*)(void))((void*)*((DWORD*)(0x08000004))))(); - koyodza(27.08.2012 18:05 - 19:23)
- Пошло при 0x08000004 для F100RB. - Юра(27.08.2012 18:36, )
- опечатка - то было для собственного бутлоадера. Исправил - koyodza(27.08.2012 19:23)
- Пошло при 0x08000004 для F100RB. - Юра(27.08.2012 18:36, )
- для STM32 есть NVIC_SystemReset(); но если хочется именно на лыжах и в гамаке, то так ((void(*)(void))((void*)*((DWORD*)(0x08000004))))(); - koyodza(27.08.2012 18:05 - 19:23)
- по какому адресу пытаетесь прыгнуть? - koyodza(27.08.2012 18:04)
- В стартапе. В startup_STM32F10XXX.s файле. Там таблица DCD Reset_Handler, DCD NMI_Handler. Они PUBWEAK, то есть ПАБЛИК, должны видеться. Для NMI и других векторов есть привязанные обработчики, для Ресета - нет. Поэтому на другие вектора можно Юра(47 знак., 27.08.2012 18:01, )
- Тогда наводящий вопрос: где вообще определено, что такое Reset_Handler? Ведь это имя откуда-то взялось? SciFi(111 знак., 27.08.2012 17:50 - 17:55)
- Это пока не важно. Надо научиться прыгнуть :) Потом обсудим почему он кривой. - Юра(27.08.2012 17:45, )
- Ну сверхзадача это массив указателей на функции. Среди них есть указатели на существующие функции, и есть позиции в массиве для будущих функций. Хотел бы поставить при попадании на них call Reset_Handler. Эта метка есть в стартапе. Там и Юра(297 знак., 27.08.2012 17:31, )
- &Reset_Handler? SciFi(51 знак., 27.08.2012 16:52)
- У Cortex M3 есть спец. бит. Регистр SCB_AIRCR, бит SYSRESETREQ. - Юрий_СВ(27.08.2012 22:17 - 22:22)