void EXTI0_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable GPIOA clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// *(uint32_t *)(0x40021000+0x18)|=(1<<2); //gpioA 时钟使能
/* Enable AFIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// *(uint32_t *)(0x40021000+0x18)|=(1<<0);
/* Configure PA.00 pin as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// *(uint32_t *)(0x40010800+0x00)|=(8<<0);
// *(uint32_t *)(0x40010800+0x0c)|=(1<<0);
/* Connect EXTI0 Line to PA.00 pin */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
/* Configure EXTI0 line */
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Enable and set EXTI0 Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
中断头文件
#ifndef __EXTI_H__
#define __EXTI_H__
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_exti.h"
#include "misc.h"
void EXTI0_Config(void);
#endif
LED驱动.c
#include "led.h"
void LED_INIT()
{
// *(uint32_t *)(0x40021000+0x18)|=(1<<4); //gpioc 时钟使能
//GPIO端口时钟使能
RCC_APB2PeriphClockCmd(RCC_LED_POART, ENABLE);
//*(uint32_t *)(0x40011000+0x04)|=(3<<20); //pc13 端口配置高寄存器crh推挽输出50M
//GPIO端口初始化
GPIO_InitTypeDef LED_ON={LED_PIN,GPIO_Speed_50MHz,GPIO_Mode_Out_PP};
GPIO_Init(LED_POART, &LED_ON);
}
//LED状态切换
void LED_SWAP()
{
//GPIO_WriteBit(LED_POART,LED_PIN, Bit_RESET);
//GPIO_ResetBits(LED_POART,LED_PIN);
//GPIO_SetBits(LED_POART,LED_PIN);
if(GPIO_ReadInputDataBit(LED_POART,LED_PIN)==0)
{
GPIO_SetBits(LED_POART,LED_PIN);
}
else
{
GPIO_ResetBits(LED_POART,LED_PIN);
}
}
//LED灭
void LED_OFF()
{
//*(uint32_t *)(0x4001100c)|=(1<<13); //pc13 odr 置1
GPIO_SetBits(LED_POART,LED_PIN);
}
//LED亮
void LED_ON()
{
//*(uint32_t *)(0x40011000+0x0c)&=~(1<<13); //pc13 odr 置0
GPIO_ResetBits(LED_POART,LED_PIN);
}
//呼吸灯
void LED_Breathing()
{
uint16_t t;
for(t=1;t<1200;t++)
{
LED_ON();
delay_us(t);
LED_OFF();
delay_us(1200-t);
}
for(t=1;t<1200;t++)
{
LED_ON();
delay_us(1200-t);
LED_OFF();
delay_us(t);
}
}
led驱动.h
#ifndef __LED_H__
#define __LED_H__
#include "stm32f10x_gpio.h"
#include "delay.h"
#define LED_POART GPIOC //端口
#define RCC_LED_POART RCC_APB2Periph_GPIOC //端口时钟
#define LED_PIN GPIO_Pin_13 //pin脚
void LED_INIT();
void LED_SWAP(); //LED切换
void LED_ON(); //LED亮
void LED_OFF(); //LED灭
void LED_Breathing(); //lED呼吸灯
#endif //__LED_H__
主函数
int main()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//RCC->APB2ENR|=(1<<4);
EXTI0_Config();
LED_INIT();
//GPIOC->CRH|=(3<<20);
//GPIOC->ODR&=~(1<<13);
return 0;
}
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) == SET)
{
LED_SWAP();
// delay_ms(100);
EXTI_ClearITPendingBit(EXTI_Line0);
//EXTI_ClearFlag(EXTI_Line12);
}
}