Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 310
1

STM32F0DISCOVERY (STM32F051R8T6) Внешнее прерывание на PA1

16.09.2015, 15:46. Просмотров 1329. Ответов 20
Метки нет (Все метки)

Проблема с настройкой внешнего прерывания на PA1
Настройки прерывания:
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
#include "stm32f0xx_exti.h"
#include "stm32f0xx_gpio.h"
#include "stm32f0xx_rcc.h"
#include "stm32f0xx_misc.h"
#include "stm32f0xx_syscfg.h"
 
EXTI_InitTypeDef exti;
NVIC_InitTypeDef nvic;
GPIO_InitTypeDef gpio;
 
void RCC_Set(void);
void exti_setting(void);
void GPIO_Set(void);
 
 
//############################################################//
//##################Включаем тактирование#####################//
//############################################################//
void RCC_Set(void)
{
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);
}
//############################################################//
//############################################################//
//############################################################//
 
//############################################################//
//#######################Настройка GPIO#######################//
//############################################################//
void GPIO_Set(void)
{
    gpio.GPIO_Mode=GPIO_Mode_OUT;
    gpio.GPIO_OType=GPIO_OType_PP;
    gpio.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
    gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
    gpio.GPIO_Speed=GPIO_Speed_Level_2;
    GPIO_Init(GPIOC,&gpio);
    
    gpio.GPIO_Mode=GPIO_Mode_IN;
    gpio.GPIO_OType=GPIO_OType_PP;
    gpio.GPIO_Pin=GPIO_Pin_1;
    gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
    gpio.GPIO_Speed=GPIO_Speed_Level_2;
    GPIO_Init(GPIOA,&gpio); 
}
//############################################################//
//############################################################//
//############################################################//
 
 
//############################################################//
//###################Настройка Прерывания#####################//
//############################################################//
void exti_setting(void)
{
    exti.EXTI_Line=EXTI_Line1;
    exti.EXTI_LineCmd=ENABLE;
    exti.EXTI_Mode=EXTI_Mode_Interrupt;
    exti.EXTI_Trigger=EXTI_Trigger_Rising_Falling;
    EXTI_Init(&exti);
    
    nvic.NVIC_IRQChannel=EXTI0_1_IRQn;
    nvic.NVIC_IRQChannelCmd=ENABLE;
    nvic.NVIC_IRQChannelPriority=0;
    NVIC_Init(&nvic);
 
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource1);
    NVIC_EnableIRQ(EXTI0_1_IRQn);
}
//############################################################//
//############################################################//
//############################################################//
 
 
int main(void)
{
RCC_Set();
GPIO_Set(); 
exti_setting();
    
    while(1)
    {
        
    }
}
 
//############################################################//
//##################Обработчик Прерывания#####################//
//############################################################//
void EXTI0_1_IRQHandler(void)
{
    GPIOC->ODR^=GPIO_Pin_8; //Инвертируем состояние светодиода
    EXTI_ClearITPendingBit(EXTI_Line1);
}
//############################################################//
//############################################################//
//############################################################//
Чтобы не падал на PA1 обработчик не отрабатывает! Что не так, что я упустил?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2015, 15:46
Ответы с готовыми решениями:

Внешнее прерывание
Привет всем! Столкнулся с проблемой - при использовании внешнего прерывания по переднему фронту...

внешнее прерывание на tiny15
Проблема в следующем: На тини15 к выводу Int0 подключаю кнопку без фиксатора, через которую...

Не срабатывает внешнее прерывание
.divice atmega8 .nolist .include "m8def.yms" .list ;===================== .def temp= r16...

Внешнее прерывание на ATmega328p
Такой вот не замысловатый текст. Но ни INT0 ни INT1 не срабатывает. В AVR Studio на PORTD (если...

Внешнее прерывание ATmega2560 в ASM
Добрый день! Не могу настроить прерывание по кнопке на INT0 у МК ATmega2560. Посмотрите...

20
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
16.09.2015, 16:44 2
а не должно быть еще что то типа:
C
1
2
  EXTI_RTSR = ( 1 >> 0 ); //разрешаем срабатывание по переднему фронту
  EXTI_FTSR = ( 1 >> 0 ); //разрешаем срабатывание по заднему фронту
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 310
16.09.2015, 17:07  [ТС] 3
exti.EXTI_Trigger=EXTI_Trigger_Rising_Falling; вот оно
0
Voland_
1699 / 1043 / 98
Регистрация: 04.01.2010
Сообщений: 3,534
16.09.2015, 20:32 4
GaFBich, код из примера брали? или написали сами?
ЗЫ: все, что я нашел, это не совсем правильно иниченый PA1:
C
1
2
3
4
5
6
7
  
[B]    gpio.GPIO_Mode=GPIO_Mode_IN;
    gpio.GPIO_OType=GPIO_OType_PP;
[/B]    gpio.GPIO_Pin=GPIO_Pin_1;
    gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
    gpio.GPIO_Speed=GPIO_Speed_Level_2;
    GPIO_Init(GPIOA,&gpio);
Судя по именам дефайнов вы задаете PA1 быть входом, но, скорее всего, с несовместимым для этого режима "GPIO_OType_PP"... Надо заглядывать в исходник функции Init, но наверное, так быть не должно.
0
16.09.2015, 20:32
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 310
16.09.2015, 21:36  [ТС] 5
Сам писал.
GPIO_OType_PP - вход с подтягиванием
GPIO_OType_OD – открытый коллектор. Я думаю, что с открытым коллектором здесь не к месту.
0
Voland_
1699 / 1043 / 98
Регистрация: 04.01.2010
Сообщений: 3,534
16.09.2015, 21:56 6
Сперто с какого-то бельгийского сайта, описание для кортексов F4, но подходит тоже:
On the STM32F4 the GPIO can have up to 4 modes (check the datasheet for which modes are available for which pin):

GPIO_Mode_OUT for digital output
GPIO_Mode_IN for digital input
GPIO_Mode_AN for analog input
GPIO_Mode_AF for the alternate functions (like SPI, I²C, USORT, …)
The type indicates the hardware configuration of the pin which can be:

GPIO_OType_PP, a push-pull is driving the output
GPIO_OType_OD, the output is open-drain
Next we can configure pull up, pull down resistors or nothing at all for each pin:

GPIO_PuPd_NOPULL, no resistor connected
GPIO_PuPd_UP, pin is connected to a pull up resistor
GPIO_PuPd_DOWN, pin is connect to a pull down resistor
GPIO_OType_PP - это тип для пуш-пульного ВЫХОДА. А вам надо GPIO_PuPd_*** использовать.
ЗЫ: Возможно, это не поможет...
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 310
17.09.2015, 09:37  [ТС] 7
Проблема еще актуальна!
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
17.09.2015, 10:17 8
А где команда разрешения прерываний на уровне ядра процессора?
Что то типа
C
1
EnableInterrupts();
Ваш NVIC_EnableIRQ разрешает конкретное прерывание еще должна быть команда разрешающая все маскированные прерывания.
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 310
17.09.2015, 10:57  [ТС] 9
Витальич, спасибо. Пересмотрел Даташит на камень, так и не обнаружил явно такого, что Вы предложили. Если только Clock interrupt register (RCC_CIR) бит 11. Но все равно не робит!(
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
17.09.2015, 11:27 10
Я не работал не с Keil и с F051.
Но я таки знаю, что для разрешения прерываний надо сделать три вещи:
Разрешить глобальные прерывания
Разрешить нужное прерывание в NVIC
Настроить и разрешить конкретные прерывания непосредственно в периферии. Т.е. настроить нужные events на прерывания.
Похоже что Вы используете CMSIS, ищите в нем что то типа EnableInterrupts(); или __enable_irq (); итд (Разрешить глобальные прерывания)
Цитата Сообщение от GaFBich Посмотреть сообщение
Пересмотрел Даташит на камень, так и не обнаружил явно такого
Флаг разрешение маскированных прерываниях вообще то находится в регистре r15 ядра. В концепции документации ST такое не будет написано в даташите на конкретный камень, это архитектура ядра и находится в соответствующем документе.
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 310
17.09.2015, 11:38  [ТС] 11
Витальич __enable_irq (); - пробовал ранее - не работает!
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
17.09.2015, 11:44 12
Цитата Сообщение от GaFBich Посмотреть сообщение
__enable_irq ()
оставите в коде оно нужно.
Значит есть еще ошибка, но тут я Вам помочь не смогу из-за того, что кристалл не знаком мне.
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 310
17.09.2015, 12:00  [ТС] 13
Что самое интересное что данный код абсолютно нормально работает в CooCox а в Keil нет!
0
Voland_
1699 / 1043 / 98
Регистрация: 04.01.2010
Сообщений: 3,534
17.09.2015, 23:05 14
попробуйте еще сбросить флаг прерывания. Команда, типа EXTI_ClearITPendingBit или как-то так.
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 310
18.09.2015, 07:37  [ТС] 15
Пробовал, эффекта ни какого. В CooCox работает все без нареканий, а в Keil нет. К вечеру попробую еще раз глянуть даташиты. А может кривая библа SPD.

Добавлено через 7 минут
В общем для меня это конечно загадка. Возможно в CooCox смещение в записи, в Keil начинается вроде с 0x80000000.
0
Voland_
1699 / 1043 / 98
Регистрация: 04.01.2010
Сообщений: 3,534
18.09.2015, 08:09 16
GaFBich, выложите здесь исходник функции GPIO_Init, и дефайны, которые вы используете для инита ноги. Только из SDK KEIL'а.
ЗЫ: мне нет причин качать их самому.
1
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 310
18.09.2015, 11:41  [ТС] 17
SDK Keil
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
/**
  * @brief  Initializes the GPIOx peripheral according to the specified 
  *         parameters in the GPIO_InitStruct.
  * @param  GPIOx: where x can be (A, B, C, D, E or F) to select the GPIO peripheral.
  * @note   GPIOE is available only for STM32F072.
  * @note   GPIOD is not available for STM32F031.   
  * @param  GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that contains
  *         the configuration information for the specified GPIO peripheral.
  * @retval None
  */
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
  uint32_t pinpos = 0x00, pos = 0x00 , currentpin = 0x00;
 
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
  assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
  assert_param(IS_GPIO_PUPD(GPIO_InitStruct->GPIO_PuPd));
 
  /*-------------------------- Configure the port pins -----------------------*/
  /*-- GPIO Mode Configuration --*/
  for (pinpos = 0x00; pinpos < 0x10; pinpos++)
  {
    pos = ((uint32_t)0x01) << pinpos;
 
    /* Get the port pins position */
    currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
 
    if (currentpin == pos)
    {
      if ((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF))
      {
        /* Check Speed mode parameters */
        assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
 
        /* Speed mode configuration */
        GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (pinpos * 2));
        GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (pinpos * 2));
 
        /* Check Output mode parameters */
        assert_param(IS_GPIO_OTYPE(GPIO_InitStruct->GPIO_OType));
 
        /* Output mode configuration */
        GPIOx->OTYPER &= ~((GPIO_OTYPER_OT_0) << ((uint16_t)pinpos));
        GPIOx->OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) << ((uint16_t)pinpos));
      }
 
      GPIOx->MODER  &= ~(GPIO_MODER_MODER0 << (pinpos * 2));
 
      GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (pinpos * 2));
 
      /* Pull-up Pull down resistor configuration */
      GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << ((uint16_t)pinpos * 2));
      GPIOx->PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) << (pinpos * 2));
    }
  }
}
 
/**
  * @brief  Fills each GPIO_InitStruct member with its default value.
  * @param  GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure which will 
  *         be initialized.
  * @retval None
  */
Это не посредственно из моего кода, включение тактирования не привожу
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 gpio;
 
//############################################################//
//#######################Настройка GPIO#######################//
//############################################################//
void GPIO_Set(void)
{
    gpio.GPIO_Mode=GPIO_Mode_OUT;
    gpio.GPIO_OType=GPIO_OType_PP;
    gpio.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
    gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
    gpio.GPIO_Speed=GPIO_Speed_Level_2;
    GPIO_Init(GPIOC,&gpio);
    
    gpio.GPIO_Mode=GPIO_Mode_IN;
    gpio.GPIO_OType=GPIO_OType_PP;
    gpio.GPIO_Pin=GPIO_Pin_1;
    gpio.GPIO_PuPd=GPIO_PuPd_NOPULL;
    gpio.GPIO_Speed=GPIO_Speed_Level_2;
    GPIO_Init(GPIOA,&gpio); 
}
//############################################################//
//############################################################//
//############################################################//
0
Voland_
1699 / 1043 / 98
Регистрация: 04.01.2010
Сообщений: 3,534
18.09.2015, 12:36 18
GaFBich, интересно, что данным кодом, получается, нельзя переключить сконфигуреный на выход пин, обратно на вход или вообще отключить...
ЗЫ: это код от KEIL или это код из свежего SDK от ST?
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 310
18.09.2015, 12:49  [ТС] 19
Это я вынул из библы STANDART PERIPHERY DEVICE (stm32f0xx_gpio.c)
0
Voland_
1699 / 1043 / 98
Регистрация: 04.01.2010
Сообщений: 3,534
18.09.2015, 12:58 20
Цитата Сообщение от GaFBich Посмотреть сообщение
Это я вынул из библы STANDART PERIPHERY DEVICE (stm32f0xx_gpio.c)
ну так где вы ее взяли?
0
18.09.2015, 12:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2015, 12:58

Внешнее прерывание Mega16 - [РЕШЕНО]
Код#include &lt;avr/io.h&gt; #include &lt;avr/interrupt.h&gt; ISR(INT0_vect) { DDRB = 0xFF; PORTB =...

Внешнее прерывание INT0. ATmega8
Я считаю что код правильный, но он не работает )))) Симуляция в Proteus показывает что прерывание...

внешнее прерывание INT0 ATtiny2313
Как изобразить прерывание в AtmelStdio7 ну хоть какое то хоть блин любое.... Сначала пробовал на...


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

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

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