[控制电路] STM32中使用IO口作为中断源遇到的问题?

[复制链接]
154|7
 楼主 | 2018-2-1 15:03 | 显示全部楼层 |阅读模式
程序中目的:通过设置PA10作为中断源,当PA10上升沿时进入中断;
遇到的问题:    1.运行初始化中断配置程序后,我试图用程序直接将PA10置1来进入中断,然而此时不能将PA10置1 (但是放在初始化中断之前可以将PA10置1),故而不能进入中断?
    2.这种PA10作为中断源,然后使用软件置1。这种方法是否能实现,或者存在问题呢?



程序代码:(PA10的初始化前面已定义)
static void NVIC_Configuration(void)
{
       NVIC_InitTypeDef NVIC_InitStructure;
       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);           
       NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;   
       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  
       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;         
       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         
       NVIC_Init(&NVIC_InitStructure);                          
}

void EXTI_Key_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;      
        EXTI_InitTypeDef EXTI_InitStructure;           
        RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK,ENABLE);             
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);  

        NVIC_Configuration();
        GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;     
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;                
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;   
        GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure);   

        SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,KEY1_INT_EXTI_PINSOURCE);       
        EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;            
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                   
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;         
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                    
        EXTI_Init(&EXTI_InitStructure);
}

void xuantong(int w0, int w1,int w2,int w3,int w4, int z1)
{

  GPIO_SetBits(KEY1_INT_GPIO_PORT,KEY1_INT_GPIO_PIN);  //CSÐźÅÖÃ룬ADоƬ׼±¸¹¤×÷

        EXTI_Key_Config();     

        if(w0==1)
        {
                EN_enable( 11,w1 );        
                EN_enable( 12,w2 );           
                EN_enable( 21,w3 );        
                EN_enable( 22,w4 );      
                for(i1=0;i1<15;i1++)      
                {
                                road_enable(21,z2);     
                                road_enable(22,z2);   

                                 Key_port_HIGH();     //此处是将PA10置1的程序,试图将PA10软件置1后,进入中断服务函数
        }
}       
}


| 2018-2-2 08:57 | 显示全部楼层
GPIO输入寄存器为只读寄存器 输出不起作用

使用内部中断    为什么不用软中断,外部中断本身就是用来捕捉外部信号的
捕捉上升沿 确保你管脚初始状态为 低电平   
| 2018-2-2 10:27 | 显示全部楼层
应该是初始化为中断后,自动就变为输入IO了,所以无法置一操作了,我是猜测的。
 楼主 | 2018-2-2 10:51 | 显示全部楼层
xyz549040622 发表于 2018-2-2 10:27
应该是初始化为中断后,自动就变为输入IO了,所以无法置一操作了,我是猜测的。 ...

说的有道理额,应该是这样理解的。现在是将另一个IO口连接PA10,然后使能另一个IO口就可以实现功能了(有点投机取巧了
 楼主 | 2018-2-2 10:58 | 显示全部楼层
q491790850 发表于 2018-2-2 08:57
GPIO输入寄存器为只读寄存器 输出不起作用

使用内部中断    为什么不用软中断,外部中断本身就是用来捕捉 ...

应该就是像楼下说的原因吧。所以,无论初始状态是什么都不会发生电平跳变了。
1.使用硬件中断的方法是因为,开始只了解这种中断方法;
2. 您说的软件中断,能简单描述个例子吗,


谢谢啦
| 2018-2-2 11:01 | 显示全部楼层
STM32的外部中断受EXTI(中断与事件管理器)的管理。有两种方法可以做到软件触发中断。
1.使用NVIC的中断挂起功能,被挂起的中断在不被高优先级中断打断的情况下会立即被执行。
   具体方法查阅内核编程手册,NVIC->ISPR寄存器。在CMSIS库里也有相应的库函数。
2.EXTI自带软件触发功能,写一个寄存器就能做到软件触发外部中断。
   具体方法查阅芯片的编程手册,EXTI->SWIER寄存器。

另:寄存器是个好东西,学的时候不能太过于依赖库函数。
 楼主 | 2018-2-2 15:49 | 显示全部楼层
xiao_fang 发表于 2018-2-2 11:01
STM32的外部中断受EXTI(中断与事件管理器)的管理。有两种方法可以做到软件触发中断。
1.使用NVIC的中断挂起 ...

受教,用的时候真没有考虑到会过于依赖库函数,这会让我我无法清楚得认识各个模块的功能;
| 2018-2-3 17:08 | 显示全部楼层
学习了
扫描二维码,随时随地手机跟帖
*滑动验证:
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册 手机登录
高级模式
我要创建版块

论坛热帖

关闭

热门推荐上一条 /4 下一条

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