I tried to program an interrupt with S2 that is connected to PB1 on my stm32f103vet6 board, but I failed and I don't know why!
The codes here:
#include "stm32f10x.h" // Device header
#include "stm32f10x_exti.h" // Keil::Device:StdPeriph Drivers:EXTI
#include "misc.h" // Keil::Device:StdPeriph Drivers:Framework
#include "stm32f10x_gpio.h" // Keil::Device:StdPeriph Drivers:GPIO
#include "stm32f10x_rcc.h" // Keil::Device:StdPeriph Drivers:RCC
#define D2_ON GPIO_ResetBits(GPIOB, GPIO_Pin_13)
#define D2_OFF GPIO_SetBits(GPIOB, GPIO_Pin_13)
#define D3_ON GPIO_ResetBits(GPIOB, GPIO_Pin_14)
#define D3_OFF GPIO_SetBits(GPIOB, GPIO_Pin_14)
#define PB9_ON GPIO_ResetBits(GPIOB, GPIO_Pin_9)
#define PB9_OFF GPIO_SetBits(GPIOB, GPIO_Pin_9)
#define PB8_ON GPIO_ResetBits(GPIOB, GPIO_Pin_8)
#define PB8_OFF GPIO_SetBits(GPIOB, GPIO_Pin_8)
#define S2_DOWN GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0
#define S2_UP GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 1
#define S3_DOWN GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15) == 0
#define S3_UP GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15) == 1
void LED_Configure(void){
//only D2. D3, AND PB9, PB8
GPIO_InitTypeDef PB13;
GPIO_InitTypeDef PB14;
GPIO_InitTypeDef PB9;
GPIO_InitTypeDef PB8;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
PB13.GPIO_Pin = GPIO_Pin_13;
PB13.GPIO_Mode = GPIO_Mode_Out_PP;
PB13.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &PB13);
GPIO_SetBits(GPIOB, GPIO_Pin_13);
PB14.GPIO_Pin = GPIO_Pin_14;
PB14.GPIO_Mode = GPIO_Mode_Out_PP;
PB14.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &PB14);
GPIO_SetBits(GPIOB, GPIO_Pin_14);
PB9.GPIO_Pin = GPIO_Pin_9;
PB9.GPIO_Mode = GPIO_Mode_Out_PP;
PB9.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &PB9);
GPIO_SetBits(GPIOB, GPIO_Pin_9);
PB8.GPIO_Pin = GPIO_Pin_8;
PB8.GPIO_Mode = GPIO_Mode_Out_PP;
PB8.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &PB8);
GPIO_SetBits(GPIOB, GPIO_Pin_8);
}
//Microsecond delay
void delay_us(uint32_t delay_us){
volatile unsigned int num;
volatile unsigned int t;
for (num = 0; num < delay_us; num++)
{
t = 11;
while (t != 0)
{
t--;
}
}
}
//Millisecond delay
void delay_ms(uint16_t delay_ms){
volatile unsigned int num;
for (num = 0; num < delay_ms; num++)
{
delay_us(1000);
}
}
void sysRST(void){
__set_FAULTMASK(1);
NVIC_SystemReset();
}
void Configure_PB1(void){
GPIO_InitTypeDef PB1_GPIOInitStruct;
EXTI_InitTypeDef PB1_EXTIInitStruct;
NVIC_InitTypeDef PB1_NVICInitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
PB1_GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;
PB1_GPIOInitStruct.GPIO_Pin = GPIO_Pin_1;
PB1_GPIOInitStruct.GPIO_Speed = GPIO_Speed_50MHz;
PB1_EXTIInitStruct.EXTI_Line = EXTI_Line1;
PB1_EXTIInitStruct.EXTI_LineCmd = ENABLE;
PB1_EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
PB1_EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
PB1_NVICInitStruct.NVIC_IRQChannel = EXTI1_IRQn;
PB1_NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;
PB1_NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
PB1_NVICInitStruct.NVIC_IRQChannelSubPriority = 0x00;
GPIO_Init(GPIOB, &PB1_GPIOInitStruct);
EXTI_Init(&PB1_EXTIInitStruct);
NVIC_Init(&PB1_NVICInitStruct);
}
void EXTI1_IRQHandler(void){
if (EXTI_GetITStatus(EXTI_Line1) != RESET){
/*DO SOMETHING*/
/*Clear Interrupt Flag*/
EXTI_ClearITPendingBit(EXTI_Line1);
}
}
int main(){
SystemInit();
LED_Configure();
Configure_PB1();
EXTI1_IRQHandler();
while(1){
D2_OFF;
D3_OFF;
PB9_OFF;
PB8_OFF;
delay_ms(80);
D2_ON;
delay_ms(80);
D3_ON;
delay_ms(80);
PB9_ON;
delay_ms(80);
PB8_ON;
delay_ms(80);
}
}
Anyone could tell me what's wrong with my codes here? I think I just programmed according to those libraries and some pdf files, nothing wrong. Thank you very much!