реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F103 :выход из прерывания от системного таймера, Где находится бит который надо сбрасывать?
Serj78
сообщение Jan 29 2010, 06:56
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



Структура обработки прерываний STM32 основана на том, что попав в прерывание, пользователь должен определить его источник (в общем случае) и сбросить соответствующий бит, который вызвал это прерывание.

Без этого из прерывания не выйти.

А в каком регистре находится бит который ВЫЗЫВАЕТ (не разрешает!! ) прерывание от системного таймера?

Столкнулся с тем, что однажды попав в прерывание от системного таймера, оттуда не выйти.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 29 2010, 13:59
Сообщение #2


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Не нужно ничего сбрасывать для SysTick.

Вы точно ничего не напутали с инициализацией регистров таймера?
Go to the top of the page
 
+Quote Post
Serj78
сообщение Jan 29 2010, 15:36
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



Цитата(sonycman @ Jan 29 2010, 16:59) *
Не нужно ничего сбрасывать для SysTick.

Вы точно ничего не напутали с инициализацией регистров таймера?


Надеюсь, что нет smile.gif


Но буду смотреть.. основная программа перестает выполняться, как только первый бит регистра управления в 1 ставишь..

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

Спасибо за совет. Был удивлен, что часть информации, относящаяся к NVIC и SysTick не описана в мануале на процессор smile.gif.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 29 2010, 17:48
Сообщение #4


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Serj78 @ Jan 29 2010, 19:36) *
Возможна ситуация, когда таймер все время обнуляется, и все время вызывается прерывание...

Конечно.
Каким значением Вы проинициализировали регистр SysTick Reload Value? wink.gif

Цитата(Serj78 @ Jan 29 2010, 19:36) *
Был удивлен, что часть информации, относящаяся к NVIC и SysTick не описана в мануале на процессор smile.gif.

Да, не стали повторять стандартные для всех ядер вещи.
Я тоже не сразу нашёл нужный мануал smile.gif
Go to the top of the page
 
+Quote Post
Serj78
сообщение Feb 2 2010, 13:14
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



Цитата(sonycman @ Jan 29 2010, 20:48) *
Конечно.
Каким значением Вы проинициализировали регистр SysTick Reload Value? wink.gif


Пробовал записывать разные значения.

Для проверки счетчика сделал такой код:

CODE

u16 k;
u32 test[500];



// SysTick configuration

SysTick->CTRL=5;// если =7 то это с вызовом прерывания
SysTick->LOAD=31000;
// SysTick->CALIB=5000;

// for(k=0;k<500;k++)test[k]=SysTick->VAL;



Далее я это запускаю в main перед While(1); а в самом теле программы вывожу этот массив ( test[0..500] ) на usart.

В результате вижу что таймер считает, в регистре VAL постепенно уменьшающиеся значения. Только уменьшаются они больно быстро- с шагом примерно 12 единиц. Как будто таймер считает каждый такт процессора. ( На проход цикла около 12 тактов тратится или около того... )

Но стоит мне приравнять регистр управления =7, ( 0b111) то программа находящаяся в while(1) перестает выполняться. в прерывании стоит мигнуть светодиодом или вообще в прерывании ничего не делать - без разницы.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Feb 2 2010, 14:11
Сообщение #6


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Этот таймер не имеет предделителя, соответственно он работает на частоте ядра.

Функция обработчика прерывания от SysTick должна передавать управление основной программе раньше, чем произойдёт повторный её вызов.

Как эта функция у Вас выглядит?

И ещё - сначала записывайте reload регистр, а уже потом разрешайте прерывание.
В тексте у Вас наоборот.
Go to the top of the page
 
+Quote Post
Serj78
сообщение Feb 2 2010, 14:42
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



Цитата(sonycman @ Feb 2 2010, 17:11) *
И ещё - сначала записывайте reload регистр, а уже потом разрешайте прерывание.
В тексте у Вас наоборот.



Спасибо! завтра попробую поменять их местами...

Функция выглядит как и все прерывания, я ее скопировал из файла какого-то примера, входящего в состав кейла, там все прерывания перечислены были.
Кстати, если этот файл подключить к папкe "sourse" прерывания из него выполняются, а вот объявленных переменных в основной программе он не видит почему-то... Хотя имена регистров, объявленных через структуры, видит. Пока переношу из него только необходимые прерывания, но интересно, почему не происходит передача переменных.

Сообщение отредактировал rezident - Feb 2 2010, 19:21
Причина редактирования: Излишнее цитирование.
Go to the top of the page
 
+Quote Post
Serj78
сообщение Feb 3 2010, 06:09
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



Поменял местами.. ситуация не изменилась. sad.gif
функция прерывания выглядит так:

CODE

void SysTickHandler(void)
{ // u32 time1=50;


// GPIOC->ODR |= (0x1000); // выставили 1 на светодиоде

// while(time1--); //подождали

// GPIOC->ODR &= ~(0x1000); // выставили 0 на светодиоде

}


Пробовал закоментарить всю функцию целиком, эффект тот же


далее, решил проверить как ведет себя контроллер.
написал следующий код:

CODE

SysTick->LOAD=31000;
test[0]=0;
SysTick->CTRL=7;

for(k=0;k<20000;k++)
{ GPIOA->ODR|=A8; // выводим 20000 периодов меандра на порт A8
GPIOA->ODR &= ~(A8);
}


После иницаализации сиситемного таймера вывожу на ногу A8 меандр и меряю длительность пачки осциллографом.
Так вот, видно что системный таймер отсчитывает нужное количество тактов, ( длительность пачки напрямую зависит от содержимого регистра LOAD)
входит в прерывание и там, очевидно остается- программа перестает выполняться..
Go to the top of the page
 
+Quote Post
sonycman
сообщение Feb 3 2010, 09:05
Сообщение #9


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Чертовщина у Вас какая-то, вроде элементарные вещи - а не работают sad.gif

Стёк достаточного размера? Как задан?

Покажите таблицу векторов.

Светодиод в прерывании моргает?

Отладчик какой-нибудь есть? МТ-Линк, J-link сотоварищи?
Продебажте - решите проблему за несколько минут.

Попробуйте в обработчике прерывания запретить TICKINT, обработка главного цикла должна продолжиться.
Если нет - проблема со стёком\неправильный вектор\ещё что нибудь левое.
Go to the top of the page
 
+Quote Post
Serj78
сообщение Feb 3 2010, 11:45
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



В прерывании не выполняется ничего, ни светодиод не зажигается ни прерывание не отменяется (пробовал
SysTick->CTRL=5; вставить) , как будто идет передача адреса куда-то на деревню дедушке..

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

где именно находятся сами адреса векторов- не нашел smile.gif

в стартап файле STM32F10x.s написано:
CODE


;// <h> Stack Configuration
;// <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
;// </h>

Stack_Size EQU 0x00000200

AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp


;// <h> Heap Configuration
;// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
;// </h>

Heap_Size EQU 0x00000000

AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit


PRESERVE8
THUMB


; Vector Table Mapped to Address 0 at Reset

AREA RESET, DATA, READONLY
EXPORT __Vectors

__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler

; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMAChannel1_IRQHandler ; DMA Channel 1
DCD DMAChannel2_IRQHandler ; DMA Channel 2
DCD DMAChannel3_IRQHandler ; DMA Channel 3
DCD DMAChannel4_IRQHandler ; DMA Channel 4
DCD DMAChannel5_IRQHandler ; DMA Channel 5
DCD DMAChannel6_IRQHandler ; DMA Channel 6
DCD DMAChannel7_IRQHandler ; DMA Channel 7
DCD ADC_IRQHandler ; ADC
DCD USB_HP_CAN_TX_IRQHandler ; USB High Priority or CAN TX
DCD USB_LP_CAN_RX0_IRQHandler ; USB Low Priority or CAN RX0
DCD CAN_RX1_IRQHandler ; CAN RX1
DCD CAN_SCE_IRQHandler ; CAN SCE
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_IRQHandler ; TIM1 Break
DCD TIM1_UP_IRQHandler ; TIM1 Update
DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line
DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend


AREA |.text|, CODE, READONLY



Где именно написаны в цифрах адреса- не знаю где искать.. по USART прерывания выполняются.


Отладчик есть- MT-link который вроде как клон J-link-а.
но как им пользоваться как отладчиком, а не программатором- еще не научился...

До этого для отладки хватало светодиода, осциллографа, USART-a и здравого смысла smile.gif
Go to the top of the page
 
+Quote Post
sonycman
сообщение Feb 3 2010, 12:53
Сообщение #11


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Ну вот, что же Вы сразу не сказали, что в обработчик процессор не заходит? smile.gif

Вектора находятся именно в стартапе - видите строчку:
Код
DCD     SysTick_Handler

это адрес, по которому будет переход при прерывании от системного таймера.

Посмотрите дальше в этом файле, где находится эта метка.
Вероятнее всего там заглушка вида:
Код
SysTick_Handler        PROC
                       EXPORT  SysTick_Handler           [WEAK]
                       B       .
                       ENDP

это тупое зацикливание.

Вам можно сделать так - перед таблицей векторов разместите строчку:
Код
IMPORT    SysTick_Handler

и переименуйте свою функцию обработчика вот так:
Код
void SysTick_Handler(void)


Таким образом, вектор будет указывать не на заглушку, а на адрес функции.

Прежде, чем использовать прерывания, следует хорошо разобраться с тем, как они работают. wink.gif
Go to the top of the page
 
+Quote Post
Serj78
сообщение Feb 3 2010, 15:49
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



Спасибо за совет!
Как работают прерывания на "железном" уровне, я читал, а вот со спецификой их объявлений пока не сталкивался. Keil осваиваю недавно. Много всяких специфичных в нем вещей для меня.
До этого работал с CVAVR там все просто- на каждый процессор есть свой файл с векторами прерываний и именами регистров, и чтобы одни прерывания были не то что не объявлены, а подключены в бесконечный цикл, а другие -нет, с таким столкнулся впервые...

по поводу строки IMPORT SysTick_Handler :

что она будет делать?


вот стартап файл целиком:

CODE
;/*****************************************************************************/
;/* STM32F10x.s: Startup file for ST STM32F10x device series */
;/*****************************************************************************/
;/* <<< Use Configuration Wizard in Context Menu >>> */
;/*****************************************************************************/
;/* This file is part of the uVision/ARM development tools. */
;/* Copyright © 2005-2007 Keil Software. All rights reserved. */
;/* This software may only be used under the terms of a valid, current, */
;/* end user licence from KEIL for a compatible version of KEIL software */
;/* development tools. Nothing else gives you the right to use this software. */
;/*****************************************************************************/


;// <h> Stack Configuration
;// <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
;// </h>

Stack_Size EQU 0x00000200

AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp


;// <h> Heap Configuration
;// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
;// </h>

Heap_Size EQU 0x00000000

AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit


PRESERVE8
THUMB


; Vector Table Mapped to Address 0 at Reset

AREA RESET, DATA, READONLY
EXPORT __Vectors

__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler

; External Interrupts
DCD WWDG_IRQHandler ; Window Watchdog
DCD PVD_IRQHandler ; PVD through EXTI Line detect
DCD TAMPER_IRQHandler ; Tamper
DCD RTC_IRQHandler ; RTC
DCD FLASH_IRQHandler ; Flash
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line 0
DCD EXTI1_IRQHandler ; EXTI Line 1
DCD EXTI2_IRQHandler ; EXTI Line 2
DCD EXTI3_IRQHandler ; EXTI Line 3
DCD EXTI4_IRQHandler ; EXTI Line 4
DCD DMAChannel1_IRQHandler ; DMA Channel 1
DCD DMAChannel2_IRQHandler ; DMA Channel 2
DCD DMAChannel3_IRQHandler ; DMA Channel 3
DCD DMAChannel4_IRQHandler ; DMA Channel 4
DCD DMAChannel5_IRQHandler ; DMA Channel 5
DCD DMAChannel6_IRQHandler ; DMA Channel 6
DCD DMAChannel7_IRQHandler ; DMA Channel 7
DCD ADC_IRQHandler ; ADC
DCD USB_HP_CAN_TX_IRQHandler ; USB High Priority or CAN TX
DCD USB_LP_CAN_RX0_IRQHandler ; USB Low Priority or CAN RX0
DCD CAN_RX1_IRQHandler ; CAN RX1
DCD CAN_SCE_IRQHandler ; CAN SCE
DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
DCD TIM1_BRK_IRQHandler ; TIM1 Break
DCD TIM1_UP_IRQHandler ; TIM1 Update
DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
DCD RTCAlarm_IRQHandler ; RTC Alarm through EXTI Line
DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend


AREA |.text|, CODE, READONLY


; Reset Handler

Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
LDR R0, =__main
BX R0
ENDP


; Dummy Exception Handlers (infinite loops which can be modified)

NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler\
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler\
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP

Default_Handler PROC

EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT TAMPER_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
EXPORT DMAChannel1_IRQHandler [WEAK]
EXPORT DMAChannel2_IRQHandler [WEAK]
EXPORT DMAChannel3_IRQHandler [WEAK]
EXPORT DMAChannel4_IRQHandler [WEAK]
EXPORT DMAChannel5_IRQHandler [WEAK]
EXPORT DMAChannel6_IRQHandler [WEAK]
EXPORT DMAChannel7_IRQHandler [WEAK]
EXPORT ADC_IRQHandler [WEAK]
EXPORT USB_HP_CAN_TX_IRQHandler [WEAK]
EXPORT USB_LP_CAN_RX0_IRQHandler [WEAK]
EXPORT CAN_RX1_IRQHandler [WEAK]
EXPORT CAN_SCE_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_IRQHandler [WEAK]
EXPORT TIM1_UP_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT TIM4_IRQHandler [WEAK]
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT I2C2_EV_IRQHandler [WEAK]
EXPORT I2C2_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT USART3_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
EXPORT RTCAlarm_IRQHandler [WEAK]
EXPORT USBWakeUp_IRQHandler [WEAK]

WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMAChannel1_IRQHandler
DMAChannel2_IRQHandler
DMAChannel3_IRQHandler
DMAChannel4_IRQHandler
DMAChannel5_IRQHandler
DMAChannel6_IRQHandler
DMAChannel7_IRQHandler
ADC_IRQHandler
USB_HP_CAN_TX_IRQHandler
USB_LP_CAN_RX0_IRQHandler
CAN_RX1_IRQHandler
CAN_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler

B .

ENDP


ALIGN


; User Initial Stack & Heap

IF :DEF:__MICROLIB

EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit

ELSE

IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap

LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR

ALIGN

ENDIF


END



там перед объявлением зацикленных прерываний английским по белому написано

Dummy Exception Handlers (infinite loops which can be modified) smile.gif


а потом те прерывания, что могут быть использованы, определяются как EXPORT ....... [WEAK]..
' а потом зачем-то идут просто перечисления использованных прерываний.

Это эквивалентные способы указания на функцию, которая возможно будет использована?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 3 2010, 16:03
Сообщение #13


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Вы проглядели главное, у вас функция обработчика прерывания неправильно названа.
У вас SysTickHandler, а надо - SysTick_Handler. (С подчёркиванием). Исправьте, и всё заработает.

IMPORT SysTick_Handler - это уже лишнее.

ЗЫ. Если у вас C++, то надо перед обработчиком прерывания написать

Код
extern "C" void    SysTick_Handler();


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 09:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.0154 секунд с 7
ELECTRONIX ©2004-2016