2016-11-22 11 views
1

У меня проблема с моим микроконтроллером STM32F103C8T6. Я использую (как упражнение) внешние прерывания для включения/выключения светодиода, путем нажатия внешнего переключателя, который, в свою очередь, подключен к ПК13. Я использую библиотеку StdPeriph.Внешнее прерывание STM32 отвечает только в режиме отладки

Когда микросхема запрограммирована, ничего не происходит. Напротив, когда я использую отладчик (отладка в Coocox), чип работает нормально. Я не могу понять, где проблема.

Вы можете мне помочь? Вот мой код.

#include<stm32f10x.h> 
#include<stm32f10x_rcc.h> 
#include<stm32f10x_gpio.h> 

#include<stm32f10x_exti.h> 
#include<misc.h> 

typedef enum{ 
    on, 
    off 
}state; 
state led=on; 

int main(void){ 

    // enable clocks 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 

    // uncomment to disable/remap JTAG pins 
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE); 
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); 

    // configure PC13 as input 
    GPIO_InitTypeDef GPIO_InitStructure; 
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13; 
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; 
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; 
    GPIO_Init(GPIOC,&GPIO_InitStructure); 

    // configure PB8 as led output 
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; 
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz; 
    GPIO_Init(GPIOB,&GPIO_InitStructure); 

    // connect PC13 to EXTI controller 
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13); 

    // enable and configure EXTI controller 
    EXTI_InitTypeDef EXTI_InitStructure; 
    EXTI_InitStructure.EXTI_Line=EXTI_Line13; 
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; 
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; 
    EXTI_InitStructure.EXTI_LineCmd=ENABLE; 
    EXTI_Init(&EXTI_InitStructure); 

    // enable IRQ 
    NVIC_EnableIRQ(EXTI15_10_IRQn); 
    NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2); 

    // Configure NVIC 
    NVIC_InitTypeDef NVIC_InitStructure; 
    NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn; 
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; 
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=2; 
    NVIC_Init(&NVIC_InitStructure); 

    // switch on led 
    GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_SET); 

    while(1); 

    return 0; 
} 

void EXTI15_10_IRQHandler(void){ 

    // clear pending bit 
    if(EXTI_GetITStatus(EXTI_Line13)!=RESET){ 
     EXTI_ClearITPendingBit(EXTI_Line13); 
    } 

    if(led==off){ 
     GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_SET); 
     led=on; 
    }else{ 
     GPIO_WriteBit(GPIOB,GPIO_Pin_8,Bit_RESET); 
     led=off; 
    } 
} 

#ifdef USE_FULL_ASSERT 
void assert_failed(uint8_t * file,uint32_t line){ 
    /* Infinite loop */ 
    while (1); 
} 
#endif 
+0

Работа при отладке часто означает неинициализированные переменные. –

+0

Спасибо, Jean-François Fabre за ваш ответ. Я думаю, что все инициализировано. – jojosthegreat

+0

Сбрасывается ли после программирования? Где находится код? Flash или RAM? Есть ли точка останова где-то? –

ответ

0

У меня нет знаний об упомянутом контроллере, но я работал над контроллерами серии STM32L4. В STM32L4 кнопка подключается к выходу PC13. При нажатии кнопки я заметил gpio debouncing. В вашей EXTI15_10_IRQHandler() реализует логику debouncing. Убедитесь, что прерывание достигает этой функции только один раз для нажатия кнопки. Может быть, отладчик замедляет работу процессора (процессор работает на более низкой частоте по сравнению со свободным прогоном), и вы получаете прерывания должным образом.

+0

Это очень плохая идея использовать внешние прерывания для кнопок или клавиш. Это должно быть сделано в прерывании таймера. –

1

У меня была эта проблема. Я использую STM32F030. Проблема для меня заключалась не в том, что часы SYSCFG включены, это бит 0 регистра RCC APB2ENR. Я предполагаю, что этот параметр включен в отладке, чтобы программное обеспечение могло отлаживать? В противном случае часы отключены!

Я, наконец, нашел это, посмотрев справочное руководство STM32F1, которое немного более полно.

0

Как правило, очень плохо использовать внешние прерывания для кнопок и клавиш. Вместо этого вы должны использовать прерывание таймера.

Вы можете увидеть простую реализацию ключа в прерывании таймера (нажмите, двойной щелчок, Длинное нажатие события поддерживается) здесь: https://www.diymat.co.uk/arm-three-function-click-double-and-long-click-button-library-timer-interrupt-driven/

-1

Используете ли вы иную сборку конфигурацию для отладки? Если да, попробуйте сделать переменную ledvolatile и посмотреть, помогает ли она. Если нет: добавьте некоторый цикл задержки, то есть voliatile unsigned i; for (i=0; i < 50000u; ++i); после очистки бит EXTI в ISR. Обычно это плохой метод использования блокирующих задержек в службе прерывания (если это когда-либо хорошая практика ...), но может быть полезно выяснить, не связано ли это с дебунсингом. Если это помогает, то наиболее вероятной проблемой является отключение коммутатора.

EDIT: рассмотрите возможность использования битового диапазона (если возможно) для доступа к выходному порту, тогда вы можете сделать так, как bind_band_led_port ^= 1;, но это только побочная заметка.

+0

bitbandind нет в современных ядрах - например, M7. Задержки в ISR - это просто неправильно и ужасно советуют. Не используйте внешние прерывания для подпрыгивающих вещей, таких как кнопки. –

+0

PeterJ_01 как вы могли видеть в моем ответе, я знаю, что на самом деле это плохая идея. Но в диагностических целях это может быть сделано, а затем удалено, когда проблема будет подтверждена. То есть это неправильная практика, но вполне понятная и предсказуемая. Но в целом я согласен, внешние прерывания не должны использоваться для клавиатуры, если debouncing не обрабатывается аппаратными средствами (иногда это так) – alagner

 Смежные вопросы

  • Нет связанных вопросов^_^