利用按键做为中断触发,按键按下一次,LED灯翻转一次。
首先初始化IO口,按键接在PC4口,默认情况下高电平,按键按下后为低电平。
初始化代码如下:

void EXTI_GPIO_Init( void )
{PC_DDR &= ~( 1 << 4 );        //PC4 输入PC_CR1 |= ( 1 << 4 );         //带上拉电阻输入PC_CR2 |= ( 1 << 4 );         //允许外部中断
}

将PC4口设置为输入口,选择上拉电阻输入,让IO口默认情况下为高电平。由于要使用中断功能,所以允许外部中断。
下来看看中断相关寄存器:

通过中断映射表可以看到STM8的IO口中断,一个IO口只有一个中断源,也就是说按键的PC4口中断源为 端口C外部中断。在看看中断设置寄存器:


中断相关寄存器有5个,因为只有一个按键中断,所以不需要设置优先级,只设置中断控制寄存器就行。

要设置PC口为低电平触发,所以要将寄存器的4、5位设置为0。
中断设置只需要设置一个寄存器就可以了,中断初始化代码如下:

void EXTI_Init( void )
{EXTI_GPIO_Init();          EXTI_CR1 &= ~( 3 << 4 );        //4 5 位清零   01是PA,23是PB,45是PC,67是PD引脚EXTI_CR1 |= ( 0 << 4 );         //PC上升沿触发   00是下降沿触发  01 上升沿 10 下降沿 11 上升沿和下降沿
}

为了在主程序中调用方便,将IO口初始化和中断寄存器初始化放在一个函数中。
首先调用IO口初始化,IO口初始化完成后设置外部中断控制寄存器1,按键在PC4口,所以先将PC口设置位清0,然后设置触发方式,我们是低电平触发,所以4、位设置为0。
初始化结束后,下来就是中断程序的编写,由于PC4口没有单独的中断入口,用的是PC口中断源,也就是说PC口任何一个口出现低电平或者下降沿都会触发PC中断源,所以当中断发生时还要在中断函数中判断一下PC4口的电平,确认是PC4口触发的中断。
中断代码如下:

#pragma vector = 7                  // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void EXTI_PORTC_Handle( void )
{if( EX_INT == 0 ){LED = !LED;}
}

中断中PC4口使用了位操作,定义在头文件中:

#ifndef __EXTI_H
#define __EXTI_H
#include "iostm8s103F3.h"
#define  EX_INT   PC_IDR_IDR4            //定义PC4为 中断输入
void EXTI_GPIO_Init( void );
void EXTI_Init( void );
#endif

进入PC中断服务程序中,若此时PC4口的电平为0时,说明是按键按下了,于是对LED灯状态取反。
按键时手会抖动,那么中断可能会被多次触发,为了避免这种情况可以在按键IO口增加一个滤波电容来滤除掉按键时毛刺的产生。
那么能不能像按键实验中给按键添加延时功能一样,也在中断中若PC4口为低电平,延时一段时间再判断PC4口的电平?这样做也可以,但是一般不建议这样做。因为中断程序执行越快越好,若中断中加延时,会影响主程序执行速度。若中断频繁发生,那么程序就会多一半在延时中等待,会严重影响程序执行效率。若进入中断后在等待延时的过程中又发生了中断,那么就会继续触发中断,形成中断嵌套。每次中断单片机就要开辟堆栈空间,若中断嵌套过多,就要开辟更多的堆栈空间,有可能导致单片机内部空间不足,引发程序异常。所以一般情况下中断函数中代码越少越好,代码执行速度越快越好。
中断服务程序是中断发生后自动执行的,所以主程序中只需要初始化就行。主程序代码如下:

#include "iostm8s103F3.h"
#include "led.h"
#include "exti.h"void SysClkInit( void )
{CLK_SWR = 0xe1;       //HSI为主时钟源  16MHz CPU时钟频率CLK_CKDIVR = 0x00;    //CPU时钟0分频,系统时钟0分频
}
void main( void )
{SysClkInit();                         //时钟初始化__asm( "sim" );                       //禁止中断LED_GPIO_Init();                      //LED 初始化EXTI_Init();                          //外部中断初始化__asm( "rim" );                       //开启中断LED = 0;while( 1 ){}
}

由于STM8单片机一组IO口只有一个中断入口,所以如果外部有多个中断源的话最好分别设置在不同组的IO口,这样程序处理起来会比较方便。

STM8学习笔记---外部中断实现相关推荐

  1. RT1064学习笔记-外部中断

    所有的中断号可以在MIMXRT1064.h中74行开始查看 外部中断 1.初始化IO口作为输入 设置要作为外部中断输入的 IO 口的状态,可以设置为上拉/下拉输入, 也可以设置为浮空输入(PKE=0) ...

  2. STM8学习笔记----普通IO口模拟串口功能

    串口在产品应用中很常见,但是单片机的默认带的串口往往比较少,有时候就会出现串口不够用,所以就想着能不能用普通IO口模拟串口来实现串口的功能. 要模拟串口首先要清楚串口数据传输过程中的原理. 常用的串口 ...

  3. 51单片机学习笔记之中断(外部中断、定时器中断、中断嵌套)

    要学习51单片机中断的朋友,拥有这一篇博文就够了,深入浅出,里面包含了寄存器,外部中断.定时器中断.中断嵌套等的讲解,还有代码实战.快一万字,写得不容易,还请大家点赞支持一下,后续持续更新 (一)寄存 ...

  4. STM8学习笔记3 STM8简介

    概述 STM8单片机的开发商是意法半导体(ST),于2009年推出.它具有3级流水线架构.性价比高.开发方便的等优点.根据应用场合的不同,分为三个系列:STM8S,STM8L和STM8A. 个人认为, ...

  5. OK6410开发板学习之外部中断(按键点亮led和蜂鸣器)

    中断在嵌入式里面是很常见的一个功能了.通过这个功能,可以让CPU减轻很多负担,不用不断的查询设备的状态.提高了CPU的效率. 中断的大体过程如下: 中断源检测中断信号产生,然后将中断信号发送给中断控制 ...

  6. IAR FOR STM8 学习笔记 固件库 GPIO

    经过一番挣扎,还是决定使用官方的固件库了.. 从网上下一个STM8S的固件库,记得是FOR IAR的. 找到里面的IAR模板就可以开始用了. 这些都是直接写好的库函数,可以直接调用,但首先得先读懂,先 ...

  7. 百问网七天物联网课程学习笔记——单片机中断的使用

    学习了百问网的智能家居实战训练营之后,对单片机的中断又有了更深刻的了解. 中断,即CPU在正常执行程序的过程中,遇到外部/内部的紧急事件需要处理,暂时中断(中止)当前程序的执行,而转去为事件服务,待服 ...

  8. Arduino笔记-外部中断实验(震动传感器实时亮灯)

    外部中断:达到实时响应处理事件的效果. 目前Ardinuo UNO引脚只有2个,一个是2号口,一个是3号口 在Ardinuo中中断函数,返回值为空,不能有参数 程序运行截图如下: 当感应到震动后: 这 ...

  9. STM8学习笔记----PWM单脉冲模式输出

    先看看官方资料对单脉冲模式的介绍 下面看C代码的实现 void PWM_GPIO_Init( void ) {PC_DDR_DDR6 = 1; //输出管脚 PC6 TIM1_CH1PC_CR1_C1 ...

最新文章

  1. ​kdevelop用法_weixin_44594953的博客-CSDN博客_kdevelop​
  2. Genetic Algorithm遗传算法,两个代码实现例子
  3. 自定义编译gdal库
  4. 使用Redis实现在线点赞系统
  5. python【数据结构与算法】一种时间复杂度和空间复杂度的计算方法
  6. 我的博客是怎么自定义的
  7. javaScript入门基础说明
  8. Java GridBagLayout 简单使用
  9. openstack资源使用汇总_OpenStack 如何查看主机已使用的资源啊?
  10. 1-4 TCP/IP协议族
  11. 在ASP.NET中防止注入攻击[翻译]
  12. 【leetcode】957. Prison Cells After N Days
  13. Oracle、Db2、SqlServer、MySQL 数据库插入当前系统时间
  14. JavaScript面向对象编程理解
  15. 文本自动摘要任务的“不完全”心得总结
  16. 阿里P8架构师谈:如何搭建亿级并发系统的性能指标体系
  17. 德宝怡高获批省大数据产业园
  18. 图片压缩小工具,jpg,png压缩
  19. Android 神兵利器之通过解析网页获取到的API数据合集,可拿来就用
  20. 大作业---Android本地音乐播放器开发知识点19145120

热门文章

  1. 如何限制访问电脑磁盘
  2. IBM走鹃险胜Cray Jaguar 连任世界最快超级计算机
  3. BIM工程信息管理新系统- 系统管理模块
  4. 弱鸡儿长乐爆肝旅Day8
  5. 学习进度条__软件工程概论第一周学习计划
  6. Linux-文件和目录操作命令
  7. sourceTree初识
  8. javascript焦点图(能够自己主动切换 )
  9. 转:Google的系统工程师(SA)如何工作
  10. OAuth 1.0a 的 C# 代码实现