STC32通用GPIO中断,库函数配置方式 AI8051U和STC32G已测试没有问题

近来STC的单片机已经出到32位了,并且个人自己打板测试了几个型号,相比之前的51完全不是一个量级,可以通过以下这张图片中的信息来感受一下如今的32位8051单片机的强大,也是很很期待25年的这一新作了!
在这里插入图片描述
配图为AI8052U或叫STC/AI32G144K256 预计今年夏天能用上。

GPIO_INT_LIB.h

#ifndef __GPIO_XINT_H
#define __GPIO_XINT_H
#include "config.h"
//--------------------------------定义变量-----------------------------------
//      7           6          5           4            3           2           1           0     --》
//  10000000    010000000   00100000    00010000    00001000    00000100    00000010    00000001  --》1<<Pin
//    0x80        0x40        0x20        0x10        0x08        0x04        0x02        0x01    --》位 Pin   管脚
#define  P0_ENABLE_IOINT(Pin)	        {P0INTE |= (Pin);}   //1使能
#define  P0_DISENABLE_IOINT(Pin)	    {P0INTE &= ~(Pin);}  //0失能
/*	端口1到7同上方式	*///端口中断优先级设置,这种方式看上去简单,但代码量多,不太建议
#define  PO_INT_Priority(n)	 do{ if(n == 0) PINIPH &= ~(0x01), PINIPL &= ~(0x01); \if(n == 1) PINIPH &= ~(0x01), PINIPL |=  (0x01); \if(n == 2) PINIPH |=  (0x01), PINIPL &= ~(0x01); \if(n == 3) PINIPH |=  (0x01), PINIPL |=  (0x01); \}while(0)
/*---------------*/
#define	PxINT_MODE_Fall		0	//下降沿中断
#define	PxINT_MODE_Rise     1	//上升沿中断
#define	PxINT_MODE_LOW		2	//低电平中断
#define	PxINT_MODE_HIGH     3	//高电平中断
//IO中断用户函数
u8 NVIC_PxINT_Init(u8 GPIO_Px, u8 Priority);
u8 GPIO_INT_InitE(u8 GPIO, GPIO_InitTypeDef *GPIOx);
#endif

接着来编写初始化函数

/************************************************************************************ 函 数 名:u8 GPIO_INT_InitE(u8 GPIO, GPIO_InitTypeDef *GPIOx)* 功    能:初始化GPIO 端口中断,精确到每个IO口,初始化后立即使能,eg: P0INTE  的7个位对应P0.0到P0.7* 参    数:GPIO端口,I/O结构体(管脚和中断模式配置)* 返 回 值:无* 软件版本:V1.0**********************************************************************************/
u8 GPIO_INT_InitE(u8 GPIO_PX, GPIO_InitTypeDef *GPIOx)
{if(GPIO_PX > GPIO_P7)	return FAIL;	                //错误if(GPIOx->Mode > PxINT_MODE_HIGH)	return FAIL;	//错误switch(GPIO_PX){case GPIO_P0:{if(GPIOx->Mode == PxINT_MODE_Fall)		{P0IM1 &= ~(GPIOx->Pin),   P0IM0 &= ~(GPIOx->Pin);}	 //下降沿中断if(GPIOx->Mode == PxINT_MODE_Rise)		{P0IM1 &= ~(GPIOx->Pin),   P0IM0 |=  (GPIOx->Pin);}	 //上升沿中断if(GPIOx->Mode == PxINT_MODE_LOW)		{P0IM1 |=  (GPIOx->Pin),   P0IM0 &= ~(GPIOx->Pin);}	 //低电平中断if(GPIOx->Mode == PxINT_MODE_HIGH)		{P0IM1 |=  (GPIOx->Pin),   P0IM0 |=  (GPIOx->Pin);}	 //高点平中断P0_MODE_IO_PU(GPIOx->Pin); //准双向口 内部若上拉,实际可能需要根据选择的中断方式对应配置I/O模式,这里先放到此处P0_ENABLE_IOINT(GPIOx->Pin)//使能P0.Pin中断}break;/* -------------其他端口------------ */}return SUCCESS;	        //成功
}/************************************************************************************ 函 数 名: NVIC_PxINT_Init* 描    述: PxINT嵌套向量中断控制器初始化.* 参    数: Priority: 中断优先级, Priority_0,Priority_1,Priority_2,Priority_3.* 返    回: 执行结果 SUCCESS/FAIL.* 版    本: V1.0**********************************************************************************/
u8 NVIC_PxINT_Init(u8 GPIO_Px, u8 Priority)
{if(GPIO_Px > GPIO_P7)	return FAIL;if(Priority <= Priority_3){if(Priority_0 == Priority) PINIPH &= ~(0x01<<GPIO_Px), PINIPL &= ~(0x01<<GPIO_Px);if(Priority_1 == Priority) PINIPH &= ~(0x01<<GPIO_Px), PINIPL |=  (0x01<<GPIO_Px);if(Priority_2 == Priority) PINIPH |=  (0x01<<GPIO_Px), PINIPL &= ~(0x01<<GPIO_Px);if(Priority_3 == Priority) PINIPH |=  (0x01<<GPIO_Px), PINIPL |=  (0x01<<GPIO_Px);//        switch(GPIO_Px)  //两种方式都可以,上面的方式代码量小
//        {
//            case GPIO_P0: PO_INT_Priority(Priority); break;/*	-------------------   */
//            default: 
//                break;
//        }}else  return FAIL;return SUCCESS;
}

最后写测试函数,这里我在发这个文章的时候,也就是25年1月31日,去STC官网看了STC32G的手册 ,发现其中关于下降沿和上升沿模式的注意说明如下:
在这里插入图片描述
其中提到,这两个模式暂不要使用,但笔者测试可用,不知道时芯片本版本还是什么原因,我测试使用的就是STC32G12K128不带其他后缀字母的,暂时没有发现有什么问题

/************************************************************************************ 函 数 名:void GPIO_PxINT_Init()* 功    能:IO端口中断,初始化,设置中断IO,以及中断模式、端口优先级等* 参    数:无* 返 回 值:无* 说    明:AI8051U或STC32G支持所有普通I/O可中断,切记需要手动清除中断标志位(详见中断服务函数)**********************************************************************************/
void GPIO_PxINT_Init()
{GPIO_InitTypeDef  GPIO_PxINT_Structure;GPIO_PxINT_Structure.Pin  = GPIO_Pin_0|GPIO_Pin_3;  //要初始化的I/O  eg: GPIO_Pin_0|GPIO_Pin_2;GPIO_PxINT_Structure.Mode = PxINT_MODE_Fall;        //初始化的I/O 模式 下降沿触发中断GPIO_INT_InitE(GPIO_P0,&GPIO_PxINT_Structure);      //初始化管脚中断模式行 并 >使能< 其管脚中断!!!
//    P0_ENABLE_IOINT(Pinx);                              //  使能P0.Pinx管脚 IO中断,失能:P0_DISENABLE_IOINT(Pin)//根据初始化的中断模式选择是否需要开启,内部上下拉电阻P0_PULL_UP_ENABLE(GPIO_Pin_0);                      //使能P0.0 口内部上拉电阻!!!NVIC_PxINT_Init(GPIO_P0,Priority_0);                //中断优先级配置,对象是端口 PO_INT_Priority(Priority_0);
}/************************************************************************************ 函 数 名:void Test_GPIO_PxINT()* 功    能:STC GPIO中断测试函数,中断服务函数中LED0状态,借用13号中断,或添加支持31以上中断号* 参    数:无* 返 回 值:无* 说    明:AI8051U或STC32G支持所有普通I/O可中断,切记需要手动清除中断标志位(详见中断服务函数)**********************************************************************************/
void Test_GPIO_PxINT()
{GPIO_LED_Init();GPIO_PxINT_Init();          //请前往 STC32_GPIO_ISR.C 中对应的中断服务函数中编写中断服务程序Global_IRQ_Enable();//    OLED_CLS();
//    OLED_P6x8Str(10, 0, "Test P00_INT");while(1){;}
}

最后想了像还是把中盾服务函数的实现也放出来吧,虽然你说看下手册很容就能够写出来,但是啊,还是展现出来更为直观。
需要注意的是,STC/AI32的GPIO中断是以端口触发的,想要确定具体是哪个管脚则需要软件查询,以下给出简单的查询方式,亦或者自己再细分处理,建立枚举表,通过端口触发后精确到具体的每个I/O上。

//========================================================================
// 函数: void P0xINT_ISR_Handler
// 描述: GPIO P0端口中断函数
// 参数: none.
// 返回: none.
// 版本: V1.0, 2024-11-18
//      如果if判断,将中断服务函数写在其中,不美观,可单独设立一个函数,来写中断服务内容,在进中断后调用
//========================================================================
void P0INT_ISR_Handler (void) interrupt P0INT_VECTOR		//进中断后手动清除标志位
{u8 P0x_IRQ;P0x_IRQ = P0INTF;       //P0端口中断标志寄存器if(P0x_IRQ){P0INTF = 0x00;      //清除P0端口中断标志位if(P0x_IRQ&GPIO_Pin_0)    /* P0.0中断服务*/{// TODO: 在此处添加用户代码LED_Ctrl(LED0,RVS);}if(P0x_IRQ&GPIO_Pin_3)    /* P0.3中断服务*/{// TODO: 在此处添加用户代码
//            LED_Ctrl(LED1,RVS);}
/*  还可以继续添加其他管脚的中断服务程序  */}
}

完整工程 程序库,后续我会放到个人gitee仓库

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

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

相关文章

Prometheus 中的 Exporter

在 Prometheus 生态系统中,Exporter 扮演着至关重要的角色,它们负责从不同的服务或系统中收集和暴露度量数据。本文将详细介绍 Exporter 的概念、类型以及如何有效使用它们将 Prometheus 集成到各种系统中进行监控。 什么是 Exporter? Exporter 是一段软件,它从应用程序或…

使用Pygame制作“Flappy Bird”游戏

1. 前言 Flappy Bird 是一款“点击上浮、松手下落”的横向卷轴游戏&#xff1a; 场景中持续出现上下成对的管道&#xff0c;玩家需要让小鸟在管道之间穿行&#xff1b;每穿过一对管道记 1 分&#xff1b;若小鸟碰到管道或掉到地面&#xff0c;则游戏结束&#xff1b;一旦上手…

### 2024 江西省赛题解(A,C,D,G,H,J,K,L) BEFI待补

A. 输出 a b c abc abc 即可。 void slove () {int a, b, c;cin >> a >> b >> c;cout << (a b c) << endl; }B. C. 如果 ∑ i 1 n a i S \sum_{i1}^{n}a_iS ∑i1n​ai​S 那么存在所有人说的都是真话的可能。 否则&#xff0c;我们…

java求职学习day23

MySQL 单表 & 约束 & 事务 1. DQL操作单表 1.1 创建数据库,复制表 1) 创建一个新的数据库 db2 CREATE DATABASE db2 CHARACTER SET utf8; 2) 将 db1 数据库中的 emp 表 复制到当前 db2 数据库 1.2 排序 通过 ORDER BY 子句 , 可以将查询出的结果进行排序 ( 排序只…

markdown公式特殊字符

个人学习笔记 根号 在 Markdown 中&#xff0c;要表示根号 3&#xff0c;可以使用 LaTeX 语法来实现。常见的有以下两种方式&#xff1a; 行内公式形式&#xff1a;使用一对美元符号 $ 将内容包裹起来&#xff0c;即 $\sqrt{3}$ &#xff0c;在支持 LaTeX 语法渲染的 Markdow…

git笔记-简单入门

git笔记 git是一个分布式版本控制系统&#xff0c;它的优点有哪些呢&#xff1f;分为以下几个部分 与集中式的版本控制系统比起来&#xff0c;不用担心单点故障问题&#xff0c;只需要互相同步一下进度即可。支持离线编辑&#xff0c;每一个人都有一个完整的版本库。跨平台支持…

系统学习算法: 专题七 递归

递归算法简而言之就是当一个大问题拆分为多个子问题时&#xff0c;如果每个子问题的操作步骤都一样&#xff0c;就可以用递归&#xff0c;其中递归在递的时候要有结束条件&#xff0c;不能一直递下去&#xff0c;结束条件后就归 这里不建议学习递归的时候抠细节&#xff0c;还…

python leetcode 笔记

只为记录一些python相关的特殊写法 无穷大&#xff0c;无穷小&#xff0c;NAN float(inf), float(-inf), float(nan) 判断字符的类型 isdigit(x) isspace(x) 字符串拼接 /.join([a,b,c]) # a/b/c 格式转换&#xff0c;字符转整形 ord(a) # 97 chr(97) # a 进制转…

如何成为一名 Python 全栈工程师攻略

## 从零基础到全栈工程师&#xff1a;Python 学习路线&#xff08;细化版&#xff09; **目标&#xff1a;** 掌握 Python 编程&#xff0c;并能独立开发全栈应用。 **学习路线&#xff1a;** ### 第一阶段&#xff1a;Python 基础 (4-6 周) **目标&#xff1a;** 掌握 Pyt…

Windows系统中Docker可视化工具对比分析,Docker Desktop,Portainer,Rancher

Docker可视化工具对比分析&#xff0c;Docker Desktop&#xff0c;Portainer&#xff0c;Rancher Windows系统中Docker可视化工具对比分析1. 工具概览2. Docker Desktop官网链接&#xff1a;主要优点&#xff1a;主要缺点&#xff1a;版本更新频率&#xff1a; 3. Portainer官网…

C++中常用的十大排序方法之1——冒泡排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之——冒泡排序的相关…

远程连接-简化登录

vscode通过ssh连接远程服务器免密登录&#xff08;图文&#xff09;_vscode ssh-CSDN博客

OpenEuler学习笔记(十五):在OpenEuler上搭建Java运行环境

一、在OpenEuler上搭建Java运行环境 在OpenEuler上搭建Java运行环境可以通过以下几种常见方式&#xff0c;下面分别介绍基于包管理器安装OpenJDK和手动安装Oracle JDK的步骤。 使用包管理器安装OpenJDK OpenJDK是Java开发工具包的开源实现&#xff0c;在OpenEuler上可以方便…

[Java]继承

1. 什么是继承&#xff1f; 继承是面向对象编程的一种机制&#xff0c;允许一个类&#xff08;叫做子类&#xff09;继承另一个类&#xff08;叫做父类&#xff09;的属性和方法。也就是说&#xff0c;子类可以“继承”父类的行为&#xff08;方法&#xff09;和状态&#xff…

双指针c++

双指针&#xff08;Two Pointers&#xff09;是一种常用的算法技巧&#xff0c;通常用于解决数组或链表中的问题&#xff0c;如滑动窗口、区间合并、有序数组的两数之和等。双指针的核心思想是通过两个指针的移动来优化时间复杂度&#xff0c;通常可以将 (O(n^2)) 的暴力解法优…

第05章 16 Implicit Function应用举例

Implicit Function在VTK中有多种广泛的应用场合&#xff0c;以下是一些主要的应用场景及其详细说明&#xff1a; 1. 几何裁剪&#xff08;Clipping&#xff09; Implicit Function可以用于对几何体进行裁剪&#xff0c;生成新的几何形状。裁剪操作通常基于一个Implicit Funct…

【二叉搜索树】

二叉搜索树 一、认识二叉搜索树二、二叉搜索树实现2.1插入2.2查找2.3删除 总结 一、认识二叉搜索树 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;是一种特殊的二叉树&#xff0c;它具有以下特征&#xff1a; 若它的左子树不为空&#xff0c;则…

洛谷P3372 【模板】线段树 1以及分块

【模板】线段树 1 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某区间每一个数加上 k k k。求出某区间每一个数的和。 输入格式 第一行包含两个整数 n , m n, m n,m&#xff0c;分别表示该数列数字的个数和操作的总个数。 …

Linux运维之Linux的安装和配置

目录 Linux的基本概念&#xff1a; 1.为什么要使用Linux&#xff1f; 2.什么是Linux&#xff1f; Linux的安装和配置&#xff1a; 1.下载Linux的虚拟机和镜像文件&#xff1a; 1.1下载虚拟机 1.2下载镜像文件 2.在虚拟机或者物理机中安装Linux操作系统 3.配置虚拟机的…

Google 和 Meta 携手 FHE 应对隐私挑战

1. 引言 为什么世界上最大的广告商&#xff0c;如谷歌和 Meta 这样的超大规模公司都选择全同态加密 (FHE)。 2. 定向广告 谷歌和 Meta 是搜索引擎和社交网络领域的两大巨头&#xff0c;它们本质上从事的是同一业务——广告。它们最近公布的年度广告收入数据显示&#xff0c;…