标题:
请教下STM32定时器中断的使用
[打印本页]
作者:
kingdooly
时间:
2020-8-31 23:17
标题:
请教下STM32定时器中断的使用
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;
}
}
以上为函数部分,但该有的中断效果没出来,不太会调,有大神指导下吗!!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1