EXTI0头文件:
#ifndef __EXTI_H
#define __EXTI_H
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "led.h"
void Exti0_Init(void);
#endif
EXTI0源文件:
#include "exti.h"
void Exti0_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
AFIO->EXTICR[0] = 0xF0;
EXTI->IMR &= ~(0x01<<0);
EXTI->EMR &= ~(0x01<<0);
EXTI->IMR |= 0x01<<0;
EXTI->RTSR &= ~(0x01<<0);
EXTI->FTSR &= ~(0x01<<0);
EXTI->RTSR |= (0x01<<0);
NVIC->IP[EXTI0_IRQn] = (0x01<<2 | 0x00<<0)<<0x04;
NVIC->ISER[0] = 0x01<<6;
}
void EXTI0_IRQHandler(void)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1)
{
Led0_Toggle();
Led1_Toggle();
}
EXTI->PR |= 0x01<<0;
}
LED头文件:
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
void LedInt(void);
void Led0_Toggle(void);
void Led1_Toggle(void);
#endif
LED源文件:
#include "led.h"
void LedInt(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
void Led0_Toggle(void)
{
uint8_t tmp;
tmp = GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8);
if(tmp == 1)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
}else
{
GPIO_SetBits(GPIOA,GPIO_Pin_8);
}
}
void Led1_Toggle(void)
{
uint8_t tmp;
tmp = GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2);
if(tmp == 1)
{
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}else
{
GPIO_SetBits(GPIOD,GPIO_Pin_2);
}
}
main.c文件:
#include "stm32f10x.h"
#include "led.h"
#include "exti.h"
void delay_ms(u16 time);
void delay_us(u16 time);
int main(void)
{
LedInt();
Exti0_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
while(1)
{
}
}
亲测可用,参考资料:STM32中文参考手册
|