历史上的今天
返回首页

历史上的今天

今天是:2024年12月27日(星期五)

正在发生

2019年12月27日 | STM8学习笔记---外部中断实现

2019-12-27 来源:eefocus

利用按键做为中断触发,按键按下一次,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口,这样程序处理起来会比较方便。

推荐阅读

史海拾趣

Hirosugi-Keiki公司的发展小趣事

对于门控夜明灯电路,网友们可能会有多种问题,以下是一些常见问题及其详细回答:

一、工作原理相关问题

  1. 问:门控夜明灯电路是如何实现自动开关的?
    : 门控夜明灯电路主要通过门控开关、延迟电路、光控电路和电源电路等几部分组成。当门打开时,门控开关触发电路,使电灯点亮。同时,延迟电路控制电灯的点亮时间,一般为几十秒左右。光控电路则确保在光线较暗的环境下(如夜晚)电路才会工作,而在白天则自动封锁电路,避免电灯误亮。

  2. 问:电路中的光控部分是如何工作的?
    : 电路中的光控部分通常由光敏电阻器(如MG45型)和相关的电子元件组成。光敏电阻器的阻值会随着光照强度的变化而变化。在白天,由于光照强度大,光敏电阻器呈现低阻值状态,导致电路中的某个三极管(如VT3)导通,进而封锁整个电路,使电灯不会点亮。而在夜晚,光照强度减弱,光敏电阻器呈现高阻值状态,三极管截止,电路恢复正常工作状态,受门控开关控制。

二、安装调试相关问题

  1. 问:如何安装门控夜明灯电路?
    : 安装门控夜明灯电路时,首先需要将干簧管安装在门框上,将小磁铁安装在门上,并确保两者在门关闭时能够对准并吸合。接着,将电路板固定在合适的位置,并连接好电源线和电灯线。最后,进行电路调试,确保电路能够正常工作。

  2. 问:如何调整电灯的点亮时间?
    : 电灯的点亮时间主要由延迟电路中的电阻和电容决定。要调整点亮时间,可以通过改变电阻(如R2)的阻值或电容(如C1)的容量来实现。一般来说,电阻阻值增大或电容容量增大,都会导致点亮时间延长;反之,则点亮时间缩短。

三、故障排除相关问题

  1. 问:如果电灯不亮,可能是什么原因?
    : 如果电灯不亮,可能是由多种原因造成的。首先,应检查电源是否正常,以及电路中的保险丝是否熔断。其次,检查门控开关是否工作正常,即干簧管和小磁铁是否能够在门打开时正确触发电路。此外,还应检查光控电路是否因光线过强而处于封锁状态。最后,检查电灯本身是否损坏。

  2. 问:电灯在白天也会亮,怎么办?
    : 如果电灯在白天也会亮,可能是光控电路出现了问题。首先,应检查光敏电阻器是否损坏或受到其他光源的干扰。其次,检查与光敏电阻器相关的电子元件(如VT3)是否工作正常。如果问题依然存在,可能需要重新调整光控电路的灵敏度或更换相关元件。

四、其他相关问题

  1. 问:门控夜明灯电路适用于哪些场合?
    : 门控夜明灯电路适用于需要自动照明的各种场合,如家庭玄关、走廊、楼梯间等。它能够在人们进门时自动点亮电灯,为人们提供方便,同时也能够节省能源。

  2. 问:如何选择合适的电灯与电路匹配?
    : 在选择电灯与电路匹配时,首先需要考虑电灯的功率和类型。由于门控夜明灯电路通常设计为低功耗电路,因此建议选择功率较小、发光效率较高的电灯,如LED灯泡。此外,还需要确保电灯的电压和电流与电路的输出相匹配,以避免电路损坏或电灯烧毁。

EMLSI公司的发展小趣事

随着环保意识的不断提高,电子行业也开始面临环保压力。EMLSI公司积极响应环保号召,致力于开发绿色环保产品。公司投入大量资源进行环保技术研发,成功推出了一系列低能耗、低排放的电子产品。这些产品不仅满足了客户的需求,也为公司赢得了良好的社会声誉。

Apx-Crystal公司的发展小趣事

面对日益激烈的市场竞争,Apx-Crystal公司意识到单凭自身的力量难以保持长期的竞争优势。于是,公司积极寻求与行业内外的合作伙伴进行技术交流和合作研发。通过与知名高校、科研机构以及同行的紧密合作,Apx-Crystal成功开发出了一系列具有创新性和领先性的电子产品,进一步巩固了其在行业内的领先地位。同时,公司还加大了对产业链的整合力度,推动了产业升级和可持续发展。

Hi-Light Electronic Co Ltd公司的发展小趣事

在快速发展的同时,Apx-Crystal公司始终坚持创新驱动的发展理念。公司投入大量资金用于研发创新和技术升级,不断推出具有市场竞争力的新产品。同时,公司还注重品牌建设和市场推广,通过参加行业展会、举办技术研讨会、开展线上线下营销活动等方式,提升品牌知名度和影响力。这些举措使得Apx-Crystal在行业内树立了良好的品牌形象,成为电子元件领域的佼佼者。

aconno公司的发展小趣事

品质是aconno公司发展的基石。公司从一开始就注重产品质量和用户体验,从原材料采购到生产工艺,再到产品测试,每一个环节都严格把关。这种对品质的坚持,使得aconno的产品在市场上赢得了良好的声誉。同时,公司还建立了完善的售后服务体系,为用户提供及时、专业的技术支持,进一步增强了用户的信任度和忠诚度。

Compex Corporation公司的发展小趣事

近年来,电子行业面临着巨大的变革和挑战。新技术的不断涌现和市场的快速变化使得企业必须不断适应和创新。Compex Corporation也不例外。公司紧密关注行业动态和技术发展趋势,不断调整和优化产品结构和市场策略。同时,公司还加大了在人工智能、物联网等新兴领域的研究力度,以期在未来市场中占据先机。通过持续创新和适应变化,Compex Corporation在电子行业中保持了领先地位,并为未来的发展奠定了坚实基础。

请注意,以上故事是基于假设和可能的情况构建的,并非Compex Corporation的实际发展历史。如果需要更具体和准确的信息,建议查阅相关公司的官方资料或行业报告。

问答坊 | AI 解惑

超声波测距系统的电路设计

一、引言 由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,... …

查看全部问答>

求救:做过凌阳红外测温模块的朋友帮帮忙

由于他们有些程序是用汇编写的 看的我都疼。。 有没有用51或者avr做过的 请帮帮忙 或者给个控制的思路也好 先谢过啦…

查看全部问答>

关于NK.NB0下载的问题

我们通常都是通过eboot进入菜单选择U,然后通过dnw下载nk.bin的,其实,NK.NB0也可以直接下载到内存里面运行的,至少我用nor起来下载过NK.NB0运行的,这样有个好处,不用每次都烧写nand,效率高速度快。 但我手头的开发板没有nor,USB又不好使,我 ...…

查看全部问答>

想做智能小车 谁有好点的车模啊?~~

想做智能小车  谁有好点的车模啊?~~…

查看全部问答>

地址复用总线,内存和cpu的连接关系或特点

这个是我的面试题(软件方向),由于我硬件知识薄弱,面试官允许我搜集资料后再回答。 应该是入门或者典型的概念 (老式的)数据地址和指令地址共用同一条总线时,cpu和内存的连接关系或者要注意什么特点? 也许是问如何区分开数据和指令的 公 ...…

查看全部问答>

需要高人指点TCPMP修改界面,可支付现金报酬

虽然是技术论坛,谈钱太俗,实在是时间太紧,有做过tcpmp界面修改的高人请联系以下邮箱 :an5592@sohu.com…

查看全部问答>

protel 99 SE元件加载问题!!!

protel 99 se 里面的元件库大部分都不能加载(Add),加载时提示说“files not recognized!”,只能是Sch文件夹里的前面一些.DDB才能加进去,是不是要重新装载呀!!!请教各位大侠了。 问题算是简单,本人积分少,请谅解,还要问其他问题,呵呵…

查看全部问答>

100分紧急求助:USB HID类设备开发中用CreateFile无法得到设备句柄,如何解决?

利用开发板的资源做了一个USB接口的鼠标,就是用开发板上的一个摇杆作为鼠标方向的移动,另外用两个按键分别模拟鼠标的左键和右键。 现在想写上位机程序(VC6.0)对它进行读写,在得到了设备路径名之后,调用CreateFile总是失败,用GetLastError看 ...…

查看全部问答>