STM8采用按键的外部中断实验

最近在学习STM8这块单片机,但是在网上STM8的资料实在是太少了,而且很多东西都比较杂,本人今天就STM8外部中断写一点自己的理解,如果有误,望大佬能指导一下小弟,小弟感激不尽。
我是用的ST官网的STVD开发的STM8,在开始讲解之前,我不得不吐槽一下这个软件,真的是太傻瓜了。好了,咱们言归正传,我是采用的B5这个端口去控制一个LED,D6这个端口作为外部中断输入口。
首先我们肯定要明白我们完成这个实验,需要哪几步来做。1.初始化IO口;2.设置中断模式;3.在中断服务函数中我们要怎么做;4.主函数中的一些函数调用。
这次实验呢我采用了这些头文件

**
#include “stm8s.h”//
#include “stm8s_clk.h”//
#include “stm8s_gpio.h”
#include "stm8s_exti.h"

**

一般我们为了代码的可读性比较高,会采取宏定义的操作。

#define LED_GPIO_PORT (GPIOB)
#define LED_GPIO_PINS (GPIO_PIN_5)//宏定义GPIOB5端口为LED控制
#define Interrupt_GPIO_PORT (GPIOD)
#define Interrupt_GPIO_PINS (GPIO_PIN_6)//宏定义GPIOD6端口****

接下来,我们进行第一步的操作:初始化IO口

GPIO_Init(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS,
GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_Init(Interrupt_GPIO_PORT,(GPIO_Pin_TypeDef)Interrupt_GPIO_PINS,GPIO_MODE_IN_PU_IT);

这个操作都是最基本的操作, 在这个头文件有包括**#include “stm8s_gpio.h”,其实就是一个结构体。
接着来,第二步操作
设置中断模式**,我呢把中断这个端口的初始化,还有模式的设置都打包成一个函数。这样做的目的,就是把每个部分成模块的调用,出问题就去一个地方改就行了。

void Buttom_Init(void)
{
GPIO_Init(Interrupt_GPIO_PORT,(GPIO_Pin_TypeDef)Interrupt_GPIO_PINS,GPIO_MODE_IN_PU_IT);
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD,EXTI_SENSITIVITY_FALL_LOW);
}

进入中断之后,我们就应该进行点灯操作,在这时候我们就要操作我们的中断服务函数在哪里了,在这个服务函数中去写自己要做的事。那我们就进行第三步工作在中断服务函数中写对于控制LED的IO口操作,中断服务函数在it.c这个源文件中,但是在进行该操作之前,我们要明白一个事,STM32是有中断标志位的,进入中断后去判断标志位,但是STM8没有中断标志位,我们要去读取我们中断IO的电平变换,利用GPIO_ReadInputPin()这个函数

INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6)
{
if(GPIO_ReadInputPin(GPIOD,GPIO_PIN_6)==0)
{
GPIO_WriteHigh(GPIOB, (GPIO_Pin_TypeDef) GPIO_PIN_5);
}

上面三步已经把我们分模块完成的事已经搞定了,那接下来我们就应该在主函数中调用这些模块。在这个地方也有一个坑,STM8设置中断模式的时候,必须要在总中断关闭的情况下去做,如果在之前打开总中断enableInterrupts();,一旦产生一个下降沿,程序就会马上死掉,所以得注意,到处都是细节呀。

void main(void)//
{
disableInterrupts();
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);//设置主频
Buttom_Init();
GPIO_Init(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS,
GPIO_MODE_OUT_PP_LOW_FAST);
GPIO_WriteLow(LED_GPIO_PORT,(GPIO_Pin_TypeDef) LED_GPIO_PINS);
enableInterrupts();
}

好了,这些差不多就是我对于STM8的一些小小的理解了。

你可能感兴趣的:(STM8采用按键的外部中断实验)