External interrupt for STM32 in Eclipse

Các bác cho em hỏi với ạ. Em sử dụng Eclipse và GNU_ARM để lập trình cho chip STM32F103T8C6. Em có viết chương trình ngắt ngoài bằng cách sử dụng nút bấm để đảo trạng thái cho led. Em sử dụng chân led là GPIOC Port 13 và chân button là GPIOB Port 13.
Đây là code của em ạ !

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

GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef	NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStruct;

void GPIO_Configuration (void);
void NVIC_Configuration(void);
void EXTI_Configuration(void);

void EXTI13_IRQHandler(void)
{
  GPIO_WriteBit(GPIOC,GPIO_Pin_13,(BitAction)(1^GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13)));
  EXTI_ClearFlag(EXTI_Line13);
}


int main()
{
  GPIO_Configuration();
  NVIC_Configuration();
  EXTI_Configuration();
  GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);
  while(1)
    {

    }
  return 1;
}
// Config GPIO and RCC
void GPIO_Configuration(void)
{
  // RCC Enable
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

  // Config GPIO
  GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Pin	    = GPIO_Pin_13;
  GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  // Config Button
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  // Cai dat ngat ngoai cho GPIO
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource13);
}

// Config NVIC
void NVIC_Configuration(void)
{
  // Configure the NVIC Preemption Priority: Group 4: 16 bit Preemption and 0 bit SubPriority
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  NVIC_EnableIRQ(EXTI15_10_IRQn);

  // Enable External EX0 Interrupt ( For PA0)
  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_Init(&NVIC_InitStructure);
}
void EXTI_Configuration(void)
{
  // RESET EXTI init Structure
  EXTI_StructInit(&EXTI_InitStruct);
  EXTI_InitStruct.EXTI_Line = EXTI_Line13;
  EXTI_InitStruct.EXTI_LineCmd = ENABLE;
  EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_Init(&EXTI_InitStruct);
}

Em chạy chương trình không bị lỗi. Nhưng khi ấn nút bấm thì nó nhảy sang file vector_stm32f10x.c và tạo breakpoint ở đấy. Em ấn tiếp tục thì ko xảy ra hiện tượng gì. Có ai biết cái này thì chỉ em với ạ. Em cảm ơn ạ!
Ảnh trên là lúc mới chạy, chưa ấn nút !
Ảnh dưới là ngay sau khi ấn nút ạ !

Code của bạn enable EXTI15_10_IRQn mà trong khi bạn lại code function của EXTI13_IRQHandler
Chương trình không tìm thấy hàm xử lý cho EXTI15_IRQHandler nên nó nhảy vào Default_Handler

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?