您的位置:首页 > 编程语言

STM32外部中断及定时器编程示例

2014-06-06 22:35 239 查看
 STM32中断程序
/*========================================================================================

 *名        称:  main.c

 *功        能: 

 *入口    参数:

 *说        明: 

 *范        例:  

 *编者   时 间:   

 *========================================================================================*/

#include "stm32f10x.h"

#include "12864.h"

 

ErrorStatus HSEStartUpStatus; //等待时钟的稳定    

u8 count=0;

u8 d;

 

void SYS_Configuration(void);      

 

/*

//ms延时函数

void delayms(unsigned int nValue) //delay 1ms at 8M

{

unsigned int nCount;

unsigned int ii;

unsigned int jj;

nCount = 1980;

for(ii = nValue;ii > 0;ii--)

{

for(jj = nCount;jj > 0;jj--)

Delay(1);

}

}

*/

//GPIO管脚初始化配置

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;                   //GPIO状态恢复默认参数

 

/*GPIO口配置每四行一组,每组GPIO属性相同,默认情况:ALL,2MHZ,FLATING*/

 

/*PA-2-3配置为输出*/

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_7; //管脚位置定义

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //设置输出模式

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //输出速度为50MHZ

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

 

/*PB-2配置为输出*/

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;            //管脚位置定义

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //设置输出模式

 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //输出速度为50MHZ

  GPIO_Init(GPIOB,&GPIO_InitStructure);               //B组GPIO初始化

 

/*PA-0配置为输入--------------------------------------------------------外部中断引脚*/ 

  GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0;

 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  GPIO_Init(GPIOA,&GPIO_InitStructure);

 

}

/*========================================================================================

 *名        称:NVIC_Configuration();

 *功        能:外部中断嵌套控制

 *入口    参数:

 *说        明: 放入主函数里初始化

 *范        例:  

 *编者   时 间:  Ye.FuYao 2012-9-23

 *========================================================================================*/

void NVIC_Configuration(void)                                  //嵌套中断向量控制配置

{      

    NVIC_InitTypeDefNVIC_InitStructure;                      //定义数据结构的变量

 

//  选择优先组  

   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);            //0组,全副优先级

 

    NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;             //选择中断通道,库P166页,

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;    //抢占优先级0

    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;           //响应优先级0

    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;              //启动此通道的中断

    NVIC_Init(&NVIC_InitStructure);                            //结构体初始化        

}

 

 

 

 

 

 

 

 

/*========================================================================================

 *名        称:EXTI_Configuration();

 *功        能: 外部设备中断初始化

 *入口    参数:

 *说        明: 放入主函数里初始化

 *范        例:  

 *编者   时 间:  Ye.FuYao 2012-9-23

 *========================================================================================*/

void EXTI_Configuration(void)                                   //中断初始化  (外部设备中断)

{                                 

   EXTI_InitTypeDefEXTI_InitStructure;                        //定义数据结构的变量

 

  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);  //管脚选择

// GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);

  EXTI_InitStructure.EXTI_Line=EXTI_Line0;                     //将以上入口放在EXTI_Line0这条线上(stm32有18条这样的线路)

  EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;            //中断模式

  EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;        //选择上升或下降沿触发

  EXTI_InitStructure.EXTI_LineCmd=ENABLE;                      //开中断

  EXTI_Init(&EXTI_InitStructure);                              //将结构体初始化

}

/*========================================================================================

 *名        称:Timer_Config();

 *功        能: 定时器中断初始化

 *入口    参数:

 *说        明: 放入主函数里初始化

 *范        例:  

 *编者   时 间:  Ye.FuYao 2012-9-23

 *========================================================================================*/

void Timer_Config(void)

{

    TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;              //定义TIM结构体变量

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);         //使能TIM2外设

    TIM_DeInit(TIM2);                                            //复位时钟TIM2,恢复到初始状态

    TIM_TimeBaseStructure.TIM_Period=17999;                     //35999和1999刚好1s

    TIM_TimeBaseStructure.TIM_Prescaler=1999;                  

    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;       //TIM2时钟分频

    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   //计数方式

//  定时时间T计算公式:                                       

// T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=(35999+1)*(1999+1)/72MHz=1s

    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);              //初始化

    TIM_ClearFlag(TIM2,TIM_FLAG_Update);                         //清除标志

//  中断方式下,使能中断源

    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);                     //使能中断源

    TIM_Cmd(TIM2,ENABLE);                                        //使能TIM2

}

/*========================================================================================

 *名        称:NVIC_Config();

 *功        能: 定时器嵌套控制

 *入口    参数:

 *说        明: 放入主函数里初始化

 *范        例:  

 *编者   时 间:  Ye.FuYao 2012-9-23

 *========================================================================================*/

void NVIC_Config(void)                                         //定时器嵌套向量控制器

{      

    NVIC_InitTypeDefNVIC_InitStructure;                      //定义结构体变量    

//  设置优先分级组                                                                 

   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);            //0组,全副优先级       

     

    NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;             //选择中断通道,库P166页,

//  选择中断通道。注意:固件库中为XXX_IRQChannel,但该程序预定义为XXX_IRQn,所以要特别注意

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;    //抢占优先级0

    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;           //响应优先级0

    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;              //启动此通道的中断

    NVIC_Init(&NVIC_InitStructure);                            //结构体初始化        

}              

int main(void)

{     

 

SYS_Configuration(); //时钟配置(使用外部8MHz晶振)

 

GPIO_Configuration();                                  //GPIO管脚初始化配置

NVIC_Configuration();                                  //外部中断嵌套控制

EXTI_Configuration();                                  //外部设备中断初始化

Timer_Config();                                        //定时器中断初始化

NVIC_Config();                                         //定时器嵌套控制

//  LCDPort_Init();               //PC10是CS//PC11是SCLK//PC12是SID

//  LCD_Init();                   //LCD12864初始化

//  _int();    

  while (1)

  {

//关LED

     GPIO_SetBits(GPIOA,GPIO_Pin_2);

     GPIO_SetBits(GPIOA,GPIO_Pin_3);

     GPIO_SetBits(GPIOB,GPIO_Pin_2);

 

  }

}

 

 

以下程序都在stm32f103x_it.c文件里

/*========================================================================================

 *名        称: voidPPP_IRQHandler(void)

 *功        能: 《中断服务函数》

 *入口    参数:

 *说        明: PPP可以再“startup_stm32f10xhd.S”文件里找

 *范        例: void PPP_IRQHandler(void){} 

 *编者   时 间:  Ye.FuYao 2012-9-23

 *========================================================================================*/  

void EXTI0_IRQHandler(void)                           //EXTI0中断服务函数

{

     int i;

     if(EXTI_GetITStatus(EXTI_Line0) != RESET)        //判断中断发生线

     {

     // 翻转I/O口

        GPIO_WriteBit(GPIOA, GPIO_Pin_3,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_3)));

        for(i=0;i<=800000;i++)                         //延时一会,不然看不到灯亮,不信可以试试

     

        EXTI_ClearITPendingBit(EXTI_Line0);            //清除中断标志  

     }

}

/*========================================================================================

 *名        称: voidPPP_IRQHandler(void)

 *功        能: 《中断服务函数》

 *入口    参数:

 *说        明: PPP可以再“startup_stm32f10xhd.S”文件里找

 *范        例: void PPP_IRQHandler(void){} 

 *编者   时 间:  Ye.FuYao 2012-9-23

 *========================================================================================*/

void TIM2_IRQHandler(void)                        //TIM2中断服务函数

{

    int i;

    if(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)!=RESET)

       {                       

            //翻转I/O口

            GPIO_WriteBit(GPIOA,GPIO_Pin_2, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)));

            for(i=0;i<=800000;i++)                 //延时一会,不然看不到灯亮,不信可以试试

 

            TIM_ClearFlag(TIM2,TIM_FLAG_Update);   //清标志

       }       

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: