OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2347|回复: 1

f103没法进入外部中断啊。。

[复制链接]

21

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2017-7-19
在线时间
89 小时
发表于 2017-8-20 14:48:41 | 显示全部楼层 |阅读模式
1金钱
代码看了几遍好像也没错。。我是在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]

最佳答案

查看完整内容[请看2#楼]

还是要靠自己啊。原来是Debug里的Reset没设置对。RAM中调试要选择SYSRESETREQ或者VECTRESET,其他两个不能进入中断的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2017-7-19
在线时间
89 小时
 楼主| 发表于 2017-8-20 14:48:42 | 显示全部楼层
还是要靠自己啊。原来是Debug里的Reset没设置对。RAM中调试要选择SYSRESETREQ或者VECTRESET,其他两个不能进入中断的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 18:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表