历史上的今天
返回首页

历史上的今天

今天是:2025年01月17日(星期五)

正在发生

2019年01月17日 | STM32:STM32学习记录5: 外部中断

2019-01-17 来源:eefocus

配置流程:


1:系统时钟初始化,包括系统时钟和要开放的IO口或者功能的时钟配置。


2:IO口初始化,包括引脚,速率,输入输出模式等。


3:NVIC 中断向量配置 ,中断向量基地址和优先级的配置。


4:EXTI 中断/事件控制器,使能或失能外部线路,使能的模式(事件请求和中断请求),边沿触发模式,状态等。


说明:


1:主函数写在main.c中,中断函数写在stm32f10x_it.c 中,找到相应的中断函数(一般都是空白),加入自己的中断代码即可。


2:中断函数名在startup_stm32f10x_xx.s中查阅


3:清除 EXT13 线路的挂起位  注意此处一定要清除!!!!!!!!在EXTI_PR寄存器中


3:NVIC一般配置流程:(需要中断就要配置)


void NVIC_Configuare(void)

{

    NVIC_InitTypeDef   NVIC_InitStructure;

    NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//设定中断向量表基址0x08000000

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 先占优先级0位  从优先级4位


    //使能KEY0,KEY1中断

    NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//外部中断线15-10中断  由于两个按键是PA13 PA15由外部中断IO映射得知

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x0F;    //先占优先级0位,从优先级4位

    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x0F;         //

    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

    NVIC_Init(&NVIC_InitStructure);

}

4:EXIT中断、事件控制器配置流程

//    EXTI_InitTypeDef  EXTI_InitStructure;

//    EXTI_InitStructure.EXTI_Line=EXTI_Line0;//外部中断线 0 

//    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求 

//    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//设置输入线路上升沿为中断请求 

//    EXTI_InitStructure.EXTI_LineCmd=ENABLE;

//    EXTI_Init(&EXTI_InitStructure);





main.c文件为:

#include"stm32f10x.h"

 

#define LED0_ON  GPIO_SetBits(GPIOA,GPIO_Pin_8)    // LED0开

#define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0关

#define LED1_ON  GPIO_SetBits(GPIOD,GPIO_Pin_2)     //LED1开

#define LED1_OFF GPIO_ResetBits(GPIOD,GPIO_Pin_2)//LED1关

 

//初始化IO端口

void IO_Configuart(void)   

{

    GPIO_InitTypeDef GPIO_InitStructure;//定义 GPIO_InitStructure为    GPIO_InitTypeDef结构体类型

 

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//引脚选择

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出

    GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化

 

    //配置GPIOD_2

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//引脚选择

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出

    GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化

 

    //配置GPIOA_13     KEY0

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;//引脚选择

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU ;//上拉输入     由于按键按下为低电平

    GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化

//    //配置GPIOA_15     KEY1

//    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//引脚选择

//    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率

//    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入  由于按键按下为低电平

//    GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化

//    //配置GPIOA_0     WK_UP

//    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;//引脚选择

//    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50MHz速率

//    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//下拉输入  由于按键按下为高电平

//    GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化

 

//    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

//    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允许总线CLOCK,在使用GPIO之前必须允许相应的端口时钟

}

 

//复位和系统时钟控制

void RCC_Configuare(void)

{

    SystemInit();//频率设定有system_stm32f10x.c文件中的宏定义 开放某个宏 当调用SystemInit()时即可设置好频率

    RCC_ClockSecuritySystemCmd(ENABLE);//使能或者失能时钟安全系统

 

    //使能GPIOA,GPIOD端口时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//允许总线CLOCK,在使用GPIO之前必须允许相应的端口时钟

    /*    也可以写为RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);   更加简洁*/

}

//NVIC设置

void NVIC_Configuare(void)

{

    NVIC_InitTypeDef   NVIC_InitStructure;

    NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);//设定中断向量表基址0x08000000

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 先占优先级0位  从优先级4位

 

    //使能KEY0,KEY1中断

    NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//外部中断线15-10中断  由于两个按键是PA13 PA15由外部中断IO映射得知

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x0F;    //先占优先级0位,从优先级4位

    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x0F;         //

    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

    NVIC_Init(&NVIC_InitStructure);

//    //使能WK_UP中断

//    NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//外部中断线0中断  WK_UP按键 接PA0

//    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;    //先占优先级0位,从优先级4位

//    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;         //

//    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

//    NVIC_Init(&NVIC_InitStructure);

}

 

void Delay(u16 speed)

{

    u16 i=0;

    while(speed!=0)

    {

        speed--;

        for(i=0;i<400;i++);

    }

}

int main(void)

{

    EXTI_InitTypeDef  EXTI_InitStructure;

//    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);    //JTAG-DP 失能 + SW-DP使能

//    GPIO_AFIODeInit(); //将复用功能(重映射事件控制和 EXTI 设置)重设为缺省值 

//    GPIO_DeInit(GPIOA);

//    GPIO_DeInit(GPIOD); 

                                                                        

    RCC_Configuare();

    IO_Configuart();

    NVIC_Configuare();

    LED1_OFF;

//    EXTI_InitStructure.EXTI_Line=EXTI_Line0;//外部中断线 0 

//    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求 

//    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;//设置输入线路上升沿为中断请求 

//    EXTI_InitStructure.EXTI_LineCmd=ENABLE;

//    EXTI_Init(&EXTI_InitStructure);

    EXTI_InitStructure.EXTI_Line=EXTI_Line13;//外部中断线 13 

    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求 

    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling ;//设置输入线路下降沿为中断请求 

    EXTI_InitStructure.EXTI_LineCmd=ENABLE;

    EXTI_Init(&EXTI_InitStructure);

//    EXTI_InitStructure.EXTI_Line=EXTI_Line15;//外部中断线 15 

//    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //设置 EXTI 线路为中断请求 

//    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling ;//设置输入线路下降沿为中断请求 

//    EXTI_InitStructure.EXTI_LineCmd=ENABLE;

//    EXTI_Init(&EXTI_InitStructure);

    while(1)

    {

        LED0_ON;

//        LED1_OFF;

        Delay(2000);

        LED0_OFF;

//        LED1_ON;

        Delay(2000);

    }

}

// void EXTI15_10_IRQHandler(void)

//{

//    if(EXTI_GetITStatus(EXTI_Line13)!=RESET)  //按键1按下

//    {

//        LED0_ON;

//    }

//    else

//    {

//        LED0_OFF;

//    }

//    if(EXTI_GetITStatus(EXTI_Line15)!=RESET)  //按键2按下

//    {

//        LED1_ON;

//    }

//    else

//    {

//        LED1_OFF;

//    }

//

//

//     

//    EXTI_ClearITPendingBit(EXTI_Line13);//待清除 EXT13 线路的挂起位

//    EXTI_ClearITPendingBit(EXTI_Line15);

//}

//

//void EXTI0_IRQHandler(void)

//{

//    if(EXTI_GetITStatus(EXTI_Line15)!=RESET)  //按键WK_UP按下

//    {

//        LED1_ON;

//        LED0_ON;

//    }

//    else

//    {

//        LED1_OFF;

//        LED0_OFF;

//    }

//    EXTI_ClearITPendingBit(EXTI_Line0);    //待清除 EXTI 线路的挂起位

//}

stm32f10x_it.c 文件为:

/**

  ******************************************************************************

  * @file    GPIO/IOToggle/stm32f10x_it.c 

  * @author  MCD Application Team

  * @version V3.4.0

  * @date    10/15/2010

  * @brief   Main Interrupt Service Routines.

  *          This file provides template for all exceptions handler and peripherals

  *          interrupt service routine.

  ******************************************************************************

  * @copy

  *

  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS

  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE

  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY

  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING

  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE

  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.

  *

  *

© COPYRIGHT 2010 STMicroelectronics

  */

 

/* Includes ------------------------------------------------------------------*/

#include "stm32f10x_it.h"

#define LED0_ON  GPIO_SetBits(GPIOA,GPIO_Pin_8)    // LED0开

#define LED0_OFF GPIO_ResetBits(GPIOA,GPIO_Pin_8)//LED0关

#define LED1_ON  GPIO_SetBits(GPIOD,GPIO_Pin_2)     //LED1开

#define LED1_OFF GPIO_ResetBits(GPIOD,GPIO_Pin_2)//LED1关

 

/** @addtogroup STM32F10x_StdPeriph_Examples

  * @{

  */

 

/** @addtogroup GPIO_IOToggle

  * @{

  */

 

/* Private typedef -----------------------------------------------------------*/

/* Private define ------------------------------------------------------------*/

/* Private macro -------------------------------------------------------------*/

/* Private variables ---------------------------------------------------------*/

/* Private function prototypes -----------------------------------------------*/

/* Private functions ---------------------------------------------------------*/

 

/******************************************************************************/

/*            Cortex-M3 Processor Exceptions Handlers                         */

/******************************************************************************/

 

/**

  * @brief  This function handles NMI exception.

  * @param  None

  * @retval None

  */

void NMI_Handler(void)

{

}

 

/**

  * @brief  This function handles Hard Fault exception.

  * @param  None

  * @retval None

  */

void HardFault_Handler(void)

{

  /* Go to infinite loop when Hard Fault exception occurs */

  while (1)

  {

  }

}

 

/**

  * @brief  This function handles Memory Manage exception.

  * @param  None

  * @retval None

  */

void MemManage_Handler(void)

{

  /* Go to infinite loop when Memory Manage exception occurs */

  while (1)

  {

  }

}

 

/**

  * @brief  This function handles Bus Fault exception.

  * @param  None

  * @retval None

  */

void BusFault_Handler(void)

{

  /* Go to infinite loop when Bus Fault exception occurs */

  while (1)

  {

  }

}

 

/**

  * @brief  This function handles Usage Fault exception.

  * @param  None

  * @retval None

  */

void UsageFault_Handler(void)

{

  /* Go to infinite loop when Usage Fault exception occurs */

  while (1)

  {

  }

}

 

/**

  * @brief  This function handles SVCall exception.

  * @param  None

  * @retval None

  */

void SVC_Handler(void)

{

}

 

/**

  * @brief  This function handles Debug Monitor exception.

  * @param  None

  * @retval None

  */

void DebugMon_Handler(void)

{

}

 

/**

  * @brief  This function handles PendSV_Handler exception.

  * @param  None

  * @retval None

  */

void PendSV_Handler(void)

{

}

 

/**

  * @brief  This function handles SysTick Handler.

  * @param  None

  * @retval None

  */

void SysTick_Handler(void)

{

}

 

/******************************************************************************/

/*                 STM32F10x Peripherals Interrupt Handlers                   */

/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */

/*  available peripheral interrupt handler's name please refer to the startup */

/*  file (startup_stm32f10x_xx.s).                                            */

/******************************************************************************/

 

//中断处理函数

void EXTI15_10_IRQHandler(void)

{

    if(EXTI_GetITStatus(EXTI_Line13)!=RESET)  //按键0按下

    {

        LED1_ON;

    }

    else

    {

        LED1_OFF;

    }

//    if(EXTI_GetITStatus(EXTI_Line15)!=RESET)  //按键1按下

//    {

//        LED1_ON;

//    }

//    else

//    {

//        LED1_OFF;

//    }

 

 

     

    EXTI_ClearITPendingBit(EXTI_Line13);//待清除 EXT13 线路的挂起位  注意此处一定要清除

//    EXTI_ClearITPendingBit(EXTI_Line15);

}

 

//void EXTI0_IRQHandler(void)

//{

//    if(EXTI_GetITStatus(EXTI_Line15)!=RESET)  //按键WK_UP按下

//    {

//        LED1_ON;

//        LED0_ON;

//    }

//    else

//    {

//        LED1_OFF;

//        LED0_OFF;

//    }

//    EXTI_ClearITPendingBit(EXTI_Line0);    //待清除 EXTI 线路的挂起位

//}

/**

  * @brief  This function handles PPP interrupt request.

  * @param  None

  * @retval None

  */

 

/*void PPP_IRQHandler(void)

{

}*/

 

/**

  * @}

  */

 

/**

  * @}

  */

 

/******************* (C) COPYRIGHT 2010 STMicroelectronics *****END OF FILE****/


推荐阅读

史海拾趣

Fastron公司的发展小趣事

Fastron公司一直将技术创新作为企业发展的核心动力。自创立以来,公司不断投入研发资源,致力于电感器技术的创新。Fastron生产的符合RoHS标准的高质量电感器和线圈,如AEC-Q200级产品,得到了市场的广泛认可。这些产品不仅具有高性能和长寿命,还能满足客户多样化的需求。

Baton Lock公司的发展小趣事

近年来,电子行业经历了多次技术变革和市场调整。面对这些变化,Baton Lock公司积极调整战略,加大了对新兴技术如物联网、人工智能等领域的研发投入。同时,公司还通过优化生产流程、降低成本等方式提高竞争力,成功应对了行业变革带来的挑战。

ACE [ACE Technology Co., Ltd.]公司的发展小趣事

在快速发展的过程中,Baton Lock意识到产品质量是公司生存和发展的关键。因此,公司投入大量资源加强品质管理,从原材料采购到生产流程控制,再到产品检测,都实施了严格的标准和程序。这一举措有效提升了产品的稳定性和可靠性,赢得了客户的信任。

Crowd Supply公司的发展小趣事

为了适应电子行业的快速发展和变化,Crowd Supply不断投入资源进行技术创新和平台升级。他们推出了一系列新功能,如智能推荐、数据分析等,以帮助项目方更好地了解市场需求和支持者偏好。同时,平台也加强了与供应链和生产商的合作,确保项目的顺利推进和产品的高质量交付。

昭华(CHA)公司的发展小趣事

为了满足市场的不断增长的需求,昭华公司在2016年成立了昭华智硕东莞工厂。这座工厂拥有先进的生产设备和完善的生产流程,能够大幅提高公司的生产效率和产品质量。同时,昭华公司还不断优化供应链管理,加强与供应商的合作,确保原材料的稳定供应。这些举措不仅提高了公司的产能,还降低了生产成本,增强了公司的市场竞争力。

Armel Electronics Inc公司的发展小趣事

随着公司产品的不断升级和市场的逐步扩大,Armel Electronics Inc公司开始寻求更广阔的市场空间。公司积极与国内外知名企业展开合作,共同开发新产品,开拓新市场。通过国际合作,Armel不仅提升了自身的技术水平,还进一步扩大了市场份额,实现了公司的快速发展。

问答坊 | AI 解惑

基于EL7558BC的DC/DC变换器的设计与实现

基于EL7558BC的DC/DC变换器的设计与实现   摘要:对HSOP封装的EL7558BC降压型开关整流器芯片的使用特点进行了分析,给出了利用该整流器芯片设计DC/DC变换器的外围电路和设计方法。并通过实验验证了该设计方法。 关键词:DC/DC变换器;EL7 ...…

查看全部问答>

有人用SV做过设计吗?

SV做验证不必说了,但据说将来SV也可以做设计,而且是趋势。现在有用SV做设计的吗,如果有,其流程是什么?用什么工具综合和布局布线?目前据我所知,两大主流FPGA供应商xilinx和altera的开发工具还不支持SV做设计。…

查看全部问答>

Dshow 播放mp3的问题

   hr |= m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl);    hr |= m_pGraph->QueryInterface(IID_IMediaEvent, (void **)&m_pIMediaEvent);    hr |= m_pGraph->QueryInterface(IID_ ...…

查看全部问答>

EVC开发GPRS短信收发程序

请问谁有EVC开发的GPRS短信收发程序?能传一个给我吗?谢谢!E-mail: wusthanbo1983@163.com…

查看全部问答>

求助:怎么取得目录占用的空间大小

各位大虾,请教:怎么获取一个目录占用的空间的大小(即目录中所有文件占用空间的和)?…

查看全部问答>

stm8s-discovery外部中断问题

、、开发环境iar;st_link;stm8sdiscovery系统版;无法进入中断;大家帮忙看看啊。以下是全部代码,stm8_conf.h里面的_EXTI已经配置了。 #include "stm8s.h" #include "stm8s_type.h" #include "stm8s_conf.h" #include "s ...…

查看全部问答>

AVR T0中断分析

#pragma interrupt_handler TimeCountr0_Interrupt:20                    void TimeCountr0_Interrupt(void){//中断程序 ...…

查看全部问答>

Si4432带宽问题

刚接触si4432,用该芯片传输语音,在我设置Fd=45K,Rb=5.6Kbps的时候,频谱仪上看到的带宽是95K左右,通信正常。但当我把设置改成Fd=5.6K的时候,频谱仪上看到的带宽还是那么多,接收端也收不到信号了,是怎么回事呢,这个带宽怎么设置就变窄了,有 ...…

查看全部问答>

求助:IAR for MSP430堆栈设置求指教....

MSP430 链接时出现附图所示错误,说CSTACK尺寸太大,改小后问题解决。只是我担心改小后有其它问题,故请教是否有其它更好的办法?导致该问题的原因是什么?有会的网友请帮忙指教一下,谢谢! StackSet…

查看全部问答>

抢楼

来抢楼了,哈哈 …

查看全部问答>