最近在學習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_ONLY);
}
進入中斷之后,我們就應該進行點燈操作,在這時候我們就要操作我們的中斷服務函式在哪里了,在這個服務函式中去寫自己要做的事,那我們就進行第三步作業在中斷服務函式中寫對于控制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的一些小小的理解了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274806.html
標籤:其他
下一篇:破局共享汽車
