|
|
  |
STM32F103 :выход из прерывания от системного таймера, Где находится бит который надо сбрасывать? |
|
|
|
Jan 29 2010, 15:36
|

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

|
Цитата(sonycman @ Jan 29 2010, 16:59)  Не нужно ничего сбрасывать для SysTick.
Вы точно ничего не напутали с инициализацией регистров таймера? Надеюсь, что нет Но буду смотреть.. основная программа перестает выполняться, как только первый бит регистра управления в 1 ставишь.. Возможна ситуация, когда таймер все время обнуляется, и все время вызывается прерывание... Спасибо за совет. Был удивлен, что часть информации, относящаяся к NVIC и SysTick не описана в мануале на процессор  .
|
|
|
|
|
Jan 29 2010, 17:48
|

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

|
Цитата(Serj78 @ Jan 29 2010, 19:36)  Возможна ситуация, когда таймер все время обнуляется, и все время вызывается прерывание... Конечно. Каким значением Вы проинициализировали регистр SysTick Reload Value?  Цитата(Serj78 @ Jan 29 2010, 19:36)  Был удивлен, что часть информации, относящаяся к NVIC и SysTick не описана в мануале на процессор  . Да, не стали повторять стандартные для всех ядер вещи. Я тоже не сразу нашёл нужный мануал
|
|
|
|
|
Feb 2 2010, 13:14
|

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

|
Цитата(sonycman @ Jan 29 2010, 20:48)  Конечно. Каким значением Вы проинициализировали регистр SysTick Reload Value?  Пробовал записывать разные значения. Для проверки счетчика сделал такой код: 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) перестает выполняться. в прерывании стоит мигнуть светодиодом или вообще в прерывании ничего не делать - без разницы.
|
|
|
|
|
Feb 2 2010, 14:42
|

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

|
Цитата(sonycman @ Feb 2 2010, 17:11)  И ещё - сначала записывайте reload регистр, а уже потом разрешайте прерывание. В тексте у Вас наоборот. Спасибо! завтра попробую поменять их местами... Функция выглядит как и все прерывания, я ее скопировал из файла какого-то примера, входящего в состав кейла, там все прерывания перечислены были. Кстати, если этот файл подключить к папкe "sourse" прерывания из него выполняются, а вот объявленных переменных в основной программе он не видит почему-то... Хотя имена регистров, объявленных через структуры, видит. Пока переношу из него только необходимые прерывания, но интересно, почему не происходит передача переменных.
Сообщение отредактировал rezident - Feb 2 2010, 19:21
Причина редактирования: Излишнее цитирование.
|
|
|
|
|
Feb 3 2010, 06:09
|

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

|
Поменял местами.. ситуация не изменилась.  функция прерывания выглядит так: 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) входит в прерывание и там, очевидно остается- программа перестает выполняться..
|
|
|
|
|
Feb 3 2010, 09:05
|

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

|
Чертовщина у Вас какая-то, вроде элементарные вещи - а не работают  Стёк достаточного размера? Как задан? Покажите таблицу векторов. Светодиод в прерывании моргает? Отладчик какой-нибудь есть? МТ-Линк, J-link сотоварищи? Продебажте - решите проблему за несколько минут. Попробуйте в обработчике прерывания запретить TICKINT, обработка главного цикла должна продолжиться. Если нет - проблема со стёком\неправильный вектор\ещё что нибудь левое.
|
|
|
|
|
Feb 3 2010, 11:45
|

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

|
В прерывании не выполняется ничего, ни светодиод не зажигается ни прерывание не отменяется (пробовал SysTick->CTRL=5; вставить) , как будто идет передача адреса куда-то на деревню дедушке.. Пытался сделать размер стека и размер "кучи" до 1000 байт, не помогло. где именно находятся сами адреса векторов- не нашел в стартап файле 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 и здравого смысла
|
|
|
|
|
Feb 3 2010, 12:53
|

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

|
Ну вот, что же Вы сразу не сказали, что в обработчик процессор не заходит?  Вектора находятся именно в стартапе - видите строчку: Код DCD SysTick_Handler это адрес, по которому будет переход при прерывании от системного таймера. Посмотрите дальше в этом файле, где находится эта метка. Вероятнее всего там заглушка вида: Код SysTick_Handler PROC EXPORT SysTick_Handler [WEAK] B . ENDP это тупое зацикливание. Вам можно сделать так - перед таблицей векторов разместите строчку: Код IMPORT SysTick_Handler и переименуйте свою функцию обработчика вот так: Код void SysTick_Handler(void) Таким образом, вектор будет указывать не на заглушку, а на адрес функции. Прежде, чем использовать прерывания, следует хорошо разобраться с тем, как они работают.
|
|
|
|
|
Feb 3 2010, 15:49
|

Знающий
   
Группа: Свой
Сообщений: 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)  а потом те прерывания, что могут быть использованы, определяются как EXPORT ....... [WEAK].. ' а потом зачем-то идут просто перечисления использованных прерываний. Это эквивалентные способы указания на функцию, которая возможно будет использована?
|
|
|
|
|
Feb 3 2010, 16:03
|

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

|
Вы проглядели главное, у вас функция обработчика прерывания неправильно названа. У вас SysTickHandler, а надо - SysTick_Handler. (С подчёркиванием). Исправьте, и всё заработает. IMPORT SysTick_Handler - это уже лишнее. ЗЫ. Если у вас C++, то надо перед обработчиком прерывания написать Код extern "C" void SysTick_Handler();
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|