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

发布者:VelvetWhisper最新更新时间:2018-06-15 来源: eefocus关键字: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);   //清标志

       }       

}


关键字:STM32  外部中断  定时器 引用地址:STM32外部中断及定时器编程示例

上一篇:stm32学习笔记之USB中断配置初始化函数
下一篇:STM32按键中断学习记录

推荐阅读最新更新时间:2024-03-16 16:05

STM32外部中断EXTI及NVIC中断优先级介绍
一、什么是中断? 打断当前的操作,执行中断需要做的事情。 中断的作用:中断机制不仅赋予了系统处理意外情况的能力,就可以“同时”完成多个任务,提高了并发“处理”能力。 和线程的区别:线程是同时执行多个任务,中断是停下来去执行其他的(注意优先级),执行完了再回来执行, 定时器才相当于线程,定一个时间,每到这个时间执行一次 二、中断概述 STM32F4并没有使用CM4内核的全部东西,而是只用了它的一部分。 STM32F40xx/STM32F41xx总共有92个中断 STM32F42xx/STM32F43xx则总共有96个中断 STM32F40xx/STM32F41xx的92个中断里面,包括10个
[单片机]
<font color='red'>STM32</font>的<font color='red'>外部中断</font><font color='red'>EXTI</font>及NVIC中断优先级介绍
STM32将PB3等IO用作普通IO
STM32F103 的 JTAG, 默认状态是Full SWJ。 The default state after reset is “000” (whole pins assigned for a full JTAG-DP connection). PB3作为JDO,被JTAG占用。 在 TRACE Asynchronous mode,PB3还是TRACESWO。 若系统不需要JTAG,将PB3当作GPIO,需要如下设置: RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOB , ENABLE); GPIO_PinRemapConfig(GPIO_R
[单片机]
stm32中如何开关总中断
PRIMASK 与 FAULTMASK 特殊功能寄存器 PRIMASK用于除能在NMI和硬fault之外的所有异常,它有效地把当前优先级改为0(可 编程优先级中的最高优先级)。该寄存器可以通过MRS和MSR以下例方式访问: 1. 关中断 MOV R0, #1 MSR PRIMASK, R0 2. 开中断 MOV R0, #0 MSR PRIMASK, R0 还可以通过CPS指令快速完成上述功能: CPSID i ;关中断 CPSIE i ;开中断
[单片机]
STM32单片机SPI极性和相位的设置方法
SPI分主设备和从设备,两者通过SPI协议通讯。而设置SPI的模式,是从设备的模式,决定了主设备的模式。所以要先去搞懂从设备的SPI是何种模式,然后再将主设备的SPI的模式,设置和从设备相同的模式,即可正常通讯。对于从设备的SPI是什么模式,有两种:(1)固定的,有SPI从设备硬件决定的SPI从设备,具体是什么模式,相关的datasheet中会有描述,需要自己去datasheet中找到相关的描述,即:关于SPI从设备,在空闲的时候,是高电平还是低电平,即决定了CPOL是0还是1;然后再找到关于设备是在上升沿还是下降沿去采样数据,这样就是,在定了CPOL的值的前提下,对应着可以推算出CPHA是0还是1了。举例1:CC2500-Low
[单片机]
<font color='red'>STM32</font>单片机SPI极性和相位的设置方法
STM32学习笔记(串口、IAP)
串口: 一. USART_ITConfig(USART1, USART_IT_TXE, ENABLE): 只要发送寄存器为空,就会一直有中断,因此,要是不发送数据时,把发送中断关闭,只在开始发送时,才打开。 二. 以下是字符发送的配置过程,注意第6点,在设置USART_CR1中的TE位时,会发送一个空闲帧作为第一次数据发送,所以即便你执行了USART_ClearFlag(USART1, USART_FLAG_TC); (这个函数肯定在空闲帧数据发送完成前执行),所以当空闲帧发送完后,就进入发送完成中断。 配置步骤: 1. 通过在USART_CR1寄存器上置位UE位来激活USART 2. 编程USART_CR1的M位来定义
[单片机]
stm32 i2c通信 [操作寄存器+库函数]
I2C总线是由NXP(原PHILIPS)公司设计,有十分简洁的物理层定义,其特性如下: 只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL; 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器; 它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏; 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s; 连接到相同总线的IC 数量只受到总线的最大电容400pF 限制。 其典型的接口连线如下: I2C的协议
[单片机]
<font color='red'>stm32</font> i2c通信 [操作寄存器+库函数]
stm32专题九:SysTick(一)系统嘀嗒定时器原理
SysTick是存在于stm32内核的定时器,嵌套在NVIC中,24位,只能递减。在stm32中文参考手册中,对于SysTick的描述其实很少,主要如下。systick的时钟可以为AHB时钟,或者是AHB时钟8分频=9M。而校准值固定为9000,也就是说,当时钟频率为9M时,9000的固定值对应1ms时间基准,9000 000对应1s时间。 在core-CM3编程手册中,有配置systick的寄存器描述。 SysTick控制和状态寄存器STK_CTRL 位描述: COUNTFLAG:如果上一次计数到0,则返回1,为计数标志。 CLKSOURCE:选择时钟源,为0时即为AHB时钟8分频,为1时直接就等于AHB总
[单片机]
<font color='red'>stm32</font>专题九:SysTick(一)系统嘀嗒<font color='red'>定时器</font>原理
STM32之SPI主机例程
#include stm32f10x.h /* RCC时钟配置 */ void RCC_config(void) { ErrorStatus HSEStartUpStatus; /* RCC寄存器设置为默认配置 */ RCC_DeInit(); /* 打开外部高速时钟 */ RCC_HSEConfig(RCC_HSE_ON); /* 等待外部高速时钟稳定 */ HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* 设置HCLK = SYSCLK */ RCC_HCLKConfig(RCC_SYSCLK_D
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved