STC32单片机 普通 I/O 口中断功能介绍和使用

news2024/10/2 16:31:06

STC32单片机 普通 I/O 口中断功能和使用


✨STC32单片机普通 I/O 口中断,不是传统外部中断.

  • 🔖手册上描述:STC32G 系列支持所有的 I/O 中断,且支持 4 种中断模式:下降沿中断、上升沿中断、低电平中断、高电平中断。每组 I/O 口都有独立的中断入口地址,且每个 I/O 可独立设置中断模式。
    注:STC32G12K128-Beta 版芯片的普通 I/O 口下降沿中断和上升沿中断暂时不要使用

🔰由于手上只有STC32G12K128-Beta版本的,实际测试了低电平 I/O 口中断是有效的,在配置成高电平中断代码模式下,也只能通过低电平才能响应中断,在引脚引入高电平(3.3V或5V)都没有反映。其他两种触发模式未作验证。

🌼 I/O 口中断相关寄存器

在这里插入图片描述

🌻端口中断使能寄存器(PxINTE)

在这里插入图片描述

  • PnINTE.x:端口中断使能控制位(n=07,x=07)
    0:关闭 Pn.x 口中断功能
    1:使能 Pn.x 口中断功能

📓端口中断标志寄存器(PxINTF)

在这里插入图片描述

  • PnINTF.x:端口中断请求标志位(n=0~ 7,x=0~7)
    0:Pn.x 口没有中断请求
    1:Pn.x 口有中断请求,若使能中断,则会进入中断服务程序。标志位需软件清 0。

📗端口中断模式配置寄存器(PxIM0,PxIM1)

在这里插入图片描述

  • 配置端口的模式
    在这里插入图片描述

✅端口中断优先级控制寄存器(PINIPL,PINIPH)

在这里插入图片描述

  • PxIPH,PxIP:Px口中断优先级控制位
    00:Px 口中断优先级为 0 级(最低级)
    01:Px 口中断优先级为 1 级(较低级)
    10:Px 口中断优先级为 2 级(较高级)
    11:Px 口中断优先级为 3 级(最高级)

🍁端口中断掉电唤醒使能寄存器(PxWKUE)

在这里插入图片描述

  • PnxWKUE:端口中断掉电唤醒使能控制位(n=07,x=07)
    0:关闭 Pn.x 口中断掉电唤醒功能
    1:使能 Pn.x 口中断掉电唤醒功能
  • 🚩工程说明:
    在这里插入图片描述
  • 📑通用中断跳转汇编文件代码:
    • ⚡根据选择不同端口中断,对应的入口地址不同,注意修改。
// ISR.ASM
//将下面的代码保存为 ISR.ASM,然后将文件加入到项目中即可
//CSEG AT 0143H ;P3 口中断入口地址
//CSEG AT 013BH ;P2 口中断入口地址
//CSEG AT 0133H ;P1 口中断入口地址
//CSEG AT 012BH ;P0 口中断入口地址
CSEG AT 013BH ;P2 口中断入口地址
JMP P0INT_ISR
P0INT_ISR:
JMP 006BH ;借用 13 号中断的入口地址
END

📝P0口下降沿中断示例

/*
P0 口下降沿中断
==注:STC32G12K128-Beta 版芯片的普通 I/O 口下降沿中断和上升沿中断暂时不要使用==
//测试工作频率为 11.0592MHz
*/

//#include "stc8h.h"
#include "stc32g.h" //头文件见下载软件
#include "intrins.h"
void main()
{
    EAXFR = 1; //使能访问 XFR
    CKCON = 0x00; //设置外部数据总线速度为最快
    WTST = 0x00; //设置程序代码等待参数,
//赋值为 0 可将 CPU 执行程序的速度设置为最快
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P0IM0 = 0x00; //下降沿中断
    P0IM1 = 0x00;
    P0INTE = 0xff; //使能 P0 口中断
    EA = 1;
    while (1);
}
//由于中断向量大于 31,在 KEIL 中无法直接编译
//必须借用第 13 号中断入口地址
void common_isr() interrupt 13
{
    unsigned char intf;
    intf = P0INTF;
    if (intf)
    {
        P0INTF = 0x00;
        if (intf & 0x01)
        {
//P0.0 口中断
        }
        if (intf & 0x02)
        {
//P0.1 口中断
        }
        if (intf & 0x04)
        {
//P0.2 口中断
        }
        if (intf & 0x08)
        {
//P0.3 口中断
        }
        if (intf & 0x10)
        {
//P0.4 口中断
        }
        if (intf & 0x20)
        {
//P0.5 口中断
        }
        if (intf & 0x40)
        {
//P0.6 口中断
        }
        if (intf & 0x80)
        {
//P0.7 口中断
        }
    }
}

📝P1 口上升沿中断示例代码:

/*
                P1 口上升沿中断
==注:STC32G12K128-Beta 版芯片的普通 I/O 口下降沿中断和上升沿中断暂时不要使用==
//测试工作频率为 11.0592MHz
*/
#include "stc32g.h" //头文件见下载软件
#include "intrins.h"
void main()
{
    EAXFR = 1; //使能访问 XFR
    CKCON = 0x00; //设置外部数据总线速度为最快
    WTST = 0x00; //设置程序代码等待参数,
//赋值为 0 可将 CPU 执行程序的速度设置为最快
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P1IM0 = 0xff; //上升沿中断
    P1IM1 = 0x00;
    P1INTE = 0xff; //使能 P1 口中断
    EA = 1;
    while (1);
}
//由于中断向量大于 31,在 KEIL 中无法直接编译
//必须借用第 13 号中断入口地址
void common_isr() interrupt 13
{
    unsigned char intf;
    intf = P1INTF;
    if (intf)
    {
        P1INTF = 0x00;
        if (intf & 0x01)
        {
//P1.0 口中断
        }
        if (intf & 0x02)
        {
//P1.1 口中断
        }
        if (intf & 0x04)
        {
//P1.2 口中断
        }
        if (intf & 0x08)
        {
//P1.3 口中断
        }
        if (intf & 0x10)
        {
//P1.4 口中断
        }
        if (intf & 0x20)
        {
//P1.5 口中断
        }
        if (intf & 0x40)
        {
//P1.6 口中断
        }
        if (intf & 0x80)
        {
//P1.7 口中断
        }
    }
}

📝P2 口低电平中断示例代码:

/*
     P2 口低电平中断

==注:STC32G12K128-Beta 版芯片的普通 I/O 口下降沿中断和上升沿中断暂时不要使用==
//测试工作频率为 11.0592MHz
*/

#include "stc32g.h" //头文件见下载软件
#include "intrins.h"
void main()
{
    EAXFR = 1; //使能访问 XFR
    CKCON = 0x00; //设置外部数据总线速度为最快
    WTST = 0x00; //设置程序代码等待参数,
    //赋值为 0 可将 CPU 执行程序的速度设置为最快
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P2IM0 = 0x00; //低电平中断
    P2IM1 = 0xff;
    P2INTE = 0xff; //使能 P2 口中断
    EA = 1;
    while (1);
}

//由于中断向量大于 31,在 KEIL 中无法直接编译
//必须借用第 13 号中断入口地址
void common_isr() interrupt 13
{
    unsigned char intf;
    intf = P2INTF;
    if (intf)
    {
        P2INTF = 0x00;
        if (intf & 0x01)
        {
//P2.0 口中断
        }
        if (intf & 0x02)
        {
//P2.1 口中断
        }
        if (intf & 0x04)
        {
//P2.2 口中断
        }
        if (intf & 0x08)
        {
//P0.3 口中断
        }
        if (intf & 0x10)
        {
//P2.4 口中断
        }
        if (intf & 0x20)
        {
//P2.5 口中断
        }
        if (intf & 0x40)
        {
//P2.6 口中断
        }
        if (intf & 0x80)
        {
//P2.7 口中断
        }
    }
}


📝P3 口高电平中断示例代码:

/*
    P3 口高电平中断

==注:STC32G12K128-Beta 版芯片的普通 I/O 口下降沿中断和上升沿中断暂时不要使用==
//测试工作频率为 11.0592MHz
*/
#include "stc32g.h" //头文件见下载软件
#include "intrins.h"
void main()
{
    EAXFR = 1; //使能访问 XFR
    CKCON = 0x00; //设置外部数据总线速度为最快
    WTST = 0x00; //设置程序代码等待参数,
    //赋值为 0 可将 CPU 执行程序的速度设置为最快
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P3IM0 = 0xff; //高电平中断
    P3IM1 = 0xff;
    P3INTE = 0xff; //使能 P3 口中断
    EA = 1;
    while (1);
}
//由于中断向量大于 31,在 KEIL 中无法直接编译
//必须借用第 13 号中断入口地址
void common_isr() interrupt 13
{
    unsigned char intf;
    intf = P3INTF;
    if (intf)
    {
        P3INTF = 0x00;
        if (intf & 0x01)
        {
//P3.0 口中断
        }
        if (intf & 0x02)
        {
//P3.1 口中断
        }
        if (intf & 0x04)
        {
//P3.2 口中断
        }
        if (intf & 0x08)
        {
//P3.3 口中断
        }
        if (intf & 0x10)
        {
//P3.4 口中断
        }
        if (intf & 0x20)
        {
//P3.5 口中断
        }
        if (intf & 0x40)
        {
//P3.6 口中断
        }
        if (intf & 0x80)
        {
//P3.7 口中断
        }
    }
}

📚工程源码

🚩注意根据选择不同的端口,在ISR.ASM文件中修改对应的中断入口地址。

复制这段内容后打开百度网盘手机App,操作更方便哦
链接: https://pan.baidu.com/s/118gpVK1m1OFgwMyP7Xi6bA
提取码: wv2r

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/374288.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis(11)事务秒杀案例

秒杀案例描述 现在有1个秒杀的功能,1个原来价值5000元的手机现在搞活动,降价到1块钱,做秒杀活动。库存就10个,假设有10000人抢购。 目前逻辑是:抢到了商品库存就减1,然后把用户id加入到秒杀成功者清单中 Re…

大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——OutputFormat数据输出

3.6.1OutputFormat接口实现类 OutputFormat是MapReduce输出的基类,所有实现MapReduce输出都实现了OutputFormat接口。下面我们介绍几种常见的OutputFormat实现类。 1、文本输出TextOutputFormat 默认的输出格式是TextOutputFormat,它把每条记录写为文…

【Redis】应用一 : 分布式锁

一、分布式锁 本质就是实现一个线程在 Redis 中占坑, 用完了,再 del 释放坑 问题1: 程序出现异常, 导致 del 指令未被调用 解决1: 设置一个过期时间 问题2:expire 得不到执行,导致死锁 解决…

Tina_Linux量产测试使用指南_new

OpenRemoved_Tina_Linux_量产测试_使用指南_new 1 概述 文档主要描述如何配置tinatest 并搭建量产测试环境。 1.1 编写目的 • 介绍量产配置方法; • 介绍量产测试环境搭建流程; • 介绍如何使用dragonMAT 软件; • 方便开发人员按照说明…

Java内部类(成员,局部,匿名,静态,多重继承)

java内部类内部类的定义成员内部类特点测试代码运行结果静态内部类特点测试代码运行结果匿名内部类特点测试代码运行结果局部内部类特点测试代码内部类的嵌套特点测试代码运行结果内部类的定义 Java 编程语言允许一个类被定义在另一个类中,这样的类就称为嵌套类。嵌…

【第43天】sort 的复杂运用 | 对二维数组与结构体实现自定义排序

本文已收录于专栏🌸《Java入门一百练》🌸学习指引序、专栏前言一、二维排序二、【例题1】1、题目描述2、解题思路3、模板代码4、代码解析三、【例题2】1、题目描述2、解题思路3.模板代码4.代码解析四、推荐专栏五、课后习题序、专栏前言 本专栏开启&…

【ESP 保姆级教程】疯狂毕设篇 —— 案例:基于ESP8266和EMQX的教室灯光控制系统

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-02-26 ❤️❤️ 本篇更新记录 2022-02-26 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…

二、mysql索引分析之二

二、mysql索引分析之一 二、mysql索引分析之二 二、mysql索引分析之二1 mysql的索引类型2 Explain执行计划2.1 执行计划之 id 属性2.1.1 id 的属性相同表示加载表的顺序是从上到下2.1.2 id 值越大,优先级越高2.1.3 id 有相同,也有不同,同时存…

【GO】k8s 管理系统项目22[前端部分–工作负载-Deployment]

k8s 管理系统项目[前端部分–工作负载-Deployment] 1. Deployment页面设计 src/layout/Layout.vue 功能 列表详情新增更新删除重启副本数 Main的布局 2. 连接配置 src/views/common/Config.js export default {//后端接口路径loginAuth: http://localhost:9091/api/login,…

RCEE: Event Extraction as Machine Reading Comprehension 论文解读

RCEE: Event Extraction as Machine Reading Comprehension 论文:Event Extraction as Machine Reading Comprehension (aclanthology.org) 代码:jianliu-ml/EEasMRC (github.com) 期刊/会议:EMNLP 2020 摘要 事件提取(Event extraction,…

Slurm集群调度策略详解(2)-回填调度

1. slurm集群调度系统简介 作业调度系统其实就是指按一定策略把并行程序的各子任务或者是面向多用户的一组作业按一定的选择策略使之与各计算节点的空闲资源相对应,让其在对应的资源上运行,所以作业调度系统是联系上层应用和下层资源的中枢。一个集群资…

纯x86汇编实现的多线程操作系统实践 - 第六章 AP1的用户进程

AP1用户进程的代码为task1.asm。该用户进程将调用0x80系统中断在界面上显示一张BMP格式的图片。用户进程还使用了彩色转灰色技术,轮流显示该图片的彩色和灰色图。代码解释如下:调用0x39号系统中断,从300号扇区获得一个扇区的数据(…

【华为OD机试模拟题】用 C++ 实现 - 身高排序(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明身高排序题目输入输出示例一输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:ht…

每日学术速递2.27

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CL 1.FiTs: Fine-grained Two-stage Training for Knowledge-aware Question Answering 标题:FiTs:用于知识感知问答的细粒度两阶段训练 作者:Qichen…

JavaWeb JavaBean,MVC三层架构

9、JavaBean 实体类 JavaBean有特定的写法: 必须要有一个无参构造属性必须私有化必须有对应的get/set方法; 一般用来和数据库的字段做映射 ORM; ORM :对象关系映射 表—>类字段–>属性行记录---->对象 people表 …

Qt 小项目 图片浏览系统

引言 本系统支持,自动播放,左右拖动切换,点击列表切换,点击按钮切换;是一个标准的图像浏览软件。 Windows 图片浏览器,可以查看当前文件夹下的图片,往上翻、往下翻并且自动播放; …

这只乌龟,当然离不开函数了!

什么是函数?函数就是执行特定任务和以完成特定功能的一段代码为什么需要函数?复用代码隐藏实现细节提高可维护性提高可读性便于调试函数的创建def 函数名 ([输入参数]) :函数体[return xxx]函数名需要遵循字母、数字、下划线# 这里的a,b是形式…

03 流程控制

3.1 条件判断3.2 循环控制3.3 中断循环 3.1 条件判断 if 条件判断 :单分支(if)、双分支(if…else…)、多分支(if … else if … else)Switch(Scala并没有 switch,用的是…

2023年鞋服配饰行业如何玩转全域经营?

2023年,鞋服配饰行业私域已进入深水区,这就对私域运营提出了更高的挑战和目标,企业纷纷发力以私域为基石、以消费者为核心的全域经营。 不过,虽然鞋服配饰行业私域起步早,玩法多。但在迈向全域经营的过程中&#xff0…

全网详细介绍nginx的反向代理、正向代理配置,location的指令说明,反向代理的两个示例代码以及全局块,events块和http快的说明。

文章目录1. 文章引言2. 何谓反向代理3. 解析nginx的配置文件3.1 全局块(global block)3.2 events块(events block)3.3 http块(http block)4. 如何配置反向代理4.1 反向代理示例14.2 反向代理示例25. 补充说明5.1 location指令说明5.2 nginx完整配置文件1. 文章引言 如果你的服务…