<?xml version="1.0" encoding="UTF-8"?>        <rss version="2.0"
             xmlns:atom="http://www.w3.org/2005/Atom"
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
             xmlns:admin="http://webns.net/mvcb/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:content="http://purl.org/rss/1.0/modules/content/">
        <channel>
            <title>
									Не могу попасть в обработчик исключения - STM32				            </title>
            <link>https://microtechnics.ru/community/stm32/ne-mogu-popast-v-obrabotchik-isklyucheniya/</link>
            <description>Обсуждение вопросов, посвященных программированию микроконтроллеров, разработке электроники и не только.</description>
            <language>ru-RU</language>
            <lastBuildDate>Tue, 15 Sep 2026 09:03:10 +0000</lastBuildDate>
            <generator>wpForo</generator>
            <ttl>60</ttl>
							                    <item>
                        <title>НА: Не могу попасть в обработчик исключения</title>
                        <link>https://microtechnics.ru/community/stm32/ne-mogu-popast-v-obrabotchik-isklyucheniya/#post-2119</link>
                        <pubDate>Tue, 15 Aug 2023 17:08:10 +0000</pubDate>
                        <description><![CDATA[От: @aleksej_bajdin 
Получается, 3 обработчика исключений:
MemManage_Handler
BusFault_Handler
UsageFault_Handler
запрещены?

Хм, похоже на то, судя по битам.]]></description>
                        <content:encoded><![CDATA[<blockquote data-userid="1824" data-postid="2118" data-mention="aleksej_bajdin">
<div class="wpforo-post-quote-author"><strong> От: @aleksej_bajdin </strong></div>
<p><span>Получается, 3 обработчика исключений:<br /></span></p>
<pre contenteditable="false">MemManage_Handler
BusFault_Handler
UsageFault_Handler</pre>
<p><span>запрещены?</span></p>
</blockquote>
<p>Хм, похоже на то, судя по битам.</p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Aveal MT</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/ne-mogu-popast-v-obrabotchik-isklyucheniya/#post-2119</guid>
                    </item>
				                    <item>
                        <title>НА: Не могу попасть в обработчик исключения</title>
                        <link>https://microtechnics.ru/community/stm32/ne-mogu-popast-v-obrabotchik-isklyucheniya/#post-2118</link>
                        <pubDate>Mon, 14 Aug 2023 14:16:35 +0000</pubDate>
                        <description><![CDATA[Добавлю от себя.
Скажу с радостью, что проблема решена. Спасибо людям!
Первое что. Есть некоторые ошибки в понимании происходящего в железе.
__enable_irq();
Обработчики исключений включе...]]></description>
                        <content:encoded><![CDATA[<p>Добавлю от себя.</p>
<p>Скажу с радостью, что проблема решена. Спасибо людям!</p>
<p>Первое что. Есть некоторые ошибки в понимании происходящего в железе.</p>
<pre contenteditable="false">__enable_irq();</pre>
<p>Обработчики исключений включены по умолчанию, специально я их не отключал. И поэтому здесь эта команда не имеет смысл.</p>
<p>Второе. Я действительно не понимал некоторых вещей. Действительно, если я разрешил прерывание, например Таймера, но не описал его обработчик или описал его с ошибкой (например, вместо TIM6_IRQHandler(void), написал TIM6IRQHandler(void)) просто упустил один символ, то STMка уходит на заглушку, откуда в тот самый Infinity Loop. И с этим ничего не поделаешь. Это уже как говорится моя проблема.</p>
<p>Третье, никакой ошибки здесь нет, поэтому я не входил ни в какие обработчики исключений, в которые хотел.<br />Ошибка действительно возникала, если я, например специально делил на ноль, что делать нельзя, соответственно я всё-таки входил в обработчик исключения:</p>
<pre contenteditable="false">extern "C" void HardFault_Handler(void)</pre>
<p>Четвертое, если взглянуть на код функции</p>
<pre contenteditable="false">NVIC_EnableIRQ(HardFault_IRQn);</pre>
<p>то там ничего не происходит, так как HardFault_IRQn имеет значение отрицательное, а в функции NVIC_EnableIRQ проверяется по условию на значение больше, чем ноль. И эти команды не имели смысл.</p>
<p>Пятое, читать и еще раз читать Programming manual.</p>
<p>Но остались вопросы:</p>
<p><span>Есть такой регистр </span><span>- SHCSR </span><span>(System handler control and state register</span><span>)</span><span>. Он виден под отладчиком</span><span>. Там есть биты:<br /></span></p>
<pre contenteditable="false">USGFAULTENA
BUSFAULTENA
MEMFAULTENA</pre>
<p><span>Если переведем документ Programming manual PM0214, то прочитаем следующее для этих трёх битов:<br /></span></p>
<pre contenteditable="false">Установит в "1", чтобы разрешить
</pre>
<p><span>Под отладчиком, смотря на эти биты, я вижу, что они все сброшены в ноль...<br />Получается, 3 обработчика исключений:<br /></span></p>
<pre contenteditable="false">MemManage_Handler
BusFault_Handler
UsageFault_Handler</pre>
<p><span>запрещены???</span></p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Алексей_Байдин</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/ne-mogu-popast-v-obrabotchik-isklyucheniya/#post-2118</guid>
                    </item>
				                    <item>
                        <title>НА: Не могу попасть в обработчик исключения</title>
                        <link>https://microtechnics.ru/community/stm32/ne-mogu-popast-v-obrabotchik-isklyucheniya/#post-2117</link>
                        <pubDate>Mon, 14 Aug 2023 13:54:55 +0000</pubDate>
                        <description><![CDATA[Мы разобрали этот вопрос. Дело оказалось прозаическим.
Если посмотреть файл startup_stm32xxxx.s, который лежит в &quot;/Core/Startup/&quot; мы увидим такие строки
Default_Handler:
Infinite_Loop:
 ...]]></description>
                        <content:encoded><![CDATA[<p>Мы разобрали этот вопрос. Дело оказалось прозаическим.</p>
<p>Если посмотреть файл startup_stm32xxxx.s, который лежит в "/Core/Startup/" мы увидим такие строки</p>
<pre contenteditable="false">Default_Handler:
Infinite_Loop:
  b Infinite_Loop
</pre>
<p>Сюда мы попадаем, если прерывание у нас не объявлено, но разрешено.<br />Потому что в стартовом скрипте стоят заглушки.</p>
<pre contenteditable="false"> .weak NMI_Handler
  .thumb_set NMI_Handler,Default_Handler

  .weak HardFault_Handler
  .thumb_set HardFault_Handler,Default_Handler

  .weak MemManage_Handler
  .thumb_set MemManage_Handler,Default_Handler

  .weak BusFault_Handler
  .thumb_set BusFault_Handler,Default_Handler

  .weak UsageFault_Handler
  .thumb_set UsageFault_Handler,Default_Handler
</pre>
<p>Это только часть, остальное можно посмотреть самим.</p>
<p>Вся ошибка возникла когда автор вместо</p>
<p><span style="margin: 0px;padding: 0px;border: 0px;font-weight: 400;font-style: normal;font-size: 16px;vertical-align: baseline;color: #dbdee1;letter-spacing: normal;text-align: left;text-indent: 0px;text-transform: none;background-color: #313338">extern </span><span style="margin: 0px;padding: 0px;border: 0px;font-weight: 400;font-style: normal;font-size: 16px;vertical-align: baseline;color: #dbdee1;letter-spacing: normal;text-align: left;text-indent: 0px;text-transform: none;background-color: #313338">"C</span><span style="margin: 0px;padding: 0px;border: 0px;font-weight: 400;font-style: normal;font-size: 16px;vertical-align: baseline;color: #dbdee1;letter-spacing: normal;text-align: left;text-indent: 0px;text-transform: none;background-color: #313338">" void TIM1</span><span style="margin: 0px;padding: 0px;border: 0px;font-weight: 400;font-style: normal;font-size: 16px;vertical-align: baseline;color: #dbdee1;letter-spacing: normal;text-align: left;text-indent: 0px;text-transform: none;background-color: #313338">_BRK</span><span style="margin: 0px;padding: 0px;border: 0px;font-weight: 400;font-style: normal;font-size: 16px;vertical-align: baseline;color: #dbdee1;letter-spacing: normal;text-align: left;text-indent: 0px;text-transform: none;background-color: #313338">_TIM15</span><span style="margin: 0px;padding: 0px;border: 0px;font-weight: 400;font-style: normal;font-size: 16px;vertical-align: baseline;color: #dbdee1;letter-spacing: normal;text-align: left;text-indent: 0px;text-transform: none;background-color: #313338">_IRQHandler</span><span style="margin: 0px;padding: 0px;border: 0px;font-weight: 400;font-style: normal;font-size: 16px;vertical-align: baseline;color: #dbdee1;letter-spacing: normal;text-align: left;text-indent: 0px;text-transform: none;background-color: #313338">(void</span><span style="margin: 0px;padding: 0px;border: 0px;font-weight: 400;font-style: normal;font-size: 16px;vertical-align: baseline;color: #dbdee1;letter-spacing: normal;text-align: left;text-indent: 0px;text-transform: none;background-color: #313338">)</span></p>
<p>описал прерывание</p>
<p><span style="margin: 0px;padding: 0px;border: 0px;font-weight: 400;font-style: normal;font-size: 16px;vertical-align: baseline;color: #dbdee1;letter-spacing: normal;text-align: left;text-indent: 0px;text-transform: none;background-color: #313338">extern </span><span style="margin: 0px;padding: 0px;border: 0px;font-weight: 400;font-style: normal;font-size: 16px;vertical-align: baseline;color: #dbdee1;letter-spacing: normal;text-align: left;text-indent: 0px;text-transform: none;background-color: #313338">"C</span><span style="margin: 0px;padding: 0px;border: 0px;font-weight: 400;font-style: normal;font-size: 16px;vertical-align: baseline;color: #dbdee1;letter-spacing: normal;text-align: left;text-indent: 0px;text-transform: none;background-color: #313338">" void TIM1</span><span style="margin: 0px;padding: 0px;border: 0px;font-weight: 400;font-style: normal;font-size: 16px;vertical-align: baseline;color: #dbdee1;letter-spacing: normal;text-align: left;text-indent: 0px;text-transform: none;background-color: #313338">_TIM15</span><span style="margin: 0px;padding: 0px;border: 0px;font-weight: 400;font-style: normal;font-size: 16px;vertical-align: baseline;color: #dbdee1;letter-spacing: normal;text-align: left;text-indent: 0px;text-transform: none;background-color: #313338">_IRQHandler</span><span style="margin: 0px;padding: 0px;border: 0px;font-weight: 400;font-style: normal;font-size: 16px;vertical-align: baseline;color: #dbdee1;letter-spacing: normal;text-align: left;text-indent: 0px;text-transform: none;background-color: #313338">(void</span><span style="margin: 0px;padding: 0px;border: 0px;font-weight: 400;font-style: normal;font-size: 16px;vertical-align: baseline;color: #dbdee1;letter-spacing: normal;text-align: left;text-indent: 0px;text-transform: none;background-color: #313338">)</span></p>
<p>соответственно у него вызывалось прерывание, которое нужно, но обработчика там не было. И согласно алгоритму всё сваливалось на метку Default_Handler и зацикливалось.</p>
<p>Правда автор не указал это в сообщении.</p>
<p>Но возникает ещё интересная тема. А когда вызываются прерывания, которые указал автор? В документации это как то скудно описано.</p>
<p>Получаем - невнимательность вызвала ошибку, не связанную с другими проблемами, которые могли бы вызвать описанные автором прерывания.</p>
<p>В то же время возникает вопрос: А как себя обезопасить от таких ошибок?</p>
<p> </p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Эдуард</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/ne-mogu-popast-v-obrabotchik-isklyucheniya/#post-2117</guid>
                    </item>
				                    <item>
                        <title>НА: Не могу попасть в обработчик исключения</title>
                        <link>https://microtechnics.ru/community/stm32/ne-mogu-popast-v-obrabotchik-isklyucheniya/#post-2116</link>
                        <pubDate>Mon, 14 Aug 2023 13:52:46 +0000</pubDate>
                        <description><![CDATA[Тема создана на базе обсуждения в комментариях.]]></description>
                        <content:encoded><![CDATA[<p>Тема создана на базе обсуждения в <a href="https://microtechnics.ru/stm32-i-c-moj-variant-arhitektury-obrabotka-preryvanij/#comment-80508">комментариях</a>.</p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Aveal MT</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/ne-mogu-popast-v-obrabotchik-isklyucheniya/#post-2116</guid>
                    </item>
				                    <item>
                        <title>Не могу попасть в обработчик исключения</title>
                        <link>https://microtechnics.ru/community/stm32/ne-mogu-popast-v-obrabotchik-isklyucheniya/#post-2115</link>
                        <pubDate>Mon, 14 Aug 2023 12:44:22 +0000</pubDate>
                        <description><![CDATA[Всем здравствуйте! Хотел бы найти ответ на свой вопрос. Есть устройство, которое должно быть надежным даже в случае отказа, при возникновения каких либо неучтённых ошибках в программе (и как...]]></description>
                        <content:encoded><![CDATA[<p>Всем здравствуйте! Хотел бы найти ответ на свой вопрос. Есть устройство, которое должно быть надежным даже в случае отказа, при возникновения каких либо неучтённых ошибках в программе (и как следствии зависание STM32). Мысль такая, если возникает ошибка, заходим в обработчик исключения, в нем отключаем мотор и все что нужно. На первое время, пока с моими знаниями, хотя бы так. Что дальше будет, для меня пока не важно - главное отключить мотор. Я не могу зайти в обработчики (ни в какие) исключений. Что я для этого сделал:<br />1) Включил глобальные прерывания:</p>
<pre contenteditable="false">__enable_irq();</pre>
<p>2) Разрешил их как обычные прерывания:</p>
<pre contenteditable="false">NVIC_EnableIRQ(NonMaskableInt_IRQn);</pre>
<p>NVIC_EnableIRQ(HardFault_IRQn);<br />NVIC_EnableIRQ(MemoryManagement_IRQn);<br />NVIC_EnableIRQ(BusFault_IRQn);<br />NVIC_EnableIRQ(UsageFault_IRQn);<br />NVIC_EnableIRQ(SVCall_IRQn);<br />NVIC_EnableIRQ(DebugMonitor_IRQn);<br />NVIC_EnableIRQ(PendSV_IRQn);<br />NVIC_EnableIRQ(SysTick_IRQn);</p>
<p>3) Переоределил сами обработчики:</p>
<pre contenteditable="false">extern "C" void HardFault_Handler(void)
{ GPIOB-&gt;BSRR |= GPIO_BSRR_BR_5; // выключаем мотор }</pre>
<p>ну и так во всех, что есть:<br /> NonMaskableInt_IRQn     <br /> HardFault_IRQn       <br /> MemoryManagement_IRQn    <br /> BusFault_IRQn      <br /> UsageFault_IRQn  <br /> SVCall_IRQn         <br /> DebugMonitor_IRQn      <br /> PendSV_IRQn<br /> SysTick_IRQn</p>
<p>4) искусственно создаю ситуацию появления ошибки. Или обработчик, например Таймера, не переопределю, а он должен попасть туда, или такой командой:</p>
<pre contenteditable="false">__asm("svc 0");</pre>
<p>5) уже под отладчиком я регистр NVIC_ISER0 устанавливаю в 0xFFFFFFFF, что все прерывания разрешить системные (хотя здесь я не уверен что я правильно настраиваю)<br />Но при созданной ситуации "STMка зависла", я не попадаю ни в один из определённых обработчиков исключений. А попадаю в цикл всем известный Loop</p>
<pre contenteditable="false">  .section .text.Default_Handler,"ax",%progbits
Default_Handler:
Infinite_Loop:
b Infinite_Loop
.size Default_Handler, .-Default_Handler</pre>
<p>Что я сделал неправильно или что недоделал или в чем не прав и ошибаюсь?</p>]]></content:encoded>
						                            <category domain="https://microtechnics.ru/community/stm32/">STM32</category>                        <dc:creator>Алексей_Байдин</dc:creator>
                        <guid isPermaLink="true">https://microtechnics.ru/community/stm32/ne-mogu-popast-v-obrabotchik-isklyucheniya/#post-2115</guid>
                    </item>
							        </channel>
        </rss>
		