找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1695|回复: 0
打印 上一主题 下一主题
收起左侧

请教下STM32定时器中断的使用

[复制链接]
跳转到指定楼层
楼主
ID:417546 发表于 2020-8-31 23:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM8L152K4  定时器中断  初学者
本程序使用定时器中断4,每5ms产生一个中断,并在timecreat函数中进行计时,在主函数的while中,通过if语句判断定时器中断时间后,对gpio口进行相应操作,函数如下:
#include "stm8l15x.h"
#include "Define.h"

//以下定义LED与按键的接口
#define LED1_GPIO_PORT  GPIOC      //BLUE
#define LED1_GPIO_PINS  GPIO_Pin_4
#define LED2_GPIO_PORT  GPIOB      //RED
#define LED2_GPIO_PINS  GPIO_Pin_0
#define LED3_GPIO_PORT  GPIOD      //GREEN
#define LED3_GPIO_PINS  GPIO_Pin_2

#define KEY1_GPIO_PORT  GPIOD      //K1
#define KEY1_GPIO_PINS  GPIO_Pin_4
#define KEY2_GPIO_PORT  GPIOA      //K2
#define KEY2_GPIO_PINS  GPIO_Pin_2
#define KEY3_GPIO_PORT  GPIOB      //K3
#define KEY3_GPIO_PINS  GPIO_Pin_3

u8 vTcount1,vTcount2;
//unsigned char flag16ms = 0;
ramTime_srtuct ramTime;

void TimeCreate()
{
  if(ramTime._5MS)//5ms中断计数一次
  {
    ramTime._5MS=0;
    //pKeyP.TIME_KEY++;  

    vTcount1++;
    if(vTcount1 >19)//有个逻辑问题不太理解,即在此处定义了时间,在后续执行调用变量时,是顺序调用执行还是直接调用执行
    {
        vTcount1 = 0;
                vTcount2++;//到达500ms
                if(vTcount2==5)ramTime._500MS = 1;
                else if(vTcount2==7)ramTime._700MS = 1;//到达700ms
                else if(vTcount2==10)
                {
                        ramTime._1S= 1;//到达1s
                        vTcount2=0;
                }           
      }
  }
}
/*GPIO初始化*/
void gpio_init()
{
   // GPIO_Init(LED1_GPIO_PORT, LED1_GPIO_PINS, GPIO_Mode_Out_PP_High_Fast);//初始化LED1,GPC4低速推挽输出
    //GPIO_Init(KEY1_GPIO_PORT, KEY1_GPIO_PINS, GPIO_Mode_In_PU_IT);//初始化按键1,上拉中断输入
    GPIO_Init(LED1_GPIO_PORT, LED1_GPIO_PINS, GPIO_Mode_Out_PP_Low_Slow);//带上拉,推挽输出低电平
    GPIO_Init(LED2_GPIO_PORT, LED2_GPIO_PINS, GPIO_Mode_Out_PP_Low_Slow);//带上拉,推挽输出低电平
    GPIO_Init(LED3_GPIO_PORT, LED3_GPIO_PINS, GPIO_Mode_Out_PP_Low_Slow);//带上拉,推挽输出低电平
    //初始化3个按键接口
    GPIO_Init(KEY1_GPIO_PORT, KEY1_GPIO_PINS, GPIO_Mode_In_PU_No_IT);//初始化按键,GPD4上拉输入
    GPIO_Init(KEY2_GPIO_PORT, KEY2_GPIO_PINS, GPIO_Mode_In_PU_No_IT);//初始化按键,GPA2上拉输入
    GPIO_Init(KEY3_GPIO_PORT, KEY3_GPIO_PINS, GPIO_Mode_In_PU_No_IT);//初始化按键,GPB3上拉输入
}
/*定时器初始化*/
void timer4_init()
{
    CLK_PeripheralClockConfig (CLK_Peripheral_TIM4,ENABLE); //使能外设时钟,STM8L默认所有外设时钟初始时关闭,使用前徐开启

    TIM4_TimeBaseInit(TIM4_Prescaler_128, 200);//..原为0xffff,,,,16M/8/128=15.625K,0xff=255,255*(1/15.625)=0.01632S,大约61次中断是1S
    TIM4_ITConfig(TIM4_IT_Update, ENABLE);//向上溢出中断,中断函数向量号为25
    TIM4_Cmd(ENABLE);
}

/*void exti_init()
{
  EXTI_DeInit ();
  EXTI_SetPinSensitivity (EXTI_Pin_4,EXTI_Trigger_Falling);
}*/

/*按键操作函数*/
void Dokey()
{
  int key1;
  static unsigned int key_press_time = 0;  // ……请记得标为静态变量
    key1=GPIO_ReadInputDataBit(KEY1_GPIO_PORT,KEY1_GPIO_PINS);
    if(key1 == 0)
    {
        if(++key_press_time <=0)--key_press_time;//计量按键时间,并避免数据溢出
        if(key_press_time==3000)//长按三秒
        {
            GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PINS);           
        }
    }else
    {
        if(20<=key_press_time && key_press_time < 3000)//大于20ms小于3s
    {      
        GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PINS);  
    }
        key_press_time=0;
    }
}

/*主函数*/
int main(void)
{     
    //exti_init();
    timer4_init();
    gpio_init();

    enableInterrupts();//使能中断总开关

    ramTime._5MS=0;//srtuct变量,在define.h函数中定义,用于时间的调用
    ramTime._100MS=0;
    ramTime._500MS=0;
    ramTime._700MS=0;
    ramTime._1S=0;
   // TimeCreate();
    while(1)
    {  
     // GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PINS);
     // GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PINS);
     // GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PINS);
      if(ramTime._500MS)
      {
        ramTime._500MS = 0;
        GPIO_ToggleBits(LED2_GPIO_PORT,LED2_GPIO_PINS);
        //Dokey();
      }
      if(ramTime._1S)
      {
        ramTime._1S = 0;
        GPIO_ToggleBits(LED2_GPIO_PORT,LED2_GPIO_PINS);

      }      
    }
}

Define.h函数
#ifndef __DEFINE_H
#define __DEFINE_H

#include "stm8l15x.h"

typedef struct  
{
    u8 _5MS;
    u8 _100MS;
    u8 _500MS;
    u8 _700MS;        
    u8 _1S;
    u8 _1000mS;

} ramTime_srtuct;


定时器4中断函数
extern ramTime_srtuct ramTime;
u8 cnt5ms;
INTERRUPT_HANDLER(TIM4_UPD_OVF_TRG_IRQHandler,25)
{
    /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */

    /*i++;
    if(i==61)
    {
        GPIO_ToggleBits(GPIOC, GPIO_Pin_4);//翻转GPD4输出状态
        i=0;
    }*/

    TIM4_ClearITPendingBit(TIM4_IT_Update);
    //flag16ms ++;
    cnt5ms++;
  if(cnt5ms>24)
  {
     cnt5ms=0;
     ramTime._5MS=1;        
  }
}

以上为函数部分,但该有的中断效果没出来,不太会调,有大神指导下吗!!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表