打印
[合泰杯HT32讨论区]

合泰单片机工程之外部中断

[复制链接]
335|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kzlzqi|  楼主 | 2023-2-26 16:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
继上一次的按键输入工程,这一次我们来利用按键来进行外部中断实验,当按键按下时,单片机去执行中断函数的程序,也就是点亮或者熄灭LED灯,LED灯我使用的是LED2。来看一下程序如何进行编程。

提示:以下是本篇文章正文内容,下面案例可供参考

一、中断初始化函数
先来看一下头文件,也就是exti.h,头文件没有啥的,像上一个例程的一样,加了条件编译和引入的单片机的头文件,及声明了中断初始化函数和中断函数
<p>
</p><p>#ifndef __EXTI_H</p><p>#define __EXTI_H<span style="white-space:pre">        </span></p><p>#include "HT66F2390.h"</p><p>
</p><p>void Exti_Init(void);   //中断初始化函数</p><p>DEFINE_ISR(ISR_Int0,0x04);</p><p>
</p><p>#endif</p><div></div>


使用特权

评论回复

相关帖子

沙发
kzlzqi|  楼主 | 2023-2-26 16:07 | 只看该作者
再来看一下exti.c文件
#include "exti.h"
#include "LED.h"

/*
中断初始化函数
*/

void Exti_Init(void)
{
        _emi =1 ; //开启总中断
        _int0e =1 ;//开启外部中断0中断
        _integ = 0b00000010; //外部中断0为下降沿触发模式
        _pac1 =1;    //pa1引脚设置为输入模式
        _papu1 =1;   //设置为上拉模式
        _int0ps = 0;           //技术手册第109页,中断0的输入引脚选择pa1
}

/*
外部中断0函数,中断的向量为0x04,此函数在HT66F2390.h中被定义
*/
DEFINE_ISR(ISR_Int0,0x04)   //ISR_Int0是中断函数名字   中断向量为何是0x04,请查看技术手册213页的那张图
{
   LED2 = ~ LED2;             //触发中断,LED2取反
   _int0f =0;            //清除中断请求
}

使用特权

评论回复
板凳
kzlzqi|  楼主 | 2023-2-26 16:07 | 只看该作者
中断初始化中要先开启总中断,然后再开启外部中断,之后是设置中断的触发方式,及设置相应的引脚和输入、上拉模式。也就是技术手册中这一段话。

使用特权

评论回复
地板
kzlzqi|  楼主 | 2023-2-26 16:07 | 只看该作者

使用特权

评论回复
5
kzlzqi|  楼主 | 2023-2-26 16:08 | 只看该作者
[color=rgba(0, 0, 0, 0.75)]开启总中断,直接使能EMI位,它跟外部中断0的控制位一样,是包含在INCT0寄存器里面的,不过也可以直接对位进行书写,也就是设置_emi=1.
[color=rgba(0, 0, 0, 0.75)]


使用特权

评论回复
6
kzlzqi|  楼主 | 2023-2-26 16:10 | 只看该作者
[color=rgba(0, 0, 0, 0.75)]开启外部中断0,如下图,_int0e =1 是使能外部中断0.[color=rgba(0, 0, 0, 0.749019607843137)]



使用特权

评论回复
7
kzlzqi|  楼主 | 2023-2-26 16:10 | 只看该作者
外部中断0的触发方式选择。这里我选用的是下降沿的触发方式,按键一开始是拉高的,当按下去的一瞬间是接低的,也就是电平下降(下降沿),松开时电平上升(上升沿)。所以说要有按键按下时立即反应,所以设置的是下降沿。我程序的书写时直接操作寄存器的,用二进制的写位,也就是程序中看到的那样_integ = 0b00000010。


使用特权

评论回复
8
kzlzqi|  楼主 | 2023-2-26 16:13 | 只看该作者
[color=rgba(0, 0, 0, 0.75)]外部中断0的引脚选择。这个要看技术手册输入\输出的那一章,也就是109页,此寄存器的第0位是设置引脚选择的,我们还是跟按键输入的那一章一样,选择pa1引脚,同样设置为输入模式,及设置上拉模式。

使用特权

评论回复
9
kzlzqi|  楼主 | 2023-2-26 16:13 | 只看该作者
中断函数
代码如下(示例):
/*
外部中断0函数,中断的向量为0x04,此函数在HT66F2390.h中被定义
*/
DEFINE_ISR(ISR_Int0,0x04)   //ISR_Int0是中断函数名字   中断向量为何是0x04,请查看技术手册213页的那张图
{
   LED2 = ~ LED2;             //触发中断,LED2取反
   _int0f =0;            //清除中断请求
}

使用特权

评论回复
10
kzlzqi|  楼主 | 2023-2-26 16:15 | 只看该作者
外部中断函数都有一个固定的格式的,有中断名及中断向量。同样我们在HT-3000的工具那一栏选择V3代码生成器那生成的中断函数好像跟我们写的不太一样。

使用特权

评论回复
11
kzlzqi|  楼主 | 2023-2-26 16:15 | 只看该作者
因为在合泰单片机的头文件中,也就是HT66F2390.h中有这样进行宏定义。这就是为什么使用我写的那个格式。

使用特权

评论回复
12
kzlzqi|  楼主 | 2023-2-26 16:18 | 只看该作者
接下来来看中断向量的选择,中断向量的我们中断程序的地址,也是就进去中断函数的入口也就是下面的这张图。

使用特权

评论回复
13
kzlzqi|  楼主 | 2023-2-26 16:18 | 只看该作者

使用特权

评论回复
14
kzlzqi|  楼主 | 2023-2-26 16:19 | 只看该作者
每次进入中断函数执行完程序要清楚中断标志位,不然会一直执行中断函数的,不会退出来。相应的寄存器如下图。

使用特权

评论回复
15
kzlzqi|  楼主 | 2023-2-26 16:19 | 只看该作者
主函数
我主函数里面就加了一个LED1闪烁来判断系统是否正常运行。
#include "HT66F2390.h"
#include "delay.h"
#include "LED.h"
#include "exti.h"

void main()
{
        LED_Init();    //LED初始化
        Exti_Init();    //中断函数初始化
        while(1)
        {
                LED1 =1;  //判断系统是否运行
                delay(1);
                LED1 =0;
        }
}

使用特权

评论回复
16
kzlzqi|  楼主 | 2023-2-26 16:20 | 只看该作者
总结
技术手册还是有用的,要多多研究啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

101

主题

797

帖子

2

粉丝