STM8学习笔记---外部中断实现

STM8学习笔记---外部中断实现
利⽤按键做为中断触发,按键按下⼀次,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⼝,这样程序处理起来会⽐较⽅便。

本文发布于:2024-09-21 17:35:15,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/196337.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:中断   按键   设置   触发
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议