安庆高速到合肥的大巴:STM32学习笔记---外部中断(EXTI8) (www.ourdev.cn)

来源:百度文库 编辑:偶看新闻 时间:2024/04/27 19:35:45
STM32学习笔记---外部中断(EXTI8) 回复数:6,点击数:311 【楼主位】 weif40423p
积分:45
派别:
等级:------
来自:
在使用EXTI的时候,因为没有开启时钟没有开启RCC_APB2Periph_AFIO时钟,让我调试吃了不少苦头,看来还要好好看看stm32的时钟啊
现在给出我的exti8的配置

首先一定要记得配置 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能AFIO时钟
GPIOB8作为中断脚,配置为浮空输入
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
      
    /* Configure PB8 as input floating */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    
}
继续配置NVIC
/**
  * @brief  Configures NVIC and Vector Table base location.
  * @param  None
  * @retval : None
  */
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);   
    
    /* Configure the NVIC Preemption Priority Bits*/  
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    /* Set the Vector Table base location at 0x08000000 */ 
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
}
然后配置EXTI ,把PB8连接到EXTI
/*******************************************************************************
* Function Name  : EXTI_Configuration
* Description    : 
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void EXTI_Configuration(void)
{
    EXTI_InitTypeDef EXTI_InitStructure;
    /*connect PB8 to EXTI*/
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource8);
    /*Config EXTI8*/
    EXTI_InitStructure.EXTI_Line = EXTI_Line8;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
    //EXTI_GenerateSWInterrupt(EXTI_Line8);
}
这样就可以中断了,
在中断函数里面记得清除标志位
/**
  * @brief  This function handles EXTI9_5 global interrupt request.
  * @param  None
  * @retval : None
  */
void EXTI9_5_IRQHandler(void)
{
     if(EXTI_GetITStatus(EXTI_Line8)!= RESET)
     {
        EXTI_ClearITPendingBit(EXTI_Line8);
     }
}
  2010-03-16,17:44:17 资料 邮件 回复 引用回复 编辑 删除 【1楼】 FPGARM
积分:89
派别:
等级:------
来自:广州
太巧了,今天晚上我就打算搞介个,谢谢LZ!   2010-03-16,18:15:29 资料 邮件 回复 引用回复 编辑 删除 【2楼】 linfeng286
积分:1086
派别:
等级:------
来自:
mark 一会试试   2010-03-16,18:51:59 资料 邮件 回复 引用回复 编辑 删除 【3楼】 Grant
积分:2116
派别:
等级:------
来自:
STM32也还,STM8也好,都是以时钟为驱动的,记得使用STM32的任何外设都要先操作RCC。


STM8默认外设时钟都是打开的,要省电就要记得关外设时钟。
  2010-03-16,20:51:11 资料 邮件 回复 引用回复 编辑 删除 【4楼】 ddljdd
积分:35
派别:
等级:------
来自:
不错,~~~   2010-03-17,11:30:15 资料 邮件 回复 引用回复 编辑 删除 【5楼】 rube 永丰庵
积分:1561
派别:
等级:------
来自:深圳
我试过了,这个很好用。
谢谢楼主
  2010-05-25,15:20:58 资料 邮件 回复 引用回复 编辑 删除