您好,欢迎来到61ic! | [登录] [注册] 忘记密码 | 设为首页 帮助
 . 网站首页 . 业界新闻 . 设计中心 . 移动技术 . TI专栏 . ADI专栏 . FPGA专栏 . 代码工厂 . 官方商城 . 
 . 活动专区 . 新品快递 . 解决方案 . 前沿科技 . TI资源 . ADI资源 . FPGA资源 . 下载中心 . 产品展示 . 
加入收藏
付款方式
联系我们
您现在的位置: 61IC电子在线 >> 设计中心 >> 嵌入式系统 >> 正文
  STM32外部中断及定时器编程示例           ★★★ 【字体:
STM32外部中断及定时器编程示例
作者:人生一抹…    文章来源:人生一抹儿绿色    点击数:    更新时间:2014-6-10    

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

 *名        称:  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);   //清标志

       }       

}

文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    STM32库初认识
    STM32 CAN过滤器总结
    STM32启动代码分析
    STM32 boot[1:0]设置
    STM32系列芯片名称定义
    浅谈STM32的DMA模块的使用
    STM32 无中断串口代码
    STM32中assert_param的使用
    STM32中关于RCC时钟的理解
    ST公司三轴加速度计LIS3DH应…
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61 湘ICP备13001086号-2