[合泰杯HT32讨论区] 合泰单片机工程之外部中断

[复制链接]
723|15
 楼主| kzlzqi 发表于 2023-2-26 16:06 | 显示全部楼层 |阅读模式
继上一次的按键输入工程,这一次我们来利用按键来进行外部中断实验,当按键按下时,单片机去执行中断函数的程序,也就是点亮或者熄灭LED灯,LED灯我使用的是LED2。来看一下程序如何进行编程。

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

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


 楼主| kzlzqi 发表于 2023-2-26 16:07 | 显示全部楼层
再来看一下exti.c文件
  1. #include "exti.h"
  2. #include "LED.h"

  3. /*
  4. 中断初始化函数
  5. */

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

  15. /*
  16. 外部中断0函数,中断的向量为0x04,此函数在HT66F2390.h中被定义
  17. */
  18. DEFINE_ISR(ISR_Int0,0x04)   //ISR_Int0是中断函数名字   中断向量为何是0x04,请查看技术手册213页的那张图
  19. {
  20.    LED2 = ~ LED2;             //触发中断,LED2取反
  21.    _int0f =0;            //清除中断请求
  22. }
 楼主| kzlzqi 发表于 2023-2-26 16:07 | 显示全部楼层
中断初始化中要先开启总中断,然后再开启外部中断,之后是设置中断的触发方式,及设置相应的引脚和输入、上拉模式。也就是技术手册中这一段话。
 楼主| kzlzqi 发表于 2023-2-26 16:07 | 显示全部楼层
 楼主| 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)]


 楼主| kzlzqi 发表于 2023-2-26 16:10 | 显示全部楼层
[color=rgba(0, 0, 0, 0.75)]开启外部中断0,如下图,_int0e =1 是使能外部中断0.[color=rgba(0, 0, 0, 0.749019607843137)]



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


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

 楼主| kzlzqi 发表于 2023-2-26 16:13 | 显示全部楼层
中断函数
代码如下(示例):
  1. /*
  2. 外部中断0函数,中断的向量为0x04,此函数在HT66F2390.h中被定义
  3. */
  4. DEFINE_ISR(ISR_Int0,0x04)   //ISR_Int0是中断函数名字   中断向量为何是0x04,请查看技术手册213页的那张图
  5. {
  6.    LED2 = ~ LED2;             //触发中断,LED2取反
  7.    _int0f =0;            //清除中断请求
  8. }
 楼主| kzlzqi 发表于 2023-2-26 16:15 | 显示全部楼层
外部中断函数都有一个固定的格式的,有中断名及中断向量。同样我们在HT-3000的工具那一栏选择V3代码生成器那生成的中断函数好像跟我们写的不太一样。

 楼主| kzlzqi 发表于 2023-2-26 16:15 | 显示全部楼层
因为在合泰单片机的头文件中,也就是HT66F2390.h中有这样进行宏定义。这就是为什么使用我写的那个格式。

 楼主| kzlzqi 发表于 2023-2-26 16:18 | 显示全部楼层
接下来来看中断向量的选择,中断向量的我们中断程序的地址,也是就进去中断函数的入口也就是下面的这张图。

 楼主| kzlzqi 发表于 2023-2-26 16:18 | 显示全部楼层
 楼主| kzlzqi 发表于 2023-2-26 16:19 | 显示全部楼层
每次进入中断函数执行完程序要清楚中断标志位,不然会一直执行中断函数的,不会退出来。相应的寄存器如下图。
 楼主| kzlzqi 发表于 2023-2-26 16:19 | 显示全部楼层
主函数
我主函数里面就加了一个LED1闪烁来判断系统是否正常运行。
  1. #include "HT66F2390.h"
  2. #include "delay.h"
  3. #include "LED.h"
  4. #include "exti.h"

  5. void main()
  6. {
  7.         LED_Init();    //LED初始化
  8.         Exti_Init();    //中断函数初始化
  9.         while(1)
  10.         {
  11.                 LED1 =1;  //判断系统是否运行
  12.                 delay(1);
  13.                 LED1 =0;
  14.         }
  15. }
 楼主| kzlzqi 发表于 2023-2-26 16:20 | 显示全部楼层
总结
技术手册还是有用的,要多多研究啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

996

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部