Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 17.06.2018
Сообщений: 3

Внешние прерывания EXTI STM32F303VC - ARM, Cortex, STM32 микроконтроллер

17.06.2018, 15:38. Показов 1142. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Возникла проблема, пытаюсь заставить мигать светодиоды в 2 режимах меняющихся по внешнему прерыванию.
Внешнее прерывание от кнопки на порту PA0, притянутой к низкому уровню вручную. Контроллер на программу никак не реагирует.
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
#include "main.h"
#define del 100
#define LD3 GPIO_ODR_9
#define LD4 GPIO_ODR_8
#define LD5 GPIO_ODR_10
#define LD6 GPIO_ODR_15
#define LD7 GPIO_ODR_11
#define LD8 GPIO_ODR_14
#define LD9 GPIO_ODR_12
#define LD10 GPIO_ODR_13
 
volatile uint32_t Ticks=0;
void GPOA_INIT (void); //настраиваю кнопку
void GPOE_INIT (void); //настраиваю светодиоды
void SysTick_Handler (void);
void delay (uint32_t time);
void REJ2(void);
typedef void (*action)(void);
action button_action;
 
void REJ1(void){
    GPIOE->ODR = 0;
    button_action=REJ2;
}
 
 
void REJ2(void){
    GPIOE->ODR |= LD3;
    delay(del);
 
    GPIOE->ODR &=~ LD3;
    GPIOE->ODR |= (LD4|LD5);
    delay(del);
 
    GPIOE->ODR &=~ (LD4|LD5);
    GPIOE->ODR |= (LD6|LD7);
    delay(del);
 
    GPIOE->ODR &=~ (LD6|LD7);
    GPIOE->ODR |= (LD8|LD9);
    delay(del);
 
    GPIOE->ODR &=~ (LD8|LD9);
    GPIOE->ODR |= (LD10);
    delay(del);
 
    GPIOE->ODR |= (LD8|LD9);
    GPIOE->ODR &=~ (LD10);
    delay(del);
 
    GPIOE->ODR |= (LD6|LD7);
    GPIOE->ODR &=~ (LD8|LD9);
    delay(del);
 
    GPIOE->ODR |= (LD4|LD5);
    GPIOE->ODR &=~ (LD6|LD7);
    delay(del);
 
    GPIOE->ODR |= LD3;
    GPIOE->ODR &=~ (LD4|LD5);
    button_action=REJ1;
        }
 
 
int main(void){
    
    GPOA_INIT ();
    GPOE_INIT();
        GPIOE->ODR =0;
    SysTick_Config (SystemCoreClock/1000);
RCC->APB2ENR |=RCC_APB2ENR_SYSCFGEN;
SYSCFG->EXTICR[1] |=SYSCFG_EXTICR1_EXTI0_PA;
EXTI->IMR |=EXTI_IMR_MR0;
EXTI->RTSR |=EXTI_RTSR_TR0;//прерывание по восходящему фронту
 
 
 
button_action=REJ1;
while(1){
 
 
 
}
}
//------------------------------------------------------------------------------------------------
void GPOA_INIT (void){
    uint32_t i=0;
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
i++;
i++;
GPIOA->MODER &= ~(GPIO_MODER_MODER0_0|GPIO_MODER_MODER0_1);
 
}
 
//------------------------------------------------------------------------------------------------
void GPOE_INIT (void){
    uint32_t i=0;
RCC->AHBENR |= RCC_AHBENR_GPIOEEN;
i++;
i++;
GPIOE->MODER |=(GPIO_MODER_MODER8_0|GPIO_MODER_MODER9_0|GPIO_MODER_MODER10_0|GPIO_MODER_MODER11_0);
GPIOE->MODER |=(GPIO_MODER_MODER12_0|GPIO_MODER_MODER13_0|GPIO_MODER_MODER14_0|GPIO_MODER_MODER15_0);
}
//------------------------------------------------------------------------------------------------
void delay (uint32_t time)
{
    Ticks=time;
    while (Ticks!=0){}
}
void EXTI0_IRQHandler(void){
    button_action();
 
 
    EXTI->PR |= EXTI_PR_PR0;
 
}
void SysTick_Handler (void){
 
    if (Ticks>0){
        Ticks--;
    }
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.06.2018, 15:38
Ответы с готовыми решениями:

АЦП и таймер STM32F103 - ARM, Cortex, STM32 микроконтроллер
Здравствуйте, уважаемые форумчане. Ковыряюсь я с ацп и хочу запускать его по таймеру с частотой 1 КГц. Оцифрованные данные передаю по...

[РЕШЕНО]Внешние прерывания EXTI STM32F030
Добрый день, форумчане. Необходимо отлавливать на входе (PA12) импульсы по восходящему фронту. Настроил внешние прерывания - вход не...

Проект для стенда на базе ARM Cortex STM32
Нужна помощь! Нужно разработать проект для Стенда с периферией на основе STM32F102C6. Но мой уровень знаний не позволяет сделать это самому...

5
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
17.06.2018, 20:43
_Григорий__, У меня вот так, правда не на регистрах
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
 GPIO_InitTypeDef pins;
    EXTI_InitTypeDef EXTI_InitStruct;
    NVIC_InitTypeDef NVIC_InitStruct;
 
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
 
    pins.GPIO_Pin = GPIO_Pin_6;
    pins.GPIO_Mode = GPIO_Mode_IN;
    pins.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOF, &pins);
 
 
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource6);
 
    EXTI_InitStruct.EXTI_Line = EXTI_Line6;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStruct.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStruct);
 
    NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
Проверь включаешь ли ты вектор прерываний
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
17.06.2018, 21:08
Цитата Сообщение от _Григорий__ Посмотреть сообщение
GPIOE->ODR |= LD3;
это не АВР
здесь такие выкрутасы ни чему
почитай про регистры BSRR и BRR
Цитата Сообщение от _Григорий__ Посмотреть сообщение
C
1
2
3
4
5
6
typedef void (*action)(void);
action button_action;
void REJ1(void){
 GPIOE->ODR = 0;
 button_action=REJ2;
}
что сие?


я вот не понимаю зачем лесть в дебри не зная даже основ
чем код который генерит CUBE не угодил?
0
0 / 0 / 0
Регистрация: 17.06.2018
Сообщений: 3
20.06.2018, 04:26  [ТС]
вроде исправил внешнее прерывание стало работать, появилась другая проблема. В отладчике выполнение программы то зависает на функции прерывания EXTI0_IRQHandler , то лезет зачем то туда куда вообще не должна лезть, в общем не совсем адекватно себя ведет. вот код:
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
#include "main.h"
 
#define LD3 GPIO_ODR_9
#define LD4 GPIO_ODR_8
#define LD5 GPIO_ODR_10
#define LD6 GPIO_ODR_15
#define LD7 GPIO_ODR_11
#define LD8 GPIO_ODR_14
#define LD9 GPIO_ODR_12
#define LD10 GPIO_ODR_13
 
 
void GPOA_INIT (void);
void GPOE_INIT (void);
void REJ2(void);
void TIM6_init (void);
void delay (uint32_t time);
void EXTI_INIT (void);
void EXTI0_IRQHandler(void);
void REJ1(void);
void REJ2(void);
 
 
uint32_t i=0;//обьявление глобальной переменной
 
int main(void){
GPOA_INIT ();
GPOE_INIT();
EXTI_INIT();
TIM6_init();
GPIOE->ODR =0;
 
while(1){
    if (i==1){
        REJ2();
    }
    if(i==2){
        GPIOE->ODR |=(LD4|LD5);
    }
    if((i!=1)&&(i!=2)){
        REJ1();
        i=0;
    }
}
}
//----------------------------------------------------------------------------------------------—
void GPOA_INIT (void){
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
GPIOA->MODER &= ~(GPIO_MODER_MODER0_0|GPIO_MODER_MODER0_1);
GPIOA->PUPDR &=~(GPIO_PUPDR_PUPDR0_0|GPIO_PUPDR_PUPDR0_0);
}
 
//----------------------------------------------------------------------------------------------—
void GPOE_INIT (void){
RCC->AHBENR |= RCC_AHBENR_GPIOEEN;
GPIOE->MODER |=(GPIO_MODER_MODER8_0|GPIO_MODER_MODER9_0|GPIO_MODER_MODER10_0|GPIO_MODER_MODER11_0);
GPIOE->MODER |=(GPIO_MODER_MODER12_0|GPIO_MODER_MODER13_0|GPIO_MODER_MODER14_0|GPIO_MODER_MODER15_0);
}
//----------------------------------------------------------------------------------------------—
void TIM6_init (void){
    RCC->APB1ENR |=RCC_APB1ENR_TIM6EN;
    TIM6->PSC =8000-1;//на сколько мы делим частоту самого контроллера(пределитель)
    TIM6->DIER |=TIM_DIER_UIE; //разрешение прерываний /не забыть в прерывании сбросить флаг
    TIM6->CR1 |=TIM_CR1_OPM;//режим одного импульса
}
//----------------------------------------------------------------------------------------------—
void delay (uint32_t time){
    TIM6->ARR =time-1; //до скольки мы будем ссчитать (период)
    TIM6->CNT=0; //сброс счетчика
    TIM6->CR1 |=TIM_CR1_CEN; //включение самого таймера
    while((TIM6->SR & TIM_SR_UIF)==0){} //дождаться конца задержки
    TIM6->SR &= ~TIM_SR_UIF;          //сбросить флаг
}
//----------------------------------------------------------------------------------------------—
void EXTI_INIT (void){
    RCC->APB2ENR |=RCC_APB2ENR_SYSCFGEN;
    SYSCFG->EXTICR[1] |=SYSCFG_EXTICR1_EXTI0_PA;
    EXTI->IMR |=EXTI_IMR_MR0;//разрешаю прерывания на 0 канале эксти
    EXTI->RTSR |=EXTI_RTSR_TR0; //прерывание по восходящему фронту
    NVIC_EnableIRQ(EXTI0_IRQn);//включаю вектор прерываний
 
}
//----------------------------------------------------------------------------------------------—
void EXTI0_IRQHandler(void){
    delay(100);//борьба с дребезгом кнопки
    GPIOE->ODR=0; //гашу все светодиоды
    i=i+1;
    EXTI->PR =0x1; //сбрасываю флаг прерывания
}
//----------------------------------------------------------------------------------------------—
void REJ1(void){
GPIOE->ODR = 0;
}
//----------------------------------------------------------------------------------------------—
void REJ2(void){
GPIOE->ODR |= LD3;
delay(200);
 
GPIOE->ODR &=~ LD3;
GPIOE->ODR |= (LD4|LD5);
delay(200);
 
GPIOE->ODR &=~ (LD4|LD5);
GPIOE->ODR |= (LD6|LD7);
delay(200);
 
GPIOE->ODR &=~ (LD6|LD7);
GPIOE->ODR |= (LD8|LD9);
delay(200);
 
GPIOE->ODR &=~ (LD8|LD9);
GPIOE->ODR |= (LD10);
delay(200);
 
GPIOE->ODR |= (LD8|LD9);
GPIOE->ODR &=~ (LD10);
delay(200);
 
GPIOE->ODR |= (LD6|LD7);
GPIOE->ODR &=~ (LD8|LD9);
delay(200);
 
GPIOE->ODR |= (LD4|LD5);
GPIOE->ODR &=~ (LD6|LD7);
delay(200);
 
GPIOE->ODR |= LD3;
GPIOE->ODR &=~ (LD4|LD5);
}
//----------------------------------------------------------------------------------------------—
Добавлено через 12 минут
После первого нажатия кнопки ведет себя нормально, а на втором зависает в функции прерывания и не выходит оттуда
0
Эксперт по электронике
6814 / 3239 / 337
Регистрация: 28.10.2011
Сообщений: 12,652
Записей в блоге: 7
20.06.2018, 10:04
Цитата Сообщение от _Григорий__ Посмотреть сообщение
delay(100)
Не нужно так делать в обработчике прерывания, тем более у которого максимальный приоритет.
2
0 / 0 / 0
Регистрация: 17.06.2018
Сообщений: 3
20.06.2018, 14:45  [ТС]
убрал delay(100) из прерывания, стал сам по себе через раз переходить с 89 на 72 строку, там где идет сброс флага таймера и после чего пытается доделывать фукцию REJ2

Добавлено через 6 минут
все понял, контроллер после преывания возвращает туда где он делал , то есть в мигание, доделывает и только потом идет дальше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.06.2018, 14:45
Помогаю со студенческими работами здесь

Внешние прерывания STM32
Здравствуйте, уважаемые форумчане. Разбираюсь я нынче в прерываниях и их приоритетах. Так вот понять не могу как в одном прерывании...

Внешние прерывания STM32 + CoIDE
Использую STM32-VL-DISCOVERY и Кокос. Никак не могу понять - как с помощью API (без прямого обращения к регистрам) настроить внешние...

STM32 Внутренние и внешние прерывания. Помогите разобраться.
Здравствуйте! Помогите пожалуйста разобраться с прерываниями. Вернее с тем как их настраивать используя только CMSIS. Мой девайс...

Внешние события EXTI
Заранее прошу прощения за слегка глупый вопрос, но не могу сообразить по какому регистру отследить внешнее событие? Меня интересует именно...

Сравнение "Qualcomm MSM8909 Snapdragon 210 ARM Cortex A7" и MT6737H Cortex-A53"
Сравниваю Сравнение "Qualcomm MSM8909 Snapdragon 210 ARM Cortex A7" и "MT6737H Cortex-A53" и не могу понять - чем они различаются кроме...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru