#include "stm32f10x.h"
#define LED1 1
void Delay_ms( uint16_t time_ms );
void LEDXToggle(uint8_t ledx);
#define LED1 1
void Delay_ms( uint16_t time_ms );
void LEDXToggle(uint8_t ledx);
int main()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13;//?????GPIO??
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);//?????,???GPIO
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);//?????,???GPIO
GPIO_InitTypeDef GPIO_InitStructure1;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_14;//?????GPIO??
GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_IPU; //?????????????
GPIO_Init(GPIOB, &GPIO_InitStructure1); //?????,???GPIO
/*查看外部中断/事件线路映像
PA0、PB0、PC0、PD0、PE0、PF0、PG0 ————>映像于 EXTI0
PA1、PB1、PC1、PD1、PE1、PF1、PG1 ————>映像于 EXTI1
PA2、PB2、PC2、PD2、PE2、PF2、PG2 ————>映像于 EXTI2
PA3、PB3、PC3、PD3、PE3、PF3、PG3 ————>映像于 EXTI3
.......依次类推,每个外部中断都有一个事件线路映射*/
//定义一个EXTI_InitTypeDef 类型的结构体
EXTI_InitTypeDef EXTI_InitStructure;
//使能AFIO功能的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//设置PB14,PB15,PB5作为中断线路
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
//选择中断线路14,15,5
EXTI_InitStructure.EXTI_Line = EXTI_Line14 ;
//设置为中断请求触发模式
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
//设置为下降沿触发
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
//设置为使能中断线
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
//调用库函数,初始化中断
EXTI_Init(&EXTI_InitStructure);
NVIC_InitTypeDef NVIC_InitStructure; //定义一个NVIC_InitTypeDef 类型的结构体
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //选择中断分组0
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//配置选中的中断向量,指定中断源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1; //配置抢占优先级:抢占式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //配置响应优先级:响应式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断向量
NVIC_Init(&NVIC_InitStructure); //初始化NVIC
}
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //选择中断分组0
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//配置选中的中断向量,指定中断源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1; //配置抢占优先级:抢占式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //配置响应优先级:响应式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断向量
NVIC_Init(&NVIC_InitStructure); //初始化NVIC
}
void EXTI15_10_IRQHandler(void)
{
/*检查指定的EXTI线路出发请求发生与否*/
if (EXTI_GetITStatus(EXTI_Line14) != RESET)
{
/*清除EXTI线路挂起位*/
EXTI_ClearITPendingBit(EXTI_Line14);
/*D1状态翻转*/
LEDXToggle(LED1);
}
}
void LEDXToggle(uint8_t ledx)
{
if(ledx==1)
{
GPIOC->ODR^=GPIO_Pin_13;
}
}
{
/*检查指定的EXTI线路出发请求发生与否*/
if (EXTI_GetITStatus(EXTI_Line14) != RESET)
{
/*清除EXTI线路挂起位*/
EXTI_ClearITPendingBit(EXTI_Line14);
/*D1状态翻转*/
LEDXToggle(LED1);
}
}
void LEDXToggle(uint8_t ledx)
{
if(ledx==1)
{
GPIOC->ODR^=GPIO_Pin_13;
}
}
void Delay_ms( uint16_t time_ms )
{
uint16_t i,j;
for( i=0;i<time_ms;i++ )
{
for( j=0;j<10309;j++ );//??1ms
}
}
{
uint16_t i,j;
for( i=0;i<time_ms;i++ )
{
for( j=0;j<10309;j++ );//??1ms
}
}