STM8单片机教程-07 外部中断-上升沿&下降沿
注意:本文案需要配合无际单片机编程-STM8单片机教程视频学习。
注意:本文案需要配合无际单片机编程-STM8单片机教程视频学习。
一 本节课的目标:
- 掌握单片机的外部中断功能
- 按键外部外部检测功能
- 实验:通过中断方式完成按键检测功能
二 硬件介绍:
三 外部中断的原理
外部中断是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时,单片机的单片机将迫使暂停正在执行的程序,转而去进行中断事件的处理;中断处理完毕后.又返回被中断的程序处,继续执行下去.
举例:
为了更好的理解外部中断:我们举个例子: 今天上班我的主要工作是要完成一个 电路板的设计,如果没有外部影响的话,我就只需要做这个工作就OK了。 突然,你的领导或者老板,中间让你去见一下客户。 中断了当前的工作,和客户沟通完之后,我回来之后接着当前的继续干。
再这个过程中我们要分析几个细节:
- 是你的领导 或者你的老板,而不是其他的人。
- 老板找你,就要中断当前的工作
- 去陪客户
- 赔完客户后,会回去接着干之前没有干完的工作。
void main(void)
{
system_init();
while(1)
{
led1_open();
delay_1s();
led1_close();
delay_1s();
}
}
INTERRUPT_HANDLER(EXTI0_IRQHandler, 8)
{
INTERTUPTE Task
}
四 相关寄存器的介绍 和工作机制分析(了解)
通过视频学习
五 官方提供的外部中断的例程
1.官方提供的例程:
2.移植官方例程。
3.打开工程,简单查看例程:
①STM8单片机中断的总结:
- PA PB PC PD 都支持外部中断功能(和51有区别,51是指定的端口)
- PA0 PB0 PC0 PD0 占用一个通道。
②外部中断初始化
- GPIO端口初始化成输入中断模式
- 打开端口中断
- 支持上升沿,下降沿。
- 打开总中断
- 完善中断服务函数代码
六 结合寄存器 了解外部中断的库函数:(了解)
查看外部中断的库文件。如下图:
void EXTI_DeInit(void);
void EXTI_SetPortSensitivity(EXTI_Port_TypeDef EXTI_Port,EXTI_Trigger_TypeDef EXTI_TriggerValue);
void EXTI_SetPinSensitivity(EXTI_Pin_TypeDef EXTI_PinNum, EXTI_Trigger_TypeDef EXTI_TriggerValue);
void EXTI_SetHalfPortSelection(EXTI_HalfPort_TypeDef EXTI_HalfPort, FunctionalState NewState);
EXTI_Trigger_TypeDef EXTI_GetPortSensitivity(EXTI_Port_TypeDef EXTI_Port);
EXTI_Trigger_TypeDef EXTI_GetPinSensitivity(EXTI_Pin_TypeDef EXTI_PinNum);
FunctionalState EXTI_GetHalfPortSelection(EXTI_HalfPort_TypeDef EXTI_HalfPort);
ITStatus EXTI_GetITStatus(EXTI_IT_TypeDef EXTI_IT);
void EXTI_ClearITPendingBit(EXTI_IT_TypeDef EXTI_IT);
七 实现代码
1.实现效果:
通过外部中断检测按键,按键SW3按下LED2 亮 SW4按下LED灭
2.代码实现:
复制上节课的例程代码,并修改名称位 ”演示例程-外部中断”,如下图:
打开工程,编译main.c 函数。代码如下:
屏蔽stm8l10x_it.c 中外部中断1 外部中断4 的中断服务函数
#include “stm8l10x.h”
#define LED_GPIO_PORT GPIOA
#define LED_GPIO_PINS GPIO_Pin_3
#define SW3_GPIO_PORT GPIOC
#define SW3_GPIO_PINS GPIO_Pin_4
#define SW4_GPIO_PORT GPIOC
#define SW4_GPIO_PINS GPIO_Pin_1
void Delay(uint16_t nCount)
{
while (nCount != 0)
{
nCount–;
}
}
void main(void)
{
GPIO_Init(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_Mode_Out_PP_Low_Fast);
GPIO_Init(SW3_GPIO_PORT, SW3_GPIO_PINS, GPIO_Mode_In_PU_IT);
GPIO_Init(SW4_GPIO_PORT, SW4_GPIO_PINS, GPIO_Mode_In_FL_IT);
EXTI_SetPinSensitivity(EXTI_Pin_1, EXTI_Trigger_Falling_Low);
EXTI_SetPinSensitivity(EXTI_Pin_4, EXTI_Trigger_Falling_Low);
enableInterrupts();
GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PINS);
while (1)
{
}
}
INTERRUPT_HANDLER(EXTI1_IRQHandler, 9)
{
EXTI_ClearITPendingBit(EXTI_IT_Pin1);
GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PINS);
}
INTERRUPT_HANDLER(EXTI4_IRQHandler, 12)
{
EXTI_ClearITPendingBit(EXTI_IT_Pin4);
GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PINS);
}
七 功能测试
实验需要的器材:
和上节课一样,这里不再介绍
测试效果:
功能测试正常. 通过视频课程演示。
本节课到此结束。