STM32中使用IO口作为中断源遇到的问题

2019-07-14 15:09发布

程序中目的:通过设置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后,进入中断服务函数
        }
}        
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
leopard530
2019-07-15 11:27
STM32的外部中断受EXTI(中断与事件管理器)的管理。有两种方法可以做到软件触发中断。
1.使用NVIC的中断挂起功能,被挂起的中断在不被高优先级中断打断的情况下会立即被执行。
   具体方法查阅内核编程手册,NVIC->ISPR寄存器。在CMSIS库里也有相应的库函数。
2.EXTI自带软件触发功能,写一个寄存器就能做到软件触发外部中断。
   具体方法查阅芯片的编程手册,EXTI->SWIER寄存器。

另:寄存器是个好东西,学的时候不能太过于依赖库函数。

一周热门 更多>