stm32不能进入外部中断程序
时间:10-02
整理:3721RD
点击:
配置代码看了几遍好像也没问题。
IO口配置:
外部中断控制器配置:
NVIC配置:
中断函数:
用了个软件中断都没法进入中断,不知哪里的问题
补充内容 (2017-8-17 18:58):
NVIC的代码漏了一些:
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
}
IO口配置:
- 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);//GPIOB初始化
-
-
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);//GIPO引脚中断线路选择
- }
外部中断控制器配置:
- 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);//清除中断标志位
- }
NVIC配置:
- 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组优先级组
- int main (void)
- {
- RCC_Configuration ();//配置好时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);//设置GPIOA GPIOB 复用功能 使能外设时钟
-
- GPIO_Configuration_CH595 ();//配置好GPIO CH595用到的引脚
- EXTI_init();//外部中断初始化 EXTI相关配置都丟这个函数里了
- while(1)
- {
- GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET);//板载led亮
- anime ();
- EXTI_GenerateSWInterrupt(EXTI_Line0);//用软件产生中断测试
- }
- }
中断函数:
- void EXTI0_IRQHandler(void)//外部中断0 入口函数
- {
- GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_SET);//板载led灭
- delay_ms(2000);
- EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志
- }
用了个软件中断都没法进入中断,不知哪里的问题
补充内容 (2017-8-17 18:58):
NVIC的代码漏了一些:
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
}
还是要靠自己啊。原来是Debug里的Reset没设置对。RAM中调试要选择SYSRESETREQ或者VECTRESET,其他两个不能进入中断的。
原来是仿真的的Reset设置错了,怪不得中断进步了