代码看了几遍好像也没错。。我是在RAM中调试的。
IO口配置:
[mw_shl_code=c,true]void AFIO_Configuration_EXTI ()//外部中断引脚配置 IO复用,开外部中断要开复用
{
GPIO_InitTypeDef GPIO_initstructure;
GPIO_initstructure.GPIO_Pin = GPIO_Pin_0; //选择Px.0引脚为外部中断
GPIO_initstructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度 50Mhz
GPIO_initstructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入 根据外部电路,这里的外部中断需要用到上拉
GPIO_Init(GPIOB,&GPIO_initstructure);//初始化结构体 让GPIOB初始化
GPIO_initstructure.GPIO_Pin = GPIO_Pin_12; //板载led 这里用来测试中断程序
GPIO_initstructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度 50Mhz
GPIO_initstructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(GPIOB,&GPIO_initstructure);//初始化结构体
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);//GIPO引脚中断线路选择
}[/mw_shl_code]
外部中断配置:
[mw_shl_code=c,true]void EXTI_Configuration ()//外部中断配置
{
EXTI_InitTypeDef EXTI_initstructure;
EXTI_DeInit();//先重置为缺省
EXTI_initstructure.EXTI_Line = EXTI_Line0;//中断线0
EXTI_initstructure.EXTI_Mode = EXTI_Mode_Interrupt;//用到的是中断模式
EXTI_initstructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
EXTI_initstructure.EXTI_LineCmd = ENABLE;//打开中断
EXTI_Init(&EXTI_initstructure);//初始化外部中断控制器
EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志位
}[/mw_shl_code]
NVIC配置:
[mw_shl_code=c,true]void NVIC_Configuration ()//NVIC配置
{
NVIC_InitTypeDef NVIC_initsturcture;
#ifdef VECT_TAB_RAM //把中断向量放进RAM中 在RAM中debug要有这几句
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0000000);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//选择第0组优先级组
NVIC_initsturcture.NVIC_IRQChannel = EXTI0_IRQn;//外部中断线0中断
NVIC_initsturcture.NVIC_IRQChannelPreemptionPriority = 0;//抢占式(主)优先级 最高
NVIC_initsturcture.NVIC_IRQChannelSubPriority = 0;//响应(从)优先级 最高
NVIC_initsturcture.NVIC_IRQChannelCmd = ENABLE;//打开NVIC
NVIC_Init(&NVIC_initsturcture);//初始化NVIC
}[/mw_shl_code]
时钟初始化和主函数:
[mw_shl_code=c,true]int main (void)
{
RCC_Configuration ();//配置好时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);//设置GPIOA GPIOB 复用功能 使能外设时钟
EXTI_init();//外部中断初始化 相关配置函数都丢这里了
GPIO_Configuration_CH595 ();//配置好GPIO CH595用到的引脚
while(1)
{
GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET);//板载led 亮
anime ();
EXTI_GenerateSWInterrupt(EXTI_Line0);//软件产生中断
}
}[/mw_shl_code]
中断函数:
[mw_shl_code=c,true]void EXTI0_IRQHandler(void)//外部中断0 入口函数
{
GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_SET);//led灭
delay_ms(2000);
EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志
}[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>