历史上的今天
返回首页

历史上的今天

今天是:2024年08月31日(星期六)

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

2018-08-31 来源:eefocus

#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);   //清标志

       }       

}


推荐阅读

史海拾趣

GSI Technology公司的发展小趣事

进入21世纪后,GSI Technology继续加大研发投入,不仅巩固了其在SRAM领域的领先地位,还成功扩展了产品线,包括同步突发SRAM、无总线周转SRAM等。同时,公司还推出了SigmaRAM、SigmaQuad、SigmaQuad II等系列产品,这些产品以其卓越的性能、高可靠性和低功耗特性,赢得了市场的广泛认可。此外,GSI还致力于提供超长产品支持生命周期和完整的售前售后服务,进一步增强了客户粘性。

长园维安(CYGWAYON)公司的发展小趣事

长园维安始终关注环保和可持续发展。公司积极推行绿色制造和循环经济模式,降低生产过程中的能耗和排放。同时,长园维安还注重产品环保性能的研发和改进,为客户提供更加环保、节能的产品。这些努力使长园维安在电子行业中树立了绿色发展的典范。

爱浦电子(AIPULNION)公司的发展小趣事

面对日益激烈的市场竞争,爱浦电子始终坚持创新驱动的发展战略。公司不断投入研发资金,引进先进技术和设备,推动产品创新和技术升级。同时,爱浦电子还积极探索新的应用领域和市场机会,拓展产品的应用范围。这些创新举措为公司未来的发展奠定了坚实的基础,也为整个电子行业的发展注入了新的活力。

格莱尔(GLE)公司的发展小趣事

格莱尔积极响应国家“双碳”政策,将绿色生产理念贯穿于企业发展的全过程。公司不仅实现了产品的无铅化生产,还注重节能减排和资源循环利用。通过优化生产工艺、引进环保设备等措施,格莱尔有效降低了生产过程中的能耗和排放,为企业的可持续发展奠定了坚实的基础。

BILIN公司的发展小趣事

深圳市格莱尔电子有限公司成立于2005年,初期专注于电感产品的研发与生产。在创始人及团队的共同努力下,公司迅速在行业内崭露头角。随着技术的不断积累和市场需求的扩大,格莱尔逐渐扩大生产规模,并于2012年在湖北投资建厂,自建两座工厂,厂房面积达2万平方米,员工人数增长至500人。这一系列的举措不仅提升了公司的生产能力,也为其后续的发展奠定了坚实的基础。

EUPEC [eupec GmbH]公司的发展小趣事

随着市场的不断变化和客户需求的升级,EUPEC意识到品牌重塑的重要性。公司开始着手进行品牌升级和形象重塑工作,通过加强品牌宣传、提升产品质量和服务水平等方式,不断提升EUPEC品牌的知名度和美誉度。这些努力使得EUPEC在市场上树立了良好的形象,成为电力半导体领域的知名品牌。

问答坊 | AI 解惑

bootloader如何固化

文章说明:calmarrow(lqm)原创   关于bootloader,先简要地总结一下。经过了第一个阶段的学习,对bootloader有了一个整体的认识,其实把它当作一个功能单元就可以了,职责就是完成从硬件加电到操作系统内核运行之前的所有工作,这些工 ...…

查看全部问答>

对现场设备有没有要求多少时间要相应呢?

本信息来自合作QQ群:电子工程师技术交流(12425841)   群主在坛子ID:Kata ---------------------------------------------------------------------------------------------------- 各位 请教一个问题 我们在PLC的中控室里面对设 ...…

查看全部问答>

贴片二三极管查询起来就是烦,有没有汇总查询手册,大家分享下

贴片二三极管查询起来就是烦,有没有汇总查询手册,大家分享下…

查看全部问答>

日文的显示问题

我把日文的GBK转成UTF8码 然后用16*16的点阵显示出来 有些日文旁边会出现一些多出来的小点 这可能是啥原因引起的啊? 显示中文和英文都能正确显示。 那位大侠知道的 指点下下 谢谢 …

查看全部问答>

USB HCD驱动问题

S3C2440的平台,WINCE5.0,在USB HCD 驱动文件中2440_ohci.c中,有没有熟悉这个驱动的朋友,我想知道在这个驱动中哪个地方或者说哪个函数中将S3C2440的USB寄存器物理地址转换为虚拟地址并配置的,这个里面的代码我反复看过,但是因为以前没搞过USB, ...…

查看全部问答>

杯具了

人生像茶几,虽然不大却充满杯具啊!我的LPC1114经过一阵紧锣密鼓的工作,我的POV旋转时钟突破不能识别,不运行下载出现等一箩筐的困难后终于呵呵显示了,就在我安心的睡去,打算第二天在改进程序实现更好的功能时,完了,第二天晚上当我通电运行时 ...…

查看全部问答>

请问如何在STM32中产生38khz的红外载波?

                                 在STM32中产生38khz的红外载波,大家都有什么方法?(先说声谢谢)…

查看全部问答>

Linux驱动之触摸屏

linux触摸屏驱动分析 一.、前提知识1、Linux输入子系统(Input Subsystem):   在Linux中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(Input Core)和输入子系统事件处理层(Event Handler)组成。其中设备驱动层提供对硬件各寄 ...…

查看全部问答>