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 ạ !