Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
SergeyYe
2 / 2 / 0
Регистрация: 09.02.2019
Сообщений: 14
1

Прерывание: IAR+STM32+EXTI0

10.02.2019, 11:05. Просмотров 1140. Ответов 21
Метки нет (Все метки)

Не получается обработать прерывание EXTI0. При наступлении события улетаю в никуда и там зависаю. Такое впечатление, что IAR не понимает, какая функция является обработчиком. И как её тогда определить?


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void EXTI_Init (void)
{
  RCC -> APB2ENR |= RCC_APB2ENR_AFIOEN;       // Тактирование альтернативных функций.
  AFIO -> EXTICR[0] |= AFIO_EXTICR1_EXTI0_PA;
  EXTI -> RTSR |= EXTI_RTSR_TR0;              // Прерывание по фронту.
  EXTI -> IMR |= EXTI_IMR_MR0;                // Прерывания от ноги 0 разрешены.
  NVIC_EnableIRQ (EXTI0_IRQn);                // Разрешаем прерывания на нулевой ноге.
}
 
void EXTI0_IRQHandler (void)                  // Обработчик прерывания EXTI0.
{
  EXTI -> PR |= 1;                            // Сбрасываем флаг прерывания.
  PortC -> BSRR |= GPIO_BSRR_BR13;            // Включаем свтодиод.
  SysTickDelay (2000, mS);                    // Пауза 2000 mSec.
  PortC -> BSRR |= GPIO_BSRR_BS13;            // Выключаем свтодиод.
  while (~PinA0);                             // Ждём отпускания кнопки.
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2019, 11:05
Ответы с готовыми решениями:

Help! Прерывание и IAR
Всем привет. Может кто поможет? Проблема возникла с прерыванием, а точнее с обработчиком...

STM32 + IAR
Здравствуйте! Подскажите, пожалуйста, как подключить STM32 через jtag порт к IAR? Использую...

Stm32 в IAR на C++
Добрый вечер! Такой у меня есть вопросик: написал программу-мигалку для stm32f303 в iar на си, все...

IAR для stm32
Добрый день! Вопрос может и глупый, но уже несколько часов тыкаюсь и ничего не получается) пишу в...

stm32 iar прерывания
добрый день, ув. форумчае пытаюсь настроить ацп, посмотрел вот этот видео урок...

21
Radikal_78
47 / 47 / 2
Регистрация: 20.11.2016
Сообщений: 106
10.02.2019, 11:30 2
SergeyYe, не помещай ты задержки в подпрограммы по обработке прерываний.

C
1
SysTickDelay (2000, mS);                    // Пауза 2000 mSec.
а размещай их в основной программе
1
SergeyYe
2 / 2 / 0
Регистрация: 09.02.2019
Сообщений: 14
10.02.2019, 12:34  [ТС] 3
Cогласен, спасибо. Но в данном случае до этой строчки дело не доходит.
0
ValeryS
Модератор
7448 / 5640 / 716
Регистрация: 14.02.2011
Сообщений: 19,211
Завершенные тесты: 1
10.02.2019, 13:01 4
Цитата Сообщение от SergeyYe Посмотреть сообщение
что IAR не понимает,
значит не понимает
или имя функции обработчика не совпадает с именем из таблицы
или происходит искажение имен, компиляция в режиме C++
1
Radikal_78
47 / 47 / 2
Регистрация: 20.11.2016
Сообщений: 106
10.02.2019, 13:13 5
SergeyYe, еще ошибка

C
1
PortC -> BSRR |= GPIO_BSRR_BR13;            // Включаем светодиод.
регистр BSRR как и регистр BRR являются атомарными регистрами. Для работы с ними операция ИЛИ не нужна.
Чтобы включить парочку светодиодов мы можем написать просто так GPIOC->BSRR = GPIO_BSRR_BS8|GPIO_BSRR_BS9;

Подробнее об этом регистре BSRR ты можешь прочитать в инете
1
SergeyYe
2 / 2 / 0
Регистрация: 09.02.2019
Сообщений: 14
10.02.2019, 13:32  [ТС] 6
Да, | нарисовал машинально. Но работает. Только код несколько длинней. Спасибо.

Добавлено через 1 минуту
Добавлено через 3 минуты
Скорее всего не настроена таблица векторов прерывания, но я не могу понять, как это сделать. Имя совпадает, но не могу найти файл, где обработчику присваивается соответствующий вектор.
0
ValeryS
Модератор
7448 / 5640 / 716
Регистрация: 14.02.2011
Сообщений: 19,211
Завершенные тесты: 1
10.02.2019, 14:19 7
Цитата Сообщение от SergeyYe Посмотреть сообщение
Имя совпадает, но не могу найти файл, где обработчику присваивается соответствующий вектор.
про IAR не знаю а вот в Keil это файл с расширением S(ассемблерный файл) где представлена вся таблица
по умолчанию все обработчика уводят в один, вечный цикл
и чтобы "настроить" достаточно включить в проект функцию с именем из таблицы прерываний
Цитата Сообщение от SergeyYe Посмотреть сообщение
Имя совпадает,
как узнал?
0
SergeyYe
2 / 2 / 0
Регистрация: 09.02.2019
Сообщений: 14
10.02.2019, 14:34  [ТС] 8
Смотрел этот самый файл. Вот он с сокращениями:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
;******************** (C) COPYRIGHT 2017 STMicroelectronics ********************
;* File Name          : startup_stm32f103xb.s
;* Author             : MCD Application Team
;* Version            : V4.2.0
;* Date               : 31-March-2017
;* Description        : STM32F103xB Performance Line Devices vector table for 
;*                      EWARM toolchain.
;*                      ГќГІГ®ГІ ìîäóëü âûïîëГ*ГїГҐГІ:
;*                      - Set the initial SP
;*                      - Configure the clock system
;*                      - Set the initial PC == __iar_program_start,
;*                      - Set the vector table entries with the exceptions ISR 
;*                        address.
;*                      After Reset the Cortex-M3 processor is in Thread mode,
;*                      priority is Privileged, and the Stack is set to Main.
;********************************************************************************
;
; The modules in this file are included in the libraries, and may be replaced
; by any user-defined modules that define the PUBLIC symbol _program_start or
; a user defined start symbol.
; To override the cstartup defined in the library, simply add your modified
; version to the workbench project.
;
; The vector table is normally located at address 0.
; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
; The name "__vector_table" has special meaning for C-SPY:
; it is where the SP start value is found, and the NVIC vector
; table register (VTOR) is initialized to this address if != 0.
;
; Cortex-M version
;
 
        MODULE  ?cstartup
 
        ;; Forward declaration of sections.
        SECTION CSTACK:DATA:NOROOT(3)
 
        SECTION .intvec:CODE:NOROOT(2)
 
        EXTERN  __iar_program_start
        EXTERN  SystemInit        
        PUBLIC  __vector_table
 
        DATA
__vector_table
        DCD     sfe(CSTACK)
        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     DMA1_Channel1_IRQHandler  ; DMA1 Channel 1
        DCD     DMA1_Channel2_IRQHandler  ; DMA1 Channel 2
        DCD     DMA1_Channel3_IRQHandler  ; DMA1 Channel 3
        DCD     DMA1_Channel4_IRQHandler  ; DMA1 Channel 4
        DCD     DMA1_Channel5_IRQHandler  ; DMA1 Channel 5
 
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Default interrupt handlers.
;;
        THUMB
 
        PUBWEAK Reset_Handler
        SECTION .text:CODE:REORDER:NOROOT(2)
Reset_Handler
        LDR     R0, =SystemInit
        BLX     R0
        LDR     R0, =__iar_program_start
        BX      R0
        
        PUBWEAK NMI_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)
NMI_Handler
        B NMI_Handler
 
        PUBWEAK HardFault_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)
HardFault_Handler
        B HardFault_Handler
 
        PUBWEAK MemManage_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)
MemManage_Handler
        B MemManage_Handler
 
        PUBWEAK BusFault_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)
BusFault_Handler
        B BusFault_Handler
 
        PUBWEAK UsageFault_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)
UsageFault_Handler
        B UsageFault_Handler
 
        PUBWEAK PendSV_Handler
        SECTION .text:CODE:REORDER:NOROOT(1)
PendSV_Handler
        B PendSV_Handler
 
        PUBWEAK RCC_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
RCC_IRQHandler
        B RCC_IRQHandler
 
        PUBWEAK EXTI0_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
EXTI0_IRQHandler                                  ;        <-----------------
        B EXTI0_IRQHandler
 
        PUBWEAK EXTI1_IRQHandler
        SECTION .text:CODE:REORDER:NOROOT(1)
EXTI1_IRQHandler
        B EXTI1_IRQHandler
 
 
 
        END
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
0
ValeryS
Модератор
7448 / 5640 / 716
Регистрация: 14.02.2011
Сообщений: 19,211
Завершенные тесты: 1
10.02.2019, 15:15 9
Цитата Сообщение от SergeyYe Посмотреть сообщение
При наступлении события улетаю в никуда и там зависаю.
смотри в отладчике
если висишь вот здесь
Цитата Сообщение от SergeyYe Посмотреть сообщение
Assembler
1
2
EXTI0_IRQHandler  <-----------------
 B EXTI0_IRQHandler
то нет обработчика события
если в другом(тогда в каком?) то неправильно настроено прерывание
0
SergeyYe
2 / 2 / 0
Регистрация: 09.02.2019
Сообщений: 14
10.02.2019, 15:30  [ТС] 10
Обработчик нигде даже не упоминается. Он просто не компилируется.
Как указать компилятору, что
C
1
void EXTI0_IRQHandler (void)
есть обработчик?

Вот содержимое окна отладчика на момент зависания.

__cmain:
0x80001c0: 0xf000 0xf80d BL __low_level_init ; 0x80001de
0x80001c4: 0x2800 CMP R0, #0
0x80001c6: 0xd001 BEQ.N _call_main ; 0x80001cc
0x80001c8: 0xf3af 0x8000 NOP.W
_call_main:
0x80001cc: 0xf3af 0x8000 NOP.W
0x80001d0: 0x2000 MOVS R0, #0
0x80001d2: 0xf3af 0x8000 NOP.W
0x80001d6: 0xf7ff 0xff3f BL main ; 0x8000058
_main:
0x80001da: 0xf000 0xf802 BL exit ; 0x80001e2
__low_level_init:
0x80001de: 0x2001 MOVS R0, #1
0x80001e0: 0x4770 BX LR
exit:
0x80001e2: 0xf000 0xb801 B.W _exit ; 0x80001e8
BusFault_Handler:
DebugMon_Handler:
HardFault_Handler:
MemManage_Handler:
NMI_Handler... +4 symbols not displayed:
0x80001e6: 0xe7fe B.N BusFault_Handler ; 0x80001e6 === Висну на этом адресе ===
_exit:
0x80001e8: 0x4607 MOV R7, R0
0x80001ea: 0x4638 MOV R0, R7
0x80001ec: 0xf000 0xf802 BL __exit ; 0x80001f4
0x80001f0: 0xe7fb B.N 0x80001ea
0x80001f2: 0x0000 MOVS R0, R0
__exit:
0x80001f4: 0xb580 PUSH {R7, LR}
0x80001f6: 0xf3af 0x8000 NOP.W
0x80001fa: 0x4a02 LDR.N R2, [PC, #0x8] ; 0x20026 (131110)
0x80001fc: 0x0011 MOVS R1, R2
0x80001fe: 0x2018 MOVS R0, #24 ; 0x18
0
Radikal_78
47 / 47 / 2
Регистрация: 20.11.2016
Сообщений: 106
10.02.2019, 19:01 11
а если оставить в прерывании только включение светодиода, то все нормально будет работать без
фаултов?
C
1
2
3
4
5
void EXTI0_IRQHandler (void)                  // Обработчик прерывания EXTI0.
{
  EXTI -> PR |= 1;                            // Сбрасываем флаг прерывания.
  PortC -> BSRR = GPIO_BSRR_BR13;            // Включаем светодиод.
}
0
SergeyYe
2 / 2 / 0
Регистрация: 09.02.2019
Сообщений: 14
10.02.2019, 19:50  [ТС] 12
До светодиода дело не доходит. Не выполняется даже первая команда. Для этого надо, чтобы программа вошла в обработчик. А именно этого-то и не происходит.
0
Radikal_78
10.02.2019, 22:37
  #13

Не по теме:


SergeyYe, это ваш первый проект?

0
SergeyYe
2 / 2 / 0
Регистрация: 09.02.2019
Сообщений: 14
10.02.2019, 22:45  [ТС] 14
Далеко не первый, но прерывание потребовалось только сейчас.
0
Radikal_78
47 / 47 / 2
Регистрация: 20.11.2016
Сообщений: 106
10.02.2019, 23:03 15
SergeyYe,
может вызывается какое-то другое прерывание?

со 103-ми контроллерами не работал, поэтому проверить код не могу. Вписывай во все обработчики прерываний в файле
stm32f103..._it.с
строчку while (1);
так прерывание зависнет в каком-то обработчике, а не будет уходить в BusFault_Handler и HardFault_Handler
0
SergeyYe
2 / 2 / 0
Регистрация: 09.02.2019
Сообщений: 14
10.02.2019, 23:54  [ТС] 16
Спасибо, попробую. Сейчас собрал проект в Keil. Заливаю...

Добавлено через 37 минут
Ну вот... Keil отнёсся ко мне по-человечески. Всё работает, всё прерывается. Стало быть либо IAR кривой, либо руки не с оттуда.
А вообще, две последние версии (8.30 и 8.32) IAR у меня глючат. Попробую переустановить.
0
alexey6689
63 / 38 / 11
Регистрация: 15.11.2012
Сообщений: 203
Завершенные тесты: 1
12.02.2019, 15:26 17
Из того, что вижу я - в обработчике отсутствует
C
1
NVIC_ClearPendingIRQ(EXTI0_IRQn);
1
SergeyYe
2 / 2 / 0
Регистрация: 09.02.2019
Сообщений: 14
12.02.2019, 16:40  [ТС] 18
Цитата Сообщение от alexey6689 Посмотреть сообщение
NVIC_ClearPendingIRQ(EXTI0_IRQn);
Эта функция сбрасывает нулевой бит в Pending register (EXTI_PR). Т.е. прописывает туда 1. В обработчике это действие происходит в первой строке (см. первый пост):

C
1
2
3
void EXTI0_IRQHandler (void)                  // Обработчик прерывания EXTI0.
{
  EXTI -> PR = 1;                             // Сбрасываем флаг прерывания.
Но, напомню, проблема была в том, что до исполнения этой команды дело не доходило.
0
alexey6689
63 / 38 / 11
Регистрация: 15.11.2012
Сообщений: 203
Завершенные тесты: 1
12.02.2019, 20:33 19
Цитата Сообщение от SergeyYe Посмотреть сообщение
Эта функция сбрасывает нулевой бит в Pending register (EXTI_PR)
Нет, эта функция сбрасывает флаг прерывания в NVIC.
А EXTI -> PR сбрасывает бит в EXTI. Это разные устройства.
Если этого не сделать - сразу по выходу из прерывания обработчика зайдете туда снова, до бесконечности. Причем у меня были ситуации, когда отладчик не показывает этого.
1
SergeyYe
2 / 2 / 0
Регистрация: 09.02.2019
Сообщений: 14
12.02.2019, 21:30  [ТС] 20
Спасибо. Но исторически так сложилось, что я не пользуюсь библиотеками. Откуда эта функция? Раскройте её содержимое.
0
12.02.2019, 21:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2019, 21:30

STM32 + SSD1963 + IAR
Доброго времени суток все! неделю маюсь уже с дисплеем на контроллере ssd1963. в общем не могу...

"Наложение" переменных. STM32, IAR, возможно?
Использую IAR. После дополнения программы (различными буферами и переменными) для STM32F100C8, мое...

STM32 independent watchdog и дебаг в IAR
Подскажите пожалуйста с одним вопросом. Как я понимаю independent watchdog, однажды заведенный,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru