原创 STM32 例程 外部中断程序 (外部中断应用)

2010-5-25 10:29 14312 8 10 分类: MCU/ 嵌入式

 


 


可以到"单片研习-STM32"下载该工程,链接:http://group.ednchina.com/2415/


例程名:【助学例程2】stm32外部中断例程


 


/********************************************************************
                            单片研习
        http://group.ednchina.com/2415
*********************************************************************
例程名称:外部中断实验
作    者:阿勇(jshmlly)
实验硬件:DP-miniSTM32
硬件连接:指示灯连接  PA1
          按钮连接    PA3
功能描述:本例程实现外部中断的输入试验,按下按钮,指示灯闪烁一下
         
********************************************************************/


#include <stm32f10x_lib.h>    // STM32F10x Library Definitions
#include "STM32_Init.h"       // STM32 Initialization
  



/**********************************************************************
* 名    称:Delay()
* 功    能:延时
* 入口参数:cnt
* 出口参数:
-----------------------------------------------------------------------
* 说明:
***********************************************************************/
void Delay(vu16 cnt) {
uint16 i,j;
for (i=0;i<cnt;i++)
{ for (j=0;j<1000;j++)
  { }
 }
}



/**********************************************************************
* 名    称:RCC_Configuration()
* 功    能:配置时钟
* 入口参数:
* 出口参数:
-----------------------------------------------------------------------
* 说明:使用库函数
***********************************************************************/
void RCC_Configuration(void)
{
    ErrorStatus HSEStartUpStatus;


    //使能外部晶振
    RCC_HSEConfig(RCC_HSE_ON);
    //等待外部晶振稳定
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    //如果外部晶振启动成功,则进行下一步操作
    if(HSEStartUpStatus==SUCCESS)
    {
        //设置HCLK(AHB时钟)=SYSCLK
        RCC_HCLKConfig(RCC_SYSCLK_Div1);


        //PCLK1(APB1) = HCLK/2
        RCC_PCLK1Config(RCC_HCLK_Div2);


        //PCLK2(APB2) = HCLK
        RCC_PCLK2Config(RCC_HCLK_Div1);
       
 
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);
        //启动PLL
        RCC_PLLCmd(ENABLE);
        //等待PLL稳定
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
        //系统时钟SYSCLK来自PLL输出
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        //切换时钟后等待系统时钟稳定
        while(RCC_GetSYSCLKSource()!=0x08); 
     }
   /* RCC system reset(for debug purpose) */


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO , ENABLE); //给GPIOA和重映射提供时钟,注意:一定要设置RCC_APB2Periph_AFIO


}



/**********************************************************************
* 名    称:GPIO_Configuration()
* 功    能:配置输入输出
* 入口参数:
* 出口参数:
-----------------------------------------------------------------------
* 说明:使用库函数,配置IO口
***********************************************************************/
 void GPIO_Configuration(void)
 {


  GPIO_InitTypeDef  GPIO_InitStructure;
  /*设置PA3为输入*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
  /*设置PA1为输出*/
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);


 }


/**********************************************************************
* 名    称:EXTI_Configuration()
* 功    能:
* 入口参数:
* 出口参数:
-----------------------------------------------------------------------
* 说明:
***********************************************************************/
void EXTI_Configuration(void)
{
  EXTI_InitTypeDef  EXTI_InitStructure;



  /* Configure EXTI Line3 to generate an interrupt on falling edge */ 
  EXTI_InitStructure.EXTI_Line = EXTI_Line3;                   //外部中断通道3
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;    //下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;        //使能
  EXTI_Init(&EXTI_InitStructure);
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);  //将PA3连接到外部中断通道3
}


/**********************************************************************
* 名    称:NVIC_Configuration()
* 功    能:
* 入口参数:
* 出口参数:
-----------------------------------------------------------------------
* 说明:
***********************************************************************/
 void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure; 


#ifdef  VECT_TAB_RAM 
  /* Set the Vector Table base location at 0x20000000 */
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  
#endif
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);           //抢占式优先级别设置为无抢占优先级



  NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQChannel;    //指定中断源
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;        //指定响应优先级别1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //使能外部中断通道3
  NVIC_Init(&NVIC_InitStructure);
}
/**********************************************************************
* 名    称:main()
* 功    能:主函数
* 入口参数:
* 出口参数:
-----------------------------------------------------------------------
* 说明:
***********************************************************************/
int main (void)
{


 RCC_Configuration();  //配置时钟                     
 GPIO_Configuration(); //配置IO口
 NVIC_Configuration(); //中断配置
 EXTI_Configuration(); //外部中断配置
 while(1)
 {


  }
 }


 /**********************************************************************
* 名    称:EXTI3_IRQHandler()
* 功    能:外部中断通道3中断
* 入口参数:
* 出口参数:
-----------------------------------------------------------------------
* 说明:将LED灯的连接到PA1
***********************************************************************/
  void EXTI3_IRQHandler (void)
 {
   if(EXTI_GetITStatus(EXTI_Line3) != RESET)
    {
     //添加中断处理程序
  GPIO_WriteBit(GPIOA, GPIO_Pin_1,(BitAction)0); 
  Delay(1000);
  GPIO_WriteBit(GPIOA, GPIO_Pin_1,(BitAction)1);
  Delay(1000);
     EXTI_ClearFlag(EXTI_Line3);          //清除中断标志(必须)
     EXTI_ClearITPendingBit(EXTI_Line3);
     }
 }


 

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户443594 2014-6-4 21:27

正在学习这个,参考一下

用户848932 2013-6-11 11:30

很清晰!

用户1394812 2011-2-8 16:41

人生没有什么可悲哀的,一般人只为活着,二般人为理想活着,另一些平凡的人因为信仰而活着而不平凡。

ilove314_323192455 2011-2-7 09:08

记得有句话这么说来着:人生两大悲哀,一是想得到的得不到,二是想得到的得到了。
相关推荐阅读
用户158589 2010-05-25 13:42
STM32系列产品编号信息
STM32系列产品编号信息 每种STM32的产品都由16个字母或数字构成的编号标示,用户向ST订货时必须使用这个编号指定需要的产品。这16个字符分为8个部分,下面通过一个例子说明它们的意义: STM3...
用户158589 2010-05-25 10:18
STM32 例程 闪灯程序(GPIO应用)
可以到"单片研习-STM32"下载该工程,链接:http://group.ednchina.com/2415/例程名:【助学例程1】stm32点灯程序 #include <stm32f10x_l...
用户158589 2010-04-02 08:53
电快速瞬变脉冲群抗扰度测试及对策探讨
电快速瞬变脉冲群抗扰度测试及对策 探讨<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />...
用户158589 2010-03-05 08:42
STM32最小系统上做第一个例程前准备工作
Stm32最小系统的的硬件已经制作完毕,开始进入调试阶段。在调试之前我们得做一下准备工作。1、  集成开发环境的选择stm32的集成开发环境在国内比较流行的主要有:ARM公司的MDK和IAR公司的EW...
用户158589 2010-03-05 08:40
我与单片机
    我自以为自己是一个踏实的人,因为我做每一件事都是循序渐进,持之以恒。    其实做每一件事都应该这样,而学习单片机更是需要这种精神。单片机开发是一个很系统的职业,通常是软硬兼搞,这就需要开发者...
EE直播间
更多
我要评论
2
8
关闭 站长推荐上一条 /3 下一条