历史上的今天
返回首页

历史上的今天

今天是:2025年06月15日(星期日)

2018年06月15日 | STM32外部中断及定时器编程示例

2018-06-15 来源:eefocus

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

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

       }       

}


推荐阅读

史海拾趣

问答坊 | AI 解惑

multisim2001教程

本帖最后由 dontium 于 2015-1-23 13:25 编辑 一款不错的仿真软件,大家可以试试,主要运用于模电的仿真。 …

查看全部问答>

Xilinx Design contest

Xilinx Design contest关于Xilinx首度创新设计大赛。    主要内容:基于FPGA的JPEG硬件解码器的设计。…

查看全部问答>

关于IS61lv25616

read时序 write时序 怎么看懂这个时序…

查看全部问答>

源程序编译问题

求教:本人刚刚接触Win CE,以前也没有什么开发经验。现在自己摸索着想把6410原来BSP包里的某个驱动源程序重新编译,生成一个名字不一样但功能一样的新驱动程序,然后通过万用表看接口的高低电平来对照着源程序学习。现在源程序(复制的)、def文件 ...…

查看全部问答>

要同时点亮几个数码管,应该如何编程??

我刚开始看到一个代码用的是 P0=0xea这种方式,后来又看到一种为P2=2,P0=0x3f(这是我刚买的stc单片机配套的,但不知道如何同时点亮多个数码管,)知道的请指点一二,谢谢了!…

查看全部问答>

EVC窗口切换问题

各位大侠,小弟遇到一个问题,希望各位帮忙解决一下: 我在EVC写了一个窗口切换对话框,但是对话框将系统所有前台文件和后台文件都显示出来,其实我只要显示桌面已经打开对话框就可以了,但是小弟不知怎样过滤这些后台文件。请各位帮忙!!!如下 ...…

查看全部问答>

LM3S8962 评估套件使用报告

老师周三带我们学习LM3S8962 评估套件的使用,看老师用套件演示的蒸汽机车图片,黑白相间的图片从小屏显示出来,想象不到效果会这么酷,看的我们十个人新潮澎湃。之后又演示了盘上带的东西,还做了一些简单的修改,第二天就去外地上课了。今天老板 ...…

查看全部问答>

程序下载问题

                                 今天使用J-LINK下不进去程序了,刚开始还以为板子坏了,后来换了一个仿真器就能成功下载,用我的下载时出现“conno ...…

查看全部问答>